[FEAT] Code after return marked unreachable

This commit is contained in:
2021-05-05 17:26:54 +02:00
parent b62cbd2cda
commit b40e234013
3 changed files with 30 additions and 19 deletions

View File

@@ -9,18 +9,16 @@
0024: RET 0024: RET
0025: STL 4 0025: STL 4
0030: STL 0 0030: STL 0
0035: PUSH 1 0035: LDL 8
0040: RET 0040: PUSH 0
0041: LDL 8 0045: GT
0046: PUSH 0 0046: JNT 72
0051: GT 0051: LDL 8
0052: JNT 78 0056: RET
0057: PUSH 1 0057: PUSH 1
0062: STL 12 0062: STL 12
0067: LDL 8 0067: JMP 82
0072: RET 0072: PUSH 2
0073: JMP 94 0077: STL 16
0078: PUSH 2 0082: PUSH 1
0083: STL 16 0087: RET
0088: PUSH 1
0093: RET

View File

@@ -761,15 +761,24 @@ static void parse_call() {
*/ */
static const bool parse_statements() { static const bool parse_statements() {
bool return_called = false; bool return_called = false;
bool local_return = false;
while (!parser_finished) { while (!parser_finished) {
current_line = tkn_get_line(); current_line = tkn_get_line();
switch (tkn_get_token()) { switch (tkn_get_token()) {
case TOKEN_CONST: case TOKEN_CONST:
tkn_next(); parse_const(); break; tkn_next();
if (local_return) HALT2("Unreachable code");
parse_const();
break;
case TOKEN_VAR: case TOKEN_VAR:
tkn_next(); parse_var(); break; tkn_next();
if (local_return) HALT2("Unreachable code");
parse_var();
break;
case TOKEN_IF: case TOKEN_IF:
tkn_next(); if (parse_if()) { return_called = true; } break; tkn_next();
if (local_return) HALT2("Unreachable code");
if (parse_if()) { return_called = true; } break;
/* /*
case TOKEN_FOR: case TOKEN_FOR:
tkn_next(); parse_for(); break; tkn_next(); parse_for(); break;
@@ -779,7 +788,11 @@ static const bool parse_statements() {
tkn_next(); parse_continue(); break; tkn_next(); parse_continue(); break;
*/ */
case TOKEN_RETURN: case TOKEN_RETURN:
tkn_next(); parse_return(); return_called = true; break; tkn_next();
if (local_return) HALT2("Unreachable code");
parse_return();
local_return = return_called = true;
break;
case TOKEN_REM: case TOKEN_REM:
tkn_next(); break; tkn_next(); break;

View File

@@ -15,12 +15,12 @@ const perico as number = 4-peiv[1].a.x * peiv[0].c.y[2]
function tarari(a as number, b as number) as number function tarari(a as number, b as number) as number
var local1 as number var local1 as number
return 1
if local1 > 0 then if local1 > 0 then
var local1 as number = 1
return local1 return local1
var local1 as number = 1
else else
var local3 as number = 2 var local3 as number = 2
end end
return 1
end end