summaryrefslogtreecommitdiff
path: root/com.c
diff options
context:
space:
mode:
Diffstat (limited to 'com.c')
-rw-r--r--com.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/com.c b/com.c
index ca18c36..862d26f 100644
--- a/com.c
+++ b/com.c
@@ -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);