Skip to content

Commit

Permalink
gsc compiler fix control structs
Browse files Browse the repository at this point in the history
  • Loading branch information
ate47 committed May 2, 2024
1 parent 9dd7715 commit 6ce01fb
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 8 deletions.
9 changes: 6 additions & 3 deletions src/acts/compiler/gsc_compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,8 @@ bool ParseExpressionNode(ParseTree* exp, gscParser& parser, CompileObject& obj,
ok = false;
}

fobj.m_nodes.push_back(new AscmNodeJump(loopContinue, OPCODE_Jump));

fobj.m_nodes.push_back(loopBreak);

fobj.PopContinueNode();
Expand Down Expand Up @@ -1185,7 +1187,7 @@ bool ParseExpressionNode(ParseTree* exp, gscParser& parser, CompileObject& obj,
fobj.m_nodes.push_back(caseElem.jmpNode);

for (size_t stmt = caseElem.startStmt; stmt < caseElem.endStmt; stmt++) {
if (!ParseExpressionNode(rule->children[stmt], parser, obj, fobj, true)) {
if (!ParseExpressionNode(rule->children[stmt], parser, obj, fobj, false)) {
ok = false;
}
}
Expand Down Expand Up @@ -1274,15 +1276,16 @@ bool ParseExpressionNode(ParseTree* exp, gscParser& parser, CompileObject& obj,
fobj.m_nodes.push_back(loopIt);
// jumpiffalse(isdefined(key)) loopBreak
// todo: check if we can use EvalLocalVariableDefined
fobj.m_nodes.push_back(new AscmNodeVariable(keyVar->id, OPCODE_EvalLocalVariableRefCached));
fobj.m_nodes.push_back(new AscmNodeVariable(keyVar->id, OPCODE_EvalLocalVariableCached));
fobj.m_nodes.push_back(new AscmNodeOpCode(OPCODE_IsDefined));
fobj.m_nodes.push_back(new AscmNodeJump(loopBreak, OPCODE_JumpOnFalse));

// value = array[key];
fobj.m_nodes.push_back(new AscmNodeVariable(keyVar->id, OPCODE_EvalLocalVariableCached));
fobj.m_nodes.push_back(new AscmNodeVariable(arrayVal->id, OPCODE_EvalLocalVariableCached));
fobj.m_nodes.push_back(new AscmNodeOpCode(OPCODE_EvalArray));
fobj.m_nodes.push_back(new AscmNodeVariable(valueVar->id, OPCODE_SetNextArrayKeyCached));
fobj.m_nodes.push_back(new AscmNodeVariable(valueVar->id, OPCODE_EvalLocalVariableRefCached));
fobj.m_nodes.push_back(new AscmNodeOpCode(OPCODE_SetVariableField));

// nextarray(array, key, iterator)
fobj.m_nodes.push_back(new AscmNodeVariable(keyVar->id, OPCODE_EvalLocalVariableCached));
Expand Down
39 changes: 36 additions & 3 deletions test/gsc-parser/control.gsc
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,44 @@ function control() {
} else {
return 3333333333;
}
while (isdefined(64)) {
wait 2;
}
do {
if (32) {
continue;
}
wait 2;
if (64) {
break;
}
} while (isdefined(64));
for (; 2 < 42; ) {
wait 2;
}
for (;;) {
a = [];
foreach (e in a) {

if (32) {
continue;
}

if (0) {
switch (2) {
default:
continue;
}
}

foreach (e in []) {
test(e, 42);
}

foreach (e, z in []) {
test(e + z, 42);
}

}
if (1) {
break;
}
return 52;
}
7 changes: 5 additions & 2 deletions test/gsc-parser/switch.gsc
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
p() {
if (3) {
test_thing = 42;
return #"test";
return;
}
switch (test_thing) {
switch (4) {
case 1:
return 2;
case 3:
case 4:
break;

case 5:
wait 42;
default:
return 5;
}
return "ok";
}

0 comments on commit 6ce01fb

Please # to comment.