diff options
Diffstat (limited to 'com.c')
-rw-r--r-- | com.c | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -399,6 +399,9 @@ static void each_form(Compiler *C, ObjArr *a, Op _, int flags) { cpl_op(C, OP_ARRLEN); uint8_t mslot = declare_local(C, "__max__"); + cpl_op(C, OP_ARRNEW); + uint8_t oslot = declare_local(C, "__out__"); + cpl_op(C, OP_NIL); uint8_t vslot = declare_local(C, ivar); @@ -412,7 +415,10 @@ static void each_form(Compiler *C, ObjArr *a, Op _, int flags) { // getlocal idx // call 2 // setlocal ivar + // getlocal out // body ... + // arrappend + // drop // incr idx // redo -> A // B: @@ -436,7 +442,11 @@ static void each_form(Compiler *C, ObjArr *a, Op _, int flags) { cpl_byte(C, vslot); cpl_op(C, OP_DROP); + cpl_op(C, OP_GETLOCAL); + cpl_byte(C, oslot); + cpl_body(C, a, 2, flags & ~F_tail); + cpl_op(C, OP_ARRAPPEND); cpl_op(C, OP_DROP); cpl_op(C, OP_GETLOCAL); @@ -451,7 +461,8 @@ static void each_form(Compiler *C, ObjArr *a, Op _, int flags) { size_t ph_A = placeholder(C); size_t dest_B = BYTECODE(C).len; - cpl_op(C, OP_NIL); + cpl_op(C, OP_GETLOCAL); + cpl_byte(C, oslot); patch(C, ph_A, ph_A - dest_A + 2); patch(C, ph_B, dest_B - ph_B - 2); |