summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-11-25 23:14:38 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-11-25 23:14:38 +0900
commit71f9add1c5a655d6265147be0546d9770ed0f629 (patch)
tree48afcccf67afb4ea8243571dd1a5b36654acfb14
parentfba7874a680ef686ae1d3915dbadbe7a3a26b8b7 (diff)
downloadmruby-71f9add1c5a655d6265147be0546d9770ed0f629.tar.gz
mruby-71f9add1c5a655d6265147be0546d9770ed0f629.zip
Move inline `iseq` in `array.c` to `array.rb`.
There's no efficiency difference since `cdump` is implemented.
-rw-r--r--mrblib/array.rb20
-rw-r--r--src/array.c63
2 files changed, 10 insertions, 73 deletions
diff --git a/mrblib/array.rb b/mrblib/array.rb
index e248914e8..6708027ab 100644
--- a/mrblib/array.rb
+++ b/mrblib/array.rb
@@ -10,16 +10,16 @@ class Array
# and pass the respective element.
#
# ISO 15.2.12.5.10
- # def each(&block)
- # return to_enum :each unless block
- #
- # idx = 0
- # while idx < length
- # block.call(self[idx])
- # idx += 1
- # end
- # self
- # end
+ def each(&block)
+ return to_enum :each unless block
+
+ idx = 0
+ while idx < length
+ block.call(self[idx])
+ idx += 1
+ end
+ self
+ end
##
# Calls the given block for each element of +self+
diff --git a/src/array.c b/src/array.c
index 4125e876e..ca00b6f3e 100644
--- a/src/array.c
+++ b/src/array.c
@@ -1288,67 +1288,6 @@ mrb_ary_svalue(mrb_state *mrb, mrb_value ary)
}
}
-static const mrb_code each_iseq[] = {
- OP_ENTER, 0x0, 0x00, 0x1, /* OP_ENTER 0:0:0:0:0:0:1 */
- OP_JMPIF, 0x1, 0x0, 19, /* OP_JMPIF R1 19 */
- OP_LOADSELF, 0x3, /* OP_LOADSELF R3 */
- OP_LOADSYM, 0x4, 0x0, /* OP_LOADSYM R4 :each*/
- OP_SEND, 0x3, 0x1, 0x1, /* OP_SEND R3 :to_enum 1 */
- OP_RETURN, 0x3, /* OP_RETURN R3 */
- OP_LOADI_0, 0x2, /* OP_LOADI_0 R2 */
- OP_JMP, 0x0, 43, /* OP_JMP 49 */
- OP_MOVE, 0x3, 0x1, /* OP_MOVE R3 R1 */
- OP_LOADSELF, 0x4, /* OP_LOADSELF R4 */
- OP_MOVE, 0x5, 0x2, /* OP_MOVE R5 R2 */
- OP_SEND, 0x4, 0x2, 0x1, /* OP_SEND R4 :[] 1 */
- OP_SEND, 0x3, 0x3, 0x1, /* OP_SEND R3 :call 1 */
- OP_ADDI, 0x2, 1, /* OP_ADDI R3 1 */
- OP_MOVE, 0x3, 0x2, /* OP_MOVE R3 R2 */
- OP_LOADSELF, 0x4, /* OP_LOADSELF R4 */
- OP_SEND, 0x4, 0x4, 0x0, /* OP_SEND R4 :length 0 */
- OP_LT, 0x3, /* OP_LT R3 */
- OP_JMPIF, 0x3, 0x0, 24, /* OP_JMPIF R3 24 */
- OP_RETURN, 0x0 /* OP_RETURN R3 */
-};
-
-static const mrb_sym each_syms[] = {
- MRB_SYM(each),
- MRB_SYM(to_enum),
- MRB_OPSYM(aref),
- MRB_SYM(call),
- MRB_SYM(length),
-};
-
-static const mrb_irep each_irep = {
- 3, /* nlocals */
- 7, /* nregs */
- 0, /* clen */
- MRB_ISEQ_NO_FREE | MRB_IREP_NO_FREE, /* flags */
- each_iseq, /* iseq */
- NULL, /* pool */
- each_syms, /* syms */
- NULL, /* reps */
- NULL, /* lv */
- NULL, /* debug_info */
- sizeof(each_iseq), /* ilen */
- 0, /* plen */
- sizeof(each_syms), /* slen */
- 1, /* rlen */
- 0, /* refcnt */
-};
-
-static void
-init_ary_each(mrb_state *mrb, struct RClass *ary)
-{
- struct RProc *p;
- mrb_method_t m;
-
- p = mrb_proc_new(mrb, &each_irep);
- p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT;
- MRB_METHOD_FROM_PROC(m, p);
- mrb_define_method_raw(mrb, ary, MRB_SYM(each), m);
-}
-
void
mrb_init_array(mrb_state *mrb)
{
@@ -1389,6 +1328,4 @@ mrb_init_array(mrb_state *mrb)
mrb_define_method(mrb, a, "__ary_cmp", mrb_ary_cmp, MRB_ARGS_REQ(1));
mrb_define_method(mrb, a, "__ary_index", mrb_ary_index_m, MRB_ARGS_REQ(1)); /* kept for mruby-array-ext */
mrb_define_method(mrb, a, "__svalue", mrb_ary_svalue, MRB_ARGS_NONE());
-
- init_ary_each(mrb, a);
}