From 0ab7ef872bce0e44ea3f475823bc727220d68d5b Mon Sep 17 00:00:00 2001 From: zongor Date: Sat, 4 Jul 2026 12:42:19 -0700 Subject: [PATCH] bugfixes for array handling, add statement formatting --- compiler.c | 27 +++++++++++++++++++-------- emit/uxn/emit.c | 3 +++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/compiler.c b/compiler.c index b9dab30..5fffe1c 100644 --- a/compiler.c +++ b/compiler.c @@ -649,20 +649,25 @@ variable(void) if (match(TOKEN_LBRACKET)) { emitter->emit_deref_prolog(arena, code, sym); expression(); - emitter->emit_address(arena, code, size); - emitter->emit_mul(arena, code, size); - emitter->emit_add(arena, code, size); + emitter->emit_address(arena, code, 2); + emitter->emit_mul(arena, code, 2); + emitter->emit_add(arena, code, 2); /* add offset of "length"*/ emitter->emit_nat(arena, code, "2", 1); - emitter->emit_add(arena, code, size); + emitter->emit_add(arena, code, 2); while (!match(TOKEN_RBRACKET)) { /* eventually do something with multidimensional arrays */ } if (match(TOKEN_EQ)) { - expression(); - emitter->emit_stack_swap(arena, code, size); + expression(); + if (size == 1) { + emitter->emit_stack_rot(arena, code, 1); + emitter->emit_stack_rot(arena, code, 1); + } else { + emitter->emit_stack_swap(arena, code, 2); + } emitter->emit_ref_store(arena, code, size); } else { emitter->emit_deref(arena, code, size); @@ -972,6 +977,12 @@ write(void) emitter->emit_write(arena, code); } +void +semicolon(void) +{ + emitter->emit_end_statement(arena, code); +} + ParseRule rules[] = { /* TOKEN_ERROR */ {nil, nil, PREC_NONE}, /* TOKEN_EOF */ {nil, nil, PREC_NONE}, @@ -1049,7 +1060,7 @@ ParseRule rules[] = { /* TOKEN_COMMA */ {nil, nil, PREC_NONE}, /* TOKEN_COLON */ {nil, nil, PREC_NONE}, /* TOKEN_CARET */ {nil, nil, PREC_NONE}, - /* TOKEN_SEMICOLON */ {nil, nil, PREC_NONE}, + /* TOKEN_SEMICOLON */ {semicolon, nil, PREC_NONE}, /* TOKEN_ARROW_RIGHT */ {nil, nil, PREC_NONE}, /* TOKEN_SLL */ {nil, binary, PREC_NONE}, /* TOKEN_SRL */ {nil, binary, PREC_NONE}, @@ -1096,7 +1107,7 @@ emit_program(char *source) while(!match(TOKEN_EOF)) declaration(); - emitter->epilogue(arena, code); + /*emitter->epilogue(arena, code);*/ } bool diff --git a/emit/uxn/emit.c b/emit/uxn/emit.c index 8a7ccfc..c5e52c3 100644 --- a/emit/uxn/emit.c +++ b/emit/uxn/emit.c @@ -1451,6 +1451,9 @@ uxn_emit_address(Arena *a, List *out, u32 ptr) void uxn_emit_zero_block(Arena *a, List *out, u32 ptr) { + sprintf(uxn_temp_strbuf, "%04x ", ptr); + StrBuf_append(a, out, uxn_temp_strbuf); + sprintf(uxn_temp_strbuf, "$%d ", ptr); StrBuf_append(a, out, uxn_temp_strbuf); }