From 41989a2ad51b15bf512b81f2c147070ba8a28ef8 Mon Sep 17 00:00:00 2001 From: ubq323 Date: Sat, 17 Aug 2024 19:14:47 +0100 Subject: each returns array of loop values --- com.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'com.c') 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); -- cgit v1.2.3