From 2d1faf53be881449688b055d5a587fe01bdf709b Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Thu, 2 May 2019 14:24:30 +0200 Subject: [PATCH] Reset loop state (to default) before interpreting for-loop post block --- .../recursive_function_for_loop.yul | 37 +++++++++++++++++++ test/tools/yulInterpreter/Interpreter.cpp | 1 + 2 files changed, 38 insertions(+) create mode 100644 test/libyul/yulInterpreterTests/recursive_function_for_loop.yul diff --git a/test/libyul/yulInterpreterTests/recursive_function_for_loop.yul b/test/libyul/yulInterpreterTests/recursive_function_for_loop.yul new file mode 100644 index 000000000..003c71ee6 --- /dev/null +++ b/test/libyul/yulInterpreterTests/recursive_function_for_loop.yul @@ -0,0 +1,37 @@ +{ + { + let a := foo_0(calldataload(0)) + sstore(0, a) + } + function foo_0(x) -> y + { + mstore8(1, 1) + for { + } + slt(1, keccak256(1, msize())) + { + let x_1 := foo_0(x) + } + { + continue + } + } +} +// ---- +// Trace: +// MSTORE_AT_SIZE(1, 1) [0101] +// MSIZE() +// MLOAD_FROM_SIZE(1, 32) +// MSTORE_AT_SIZE(1, 1) [0101] +// MSIZE() +// MLOAD_FROM_SIZE(1, 64) +// MSIZE() +// MLOAD_FROM_SIZE(1, 96) +// SSTORE(0, 0) +// Memory dump: +// 0: 0001000000000000000000000000000000000000000000000000000000000000 +// 20: 0000000000000000000000000000000000000000000000000000000000000000 +// 40: 0000000000000000000000000000000000000000000000000000000000000000 +// 60: 0000000000000000000000000000000000000000000000000000000000000000 +// Storage dump: +// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/test/tools/yulInterpreter/Interpreter.cpp b/test/tools/yulInterpreter/Interpreter.cpp index f3ce44e4d..1876da368 100644 --- a/test/tools/yulInterpreter/Interpreter.cpp +++ b/test/tools/yulInterpreter/Interpreter.cpp @@ -110,6 +110,7 @@ void Interpreter::operator()(ForLoop const& _forLoop) if (m_state.loopState == LoopState::Break) break; + m_state.loopState = LoopState::Default; (*this)(_forLoop.post); } m_state.loopState = LoopState::Default;