From 564372d7b920049d5bcd0c120a3689402915fb7b Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 29 Aug 2020 18:42:48 +0900 Subject: Fix `mrb_obj_ceqq` to avoid array copying. --- src/kernel.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') 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