[FEAT] Code after return marked unreachable
This commit is contained in:
@@ -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
|
|
||||||
|
|||||||
21
parser.cpp
21
parser.cpp
@@ -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;
|
||||||
|
|
||||||
|
|||||||
4
test.vb
4
test.vb
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user