fix deref error

This commit is contained in:
zongor 2026-07-07 00:19:32 -07:00
parent b22db9cfd5
commit 8abe0ab545
4 changed files with 119 additions and 13 deletions

View File

@ -598,6 +598,8 @@ variable(void)
emitter->emit_deref_prolog(arena, code, sym); emitter->emit_deref_prolog(arena, code, sym);
if(match(TOKEN_LBRACKET)) { if(match(TOKEN_LBRACKET)) {
if (sym->scope)
emitter->emit_deref(arena, code, 2);
/* add offset of "length"*/ /* add offset of "length"*/
emitter->emit_nat(arena, code, "2", 1); emitter->emit_nat(arena, code, "2", 1);
emitter->emit_add(arena, code, 2); emitter->emit_add(arena, code, 2);
@ -619,6 +621,8 @@ variable(void)
parser->current_type = SYMBOL_BYTE; parser->current_type = SYMBOL_BYTE;
} else if(match(TOKEN_DOT)) { } else if(match(TOKEN_DOT)) {
if(sleq("length", parser->current.start, parser->current.length)) { if(sleq("length", parser->current.start, parser->current.length)) {
if (sym->scope)
emitter->emit_deref(arena, code, 2);
emitter->emit_deref(arena, code, 2); emitter->emit_deref(arena, code, 2);
} else { } else {
emitter->error("arrays currently can only get their length, don't do " emitter->error("arrays currently can only get their length, don't do "
@ -628,9 +632,8 @@ variable(void)
parser->current_type = SYMBOL_NAT; parser->current_type = SYMBOL_NAT;
advance(); advance();
} else { } else {
emitter->emit_nat(arena, code, "2", 1); if (sym->scope)
emitter->emit_add(arena, code, 2); emitter->emit_deref(arena, code, 2);
/* emitter->emit_deref(arena, code); */
} }
return; return;
@ -803,6 +806,10 @@ void
print_statement(void) print_statement(void)
{ {
expression(); expression();
if (parser->current_type == SYMBOL_STR) {
emitter->emit_nat(arena, code, "2", 1);
emitter->emit_add(arena, code, 2);
}
consume(TOKEN_SEMICOLON); consume(TOKEN_SEMICOLON);
emitter->emit_print(arena, code); emitter->emit_print(arena, code);
emitter->emit_end_statement(arena, code); emitter->emit_end_statement(arena, code);

View File

@ -2,12 +2,11 @@ str hello = "hello World!";
str msg = " damage inflicted!"; str msg = " damage inflicted!";
if (msg[1] == 'd') { if (msg[1] == 'd') {
pln("yes"); print("yes");
} }
pln(msg.length as str); pln(msg.length as str);
pln(msg); pln(msg);
hello[0] = hello[0] - ' '; hello[0] = hello[0] - ' ';
pln(hello); pln(hello);
halt; halt;

View File

@ -1,12 +1,8 @@
|100 |100
LIT2r 0000 main_ POP2r BRK LIT2r 0000
@main_ ( -- )
#0017 fib_ nat_to_str_ str/<print> #0017 fib_ nat_to_str_ str/<print>
&return POP2r BRK
POP2r JMP2r
@fib_ ( n -- res ) @fib_ ( n -- res )
OVR2r LIT2r 0002 SUB2r OVR2r LIT2r 0002 SUB2r
STH2kr STA2 STH2kr STA2
@ -29,6 +25,13 @@
&return &return
POP2r JMP2r POP2r JMP2r
@afree_ ( -- result* )
OVR2r #0000 ;mem_length_ STA2
#0000
&return
POP2r JMP2r
@amcpy_ ( length* from* -- result* ) @amcpy_ ( length* from* -- result* )
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
STH2kr #0004 ADD2 STA2 STH2kr #0004 ADD2 STA2
@ -72,11 +75,11 @@
&return &return
POP2r JMP2r POP2r JMP2r
@str/<print> ( str* -- ) @str/<print> ( str* -- )
LDAk DUP ?{ POP POP2 JMP2r } LDAk DUP ?{ POP POP2 JMP2r }
#18 DEO #18 DEO
INC2 !/<print> INC2 !/<print>
@mem_length_ #0000 @mem_length_ #0000
@mem_ @mem_

97
test/tal/string.tal Normal file
View File

@ -0,0 +1,97 @@
|100
LIT2r 0000
;msg #0002 ADD2 #0001 ADD2 LDA #64 EQU #03 JCN !{
;{ #0002 ADD2 } !{ 79 65 73 00 } str/<print>
!&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/<print> ( str* -- )
LDAk DUP ?{ POP POP2 JMP2r }
#18 DEO
INC2 !/<print>
@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