From 28598e354a95eb9f8707c12bd2edc2a8533f19e1 Mon Sep 17 00:00:00 2001 From: zongor Date: Thu, 21 May 2026 23:36:20 -0700 Subject: [PATCH] fix return statement --- compiler.c | 14 ++++++++++++++ emit.h | 1 + emit/rer/emit.c | 1 + emit/uxn/emit.c | 7 +++++++ test/fib-hardcoded.tal | 21 +++++++++------------ 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/compiler.c b/compiler.c index cec394b..7b5fff4 100644 --- a/compiler.c +++ b/compiler.c @@ -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)) { diff --git a/emit.h b/emit.h index 8f42889..3d8f0a5 100644 --- a/emit.h +++ b/emit.h @@ -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(); diff --git a/emit/rer/emit.c b/emit/rer/emit.c index 3432b7c..4c86b7c 100644 --- a/emit/rer/emit.c +++ b/emit/rer/emit.c @@ -670,5 +670,6 @@ rer_emitter() rer_emit_while, rer_emit_while_postfix, rer_emit_patch_while, + rer_emit_arena_fn_return, }; } diff --git a/emit/uxn/emit.c b/emit/uxn/emit.c index 9325b06..593354d 100644 --- a/emit/uxn/emit.c +++ b/emit/uxn/emit.c @@ -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, }; } diff --git a/test/fib-hardcoded.tal b/test/fib-hardcoded.tal index 909eb73..070e530 100644 --- a/test/fib-hardcoded.tal +++ b/test/fib-hardcoded.tal @@ -1,23 +1,20 @@ |100 - LIT2r 0000 main POP2r BRK + LIT2r 0000 main_ POP2r BRK -@main ( -- ) - #0017 fib nat_to_str_ str/ +@main_ ( -- ) + #0017 fib_ nat_to_str_ str/ &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