Generate break and continue statements inside for loop body.

This commit is contained in:
Bhargava Shastry 2019-03-26 10:52:30 +01:00
parent 1feefa1ccc
commit 6f673f5e81
3 changed files with 18 additions and 1 deletions

View File

@ -311,7 +311,9 @@ void ProtoConverter::visit(ForStmt const& _x)
m_output << "for { let " << loopVarName << " := 0 } " m_output << "for { let " << loopVarName << " := 0 } "
<< "lt(" << loopVarName << ", 0x60) " << "lt(" << loopVarName << ", 0x60) "
<< "{ " << loopVarName << " := add(" << loopVarName << ", 0x20) } "; << "{ " << loopVarName << " := add(" << loopVarName << ", 0x20) } ";
m_inForScope.push(true);
visit(_x.for_body()); visit(_x.for_body());
m_inForScope.pop();
--m_numNestedForLoops; --m_numNestedForLoops;
} }
@ -365,6 +367,14 @@ void ProtoConverter::visit(Statement const& _x)
case Statement::kSwitchstmt: case Statement::kSwitchstmt:
visit(_x.switchstmt()); visit(_x.switchstmt());
break; break;
case Statement::kBreakstmt:
if (m_inForScope.top())
m_output << "break\n";
break;
case Statement::kContstmt:
if (m_inForScope.top())
m_output << "continue\n";
break;
case Statement::STMT_ONEOF_NOT_SET: case Statement::STMT_ONEOF_NOT_SET:
break; break;
} }

View File

@ -39,6 +39,7 @@ public:
m_numLiveVars = 10; m_numLiveVars = 10;
m_numVarsPerScope.push(m_numLiveVars); m_numVarsPerScope.push(m_numLiveVars);
m_numNestedForLoops = 0; m_numNestedForLoops = 0;
m_inForScope.push(false);
} }
ProtoConverter(ProtoConverter const&) = delete; ProtoConverter(ProtoConverter const&) = delete;
ProtoConverter(ProtoConverter&&) = delete; ProtoConverter(ProtoConverter&&) = delete;
@ -72,6 +73,7 @@ private:
std::stack<uint8_t> m_numVarsPerScope; std::stack<uint8_t> m_numVarsPerScope;
int32_t m_numLiveVars; int32_t m_numLiveVars;
int32_t m_numNestedForLoops; int32_t m_numNestedForLoops;
std::stack<bool> m_inForScope;
}; };
} }
} }

View File

@ -141,7 +141,7 @@ message IfStmt {
} }
message ForStmt { message ForStmt {
required Block for_body = 2; required Block for_body = 1;
} }
message CaseStmt { message CaseStmt {
@ -155,6 +155,9 @@ message SwitchStmt {
optional Block default_block = 3; optional Block default_block = 3;
} }
message BreakStmt {}
message ContinueStmt {}
message Statement { message Statement {
oneof stmt_oneof { oneof stmt_oneof {
VarDecl decl = 1; VarDecl decl = 1;
@ -164,6 +167,8 @@ message Statement {
Block blockstmt = 5; Block blockstmt = 5;
ForStmt forstmt = 6; ForStmt forstmt = 6;
SwitchStmt switchstmt = 7; SwitchStmt switchstmt = 7;
BreakStmt breakstmt = 8;
ContinueStmt contstmt = 9;
} }
} }