fix return statement

This commit is contained in:
zongor 2026-05-21 23:36:20 -07:00
parent a4a695f84a
commit 28598e354a
5 changed files with 32 additions and 12 deletions

View File

@ -631,6 +631,18 @@ void call() {
return;
}
void
return_statement()
{
if (match(TOKEN_SEMICOLON)) {
emitter.emit_early_return();
} else {
expression();
consume(TOKEN_SEMICOLON);
emitter.emit_early_return();
}
}
void
statement()
{
@ -641,6 +653,8 @@ statement()
} else if(match(TOKEN_KEYWORD_FN)) {
advance();
function();
} else if(match(TOKEN_KEYWORD_RETURN)) {
return_statement();
} else if(match(TOKEN_KEYWORD_IF)) {
if_statement();
} else if(match(TOKEN_KEYWORD_WHILE)) {

1
emit.h
View File

@ -99,6 +99,7 @@ struct emitter_s {
I32ArgEmit emit_while;
VoidArgEmit emit_while_postfix;
I32ArgEmit emit_patch_while;
VoidArgEmit emit_early_return;
};
Emitter rer_emitter();

View File

@ -670,5 +670,6 @@ rer_emitter()
rer_emit_while,
rer_emit_while_postfix,
rer_emit_patch_while,
rer_emit_arena_fn_return,
};
}

View File

@ -777,6 +777,12 @@ uxn_emit_patch_while(i32 local_whiles)
printf("!&while.%d } \n", local_whiles);
}
void
uxn_emit_early_return()
{
printf("!&return ");
}
Emitter
uxn_emitter()
{
@ -865,5 +871,6 @@ uxn_emitter()
uxn_emit_while,
uxn_emit_while_postfix,
uxn_emit_patch_while,
uxn_emit_early_return,
};
}

View File

@ -1,23 +1,20 @@
|100
LIT2r 0000 main POP2r BRK
LIT2r 0000 main_ POP2r BRK
@main ( -- )
#0017 fib nat_to_str_ str/<println>
@main_ ( -- )
#0017 fib_ nat_to_str_ str/<print>
&return
POP2r JMP2r
@fib ( n -- n )
OVR2r LIT2r 0002 SUB2r STH2kr STA2
@fib_ ( n -- res )
OVR2r LIT2r 0002 SUB2r
STH2kr STA2
STH2kr LDA2 #0002 LTH2 #03 JCN !{ STH2kr LDA2 !&return !&if_end.0 }
&if_end.0
STH2kr LDA2 #0002 LTH2 #03 JCN !{
STH2kr LDA2 !&return !&if_end.0 } &if_end.0
STH2kr LDA2 #0002 SUB2 fib
STH2kr LDA2 #0001 SUB2 fib
ADD2
&return
STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 &return
POP2r JMP2r
@sext