Skip to content

Commit fcd943e

Browse files
[Yul] Implements break/continue in Interpreter.
1 parent a122e93 commit fcd943e

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

test/tools/yulInterpreter/Interpreter.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,27 @@ void Interpreter::operator()(ForLoop const& _forLoop)
106106
while (evaluate(*_forLoop.condition) != 0)
107107
{
108108
(*this)(_forLoop.body);
109+
if (m_state.loopState == LoopState::Break)
110+
{
111+
m_state.loopState = LoopState::Default;
112+
break;
113+
}
109114
(*this)(_forLoop.post);
115+
m_state.loopState = LoopState::Default;
110116
}
111117
closeScope();
112118
}
113119

120+
void Interpreter::operator()(Break const& _break)
121+
{
122+
m_state.loopState = LoopState::Break;
123+
}
124+
125+
void Interpreter::operator()(Continue const& _continue)
126+
{
127+
m_state.loopState = LoopState::Continue;
128+
}
129+
114130
void Interpreter::operator()(Block const& _block)
115131
{
116132
openScope();
@@ -122,7 +138,14 @@ void Interpreter::operator()(Block const& _block)
122138
m_functions[funDef.name] = &funDef;
123139
m_scopes.back().insert(funDef.name);
124140
}
125-
ASTWalker::operator()(_block);
141+
142+
for (auto const& statement : _block.statements)
143+
{
144+
visit(statement);
145+
if (m_state.loopState != LoopState::Default)
146+
break;
147+
}
148+
126149
closeScope();
127150
}
128151

test/tools/yulInterpreter/Interpreter.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ class InterpreterTerminated: dev::Exception
3939
{
4040
};
4141

42+
enum class LoopState {
43+
Default,
44+
Continue,
45+
Break,
46+
};
47+
4248
struct InterpreterState
4349
{
4450
dev::bytes calldata;
@@ -65,6 +71,7 @@ struct InterpreterState
6571
std::vector<std::string> trace;
6672
/// This is actually an input parameter that more or less limits the runtime.
6773
size_t maxTraceSize = 0;
74+
LoopState loopState = LoopState::Default;
6875
};
6976

7077
/**
@@ -90,6 +97,8 @@ class Interpreter: public ASTWalker
9097
void operator()(Switch const& _switch) override;
9198
void operator()(FunctionDefinition const&) override;
9299
void operator()(ForLoop const&) override;
100+
void operator()(Break const&) override;
101+
void operator()(Continue const&) override;
93102
void operator()(Block const& _block) override;
94103

95104
std::vector<std::string> const& trace() const { return m_state.trace; }

0 commit comments

Comments
 (0)