fix return statement
This commit is contained in:
parent
a4a695f84a
commit
28598e354a
14
compiler.c
14
compiler.c
|
|
@ -631,6 +631,18 @@ void call() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
return_statement()
|
||||||
|
{
|
||||||
|
if (match(TOKEN_SEMICOLON)) {
|
||||||
|
emitter.emit_early_return();
|
||||||
|
} else {
|
||||||
|
expression();
|
||||||
|
consume(TOKEN_SEMICOLON);
|
||||||
|
emitter.emit_early_return();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
statement()
|
statement()
|
||||||
{
|
{
|
||||||
|
|
@ -641,6 +653,8 @@ statement()
|
||||||
} else if(match(TOKEN_KEYWORD_FN)) {
|
} else if(match(TOKEN_KEYWORD_FN)) {
|
||||||
advance();
|
advance();
|
||||||
function();
|
function();
|
||||||
|
} else if(match(TOKEN_KEYWORD_RETURN)) {
|
||||||
|
return_statement();
|
||||||
} else if(match(TOKEN_KEYWORD_IF)) {
|
} else if(match(TOKEN_KEYWORD_IF)) {
|
||||||
if_statement();
|
if_statement();
|
||||||
} else if(match(TOKEN_KEYWORD_WHILE)) {
|
} else if(match(TOKEN_KEYWORD_WHILE)) {
|
||||||
|
|
|
||||||
1
emit.h
1
emit.h
|
|
@ -99,6 +99,7 @@ struct emitter_s {
|
||||||
I32ArgEmit emit_while;
|
I32ArgEmit emit_while;
|
||||||
VoidArgEmit emit_while_postfix;
|
VoidArgEmit emit_while_postfix;
|
||||||
I32ArgEmit emit_patch_while;
|
I32ArgEmit emit_patch_while;
|
||||||
|
VoidArgEmit emit_early_return;
|
||||||
};
|
};
|
||||||
|
|
||||||
Emitter rer_emitter();
|
Emitter rer_emitter();
|
||||||
|
|
|
||||||
|
|
@ -670,5 +670,6 @@ rer_emitter()
|
||||||
rer_emit_while,
|
rer_emit_while,
|
||||||
rer_emit_while_postfix,
|
rer_emit_while_postfix,
|
||||||
rer_emit_patch_while,
|
rer_emit_patch_while,
|
||||||
|
rer_emit_arena_fn_return,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -777,6 +777,12 @@ uxn_emit_patch_while(i32 local_whiles)
|
||||||
printf("!&while.%d } \n", local_whiles);
|
printf("!&while.%d } \n", local_whiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uxn_emit_early_return()
|
||||||
|
{
|
||||||
|
printf("!&return ");
|
||||||
|
}
|
||||||
|
|
||||||
Emitter
|
Emitter
|
||||||
uxn_emitter()
|
uxn_emitter()
|
||||||
{
|
{
|
||||||
|
|
@ -865,5 +871,6 @@ uxn_emitter()
|
||||||
uxn_emit_while,
|
uxn_emit_while,
|
||||||
uxn_emit_while_postfix,
|
uxn_emit_while_postfix,
|
||||||
uxn_emit_patch_while,
|
uxn_emit_patch_while,
|
||||||
|
uxn_emit_early_return,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,20 @@
|
||||||
|100
|
|100
|
||||||
LIT2r 0000 main POP2r BRK
|
LIT2r 0000 main_ POP2r BRK
|
||||||
|
|
||||||
@main ( -- )
|
@main_ ( -- )
|
||||||
#0017 fib nat_to_str_ str/<println>
|
|
||||||
|
|
||||||
|
#0017 fib_ nat_to_str_ str/<print>
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
@fib ( n -- n )
|
@fib_ ( n -- res )
|
||||||
OVR2r LIT2r 0002 SUB2r STH2kr STA2
|
OVR2r LIT2r 0002 SUB2r
|
||||||
|
STH2kr STA2
|
||||||
|
|
||||||
STH2kr LDA2 #0002 LTH2 #03 JCN !{ STH2kr LDA2 !&return !&if_end.0 }
|
STH2kr LDA2 #0002 LTH2 #03 JCN !{
|
||||||
&if_end.0
|
STH2kr LDA2 !&return !&if_end.0 } &if_end.0
|
||||||
|
|
||||||
STH2kr LDA2 #0002 SUB2 fib
|
STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 &return
|
||||||
STH2kr LDA2 #0001 SUB2 fib
|
|
||||||
ADD2
|
|
||||||
|
|
||||||
&return
|
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
@sext
|
@sext
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue