From 8abe0ab545cf7d3e686d3c797b17abed6e796759 Mon Sep 17 00:00:00 2001 From: zongor Date: Tue, 7 Jul 2026 00:19:32 -0700 Subject: [PATCH] fix deref error --- compiler.c | 13 ++++-- test/string.ul | 3 +- test/tal/fib.tal | 19 +++++---- test/tal/string.tal | 97 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 test/tal/string.tal diff --git a/compiler.c b/compiler.c index a4305e5..f1dd819 100644 --- a/compiler.c +++ b/compiler.c @@ -598,6 +598,8 @@ variable(void) emitter->emit_deref_prolog(arena, code, sym); if(match(TOKEN_LBRACKET)) { + if (sym->scope) + emitter->emit_deref(arena, code, 2); /* add offset of "length"*/ emitter->emit_nat(arena, code, "2", 1); emitter->emit_add(arena, code, 2); @@ -619,6 +621,8 @@ variable(void) parser->current_type = SYMBOL_BYTE; } else if(match(TOKEN_DOT)) { if(sleq("length", parser->current.start, parser->current.length)) { + if (sym->scope) + emitter->emit_deref(arena, code, 2); emitter->emit_deref(arena, code, 2); } else { emitter->error("arrays currently can only get their length, don't do " @@ -628,9 +632,8 @@ variable(void) parser->current_type = SYMBOL_NAT; advance(); } else { - emitter->emit_nat(arena, code, "2", 1); - emitter->emit_add(arena, code, 2); - /* emitter->emit_deref(arena, code); */ + if (sym->scope) + emitter->emit_deref(arena, code, 2); } return; @@ -803,6 +806,10 @@ void print_statement(void) { expression(); + if (parser->current_type == SYMBOL_STR) { + emitter->emit_nat(arena, code, "2", 1); + emitter->emit_add(arena, code, 2); + } consume(TOKEN_SEMICOLON); emitter->emit_print(arena, code); emitter->emit_end_statement(arena, code); diff --git a/test/string.ul b/test/string.ul index cd8ab52..95f20e3 100755 --- a/test/string.ul +++ b/test/string.ul @@ -2,12 +2,11 @@ str hello = "hello World!"; str msg = " damage inflicted!"; if (msg[1] == 'd') { - pln("yes"); + print("yes"); } pln(msg.length as str); pln(msg); - hello[0] = hello[0] - ' '; pln(hello); halt; diff --git a/test/tal/fib.tal b/test/tal/fib.tal index 1998158..945bad3 100644 --- a/test/tal/fib.tal +++ b/test/tal/fib.tal @@ -1,12 +1,8 @@ |100 - LIT2r 0000 main_ POP2r BRK - -@main_ ( -- ) + LIT2r 0000 #0017 fib_ nat_to_str_ str/ - &return - POP2r JMP2r - +POP2r BRK @fib_ ( n -- res ) OVR2r LIT2r 0002 SUB2r STH2kr STA2 @@ -29,6 +25,13 @@ &return POP2r JMP2r +@afree_ ( -- result* ) + OVR2r #0000 ;mem_length_ STA2 + #0000 + + &return + POP2r JMP2r + @amcpy_ ( length* from* -- result* ) OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 STH2kr #0004 ADD2 STA2 @@ -72,11 +75,11 @@ &return POP2r JMP2r - + @str/ ( str* -- ) LDAk DUP ?{ POP POP2 JMP2r } #18 DEO INC2 !/ @mem_length_ #0000 -@mem_ +@mem_ \ No newline at end of file diff --git a/test/tal/string.tal b/test/tal/string.tal new file mode 100644 index 0000000..b3329d0 --- /dev/null +++ b/test/tal/string.tal @@ -0,0 +1,97 @@ +|100 + LIT2r 0000 + +;msg #0002 ADD2 #0001 ADD2 LDA #64 EQU #03 JCN !{ +;{ #0002 ADD2 } !{ 79 65 73 00 } str/ +!&if_end.0 } &if_end.0 +;msg LDA2 nat_to_str_ pln_ +;msg pln_ +;hello #0002 ADD2 #0000 ADD2 ;hello #0002 ADD2 #0000 ADD2 LDA #20 SUB ROT ROT STA +;hello pln_ +POP2r BRK +@pln_ ( string -- ) + OVR2r LIT2r 0004 SUB2r + STH2kr STA2 + + STH2kr #0002 ADD2 LDA2 +#0000 STH2kr #0002 ADD2 STA2 + +&while.0 STH2kr #0002 ADD2 LDA2 STH2kr LDA2 LDA2 LTH2 #03 JCN !{ + STH2kr LDA2 #0002 ADD2 STH2kr #0002 ADD2 LDA2 ADD2 LDA #18 DEO + STH2kr #0002 ADD2 LDA2 #0001 ADD2 STH2kr #0002 ADD2 STA2 +!&while.0 } +#0a #18 DEO + &return + POP2r JMP2r + +@sext + #80 ANDk EQU #ff MUL SWP JMP2r + +@aalloc_ ( size* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + ;mem_length_ LDA2 STH2kr STA2 + ;mem_length_ LDA2k STH2kr INC2 INC2 LDA2 ADD2 SWP2 STA2 + ;mem_ STH2kr LDA2 ADD2 !&return + #0000 + + &return + POP2r JMP2r + +@afree_ ( -- result* ) + OVR2r #0000 ;mem_length_ STA2 + #0000 + + &return + POP2r JMP2r + +@amcpy_ ( length* from* -- result* ) + OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 + STH2kr #0004 ADD2 STA2 + STH2kr #0004 ADD2 LDA2 aalloc_ + STH2kr INC2 INC2 STA2 + #0000 STH2kr STA2 + + &begin.1 + STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA + POP + + &continue.1 + STH2kr LDA2k INC2k ROT2 STA2 + POP2 !&begin.1 + + &break.1 + STH2kr INC2 INC2 LDA2 !&return + #0000 + + &return + POP2r JMP2r + +@nat_to_str_ ( n* -- result* ) + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + #0005 STH2kr STA2 + + &begin.1 + STH2kr #0008 ADD2 LDA2 #000a OVR2 OVR2 DIV2 MUL2 SUB2 #0030 ADD2 STH2kr INC2 INC2 STH2kr LDA2k #0001 SUB2 SWP2 STA2k + POP2 ADD2 STA + POP STH2kr #0008 ADD2 LDA2k #000a DIV2 SWP2 STA2 + + &continue.1 + #0000 STH2kr #0008 ADD2 LDA2 LTH2 ?&begin.1 + + &break.1 + #0005 STH2kr LDA2 SUB2 STH2kr INC2 INC2 STH2kr LDA2 ADD2 amcpy_ + !&return + #0000 + + &return + POP2r JMP2r + +@str/ ( str* -- ) + LDAk DUP ?{ POP POP2 JMP2r } + #18 DEO + INC2 !/ + +@mem_length_ #0022 +@mem_ @hello 000c 68 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 @msg 0012 20 64 61 6d 61 67 65 20 69 6e 66 6c 69 63 74 65 64 21 00 \ No newline at end of file