summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-08-29 18:42:48 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-08-29 18:43:47 +0900
commit564372d7b920049d5bcd0c120a3689402915fb7b (patch)
tree549aa7627295a7191585957f90165cbede9b6410 /src/kernel.c
parenta66d86cfc15771bd62a045572970c567f7e78637 (diff)
downloadmruby-564372d7b920049d5bcd0c120a3689402915fb7b.tar.gz
mruby-564372d7b920049d5bcd0c120a3689402915fb7b.zip
Fix `mrb_obj_ceqq` to avoid array copying.
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/kernel.c b/src/kernel.c
index 682feb13c..34f9fd9ef 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -767,8 +767,19 @@ mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
mrb_value v = mrb_get_arg1(mrb);
mrb_int i, len;
mrb_sym eqq = mrb_intern_lit(mrb, "===");
- mrb_value ary = mrb_ary_splat(mrb, self);
+ mrb_value ary;
+ if (mrb_array_p(self)) {
+ ary = self;
+ }
+ else if (!mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
+ mrb_value c = mrb_funcall_argv(mrb, self, eqq, 1, &v);
+ if (mrb_test(c)) return mrb_true_value();
+ return mrb_false_value();
+ }
+ else {
+ ary = mrb_ary_splat(mrb, self);
+ }
len = RARRAY_LEN(ary);
for (i=0; i<len; i++) {
mrb_value c = mrb_funcall_argv(mrb, mrb_ary_entry(ary, i), eqq, 1, &v);