From 0185f3cbf6aae954d8c59a556af0e150850022bc Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 31 May 2017 13:06:51 +0200 Subject: Correct stack height adjustment after returnsub. --- libjulia/backends/evm/AbstractAssembly.h | 2 +- libjulia/backends/evm/EVMAssembly.cpp | 4 ++-- libjulia/backends/evm/EVMAssembly.h | 2 +- libjulia/backends/evm/EVMCodeTransform.cpp | 2 +- libsolidity/inlineasm/AsmCodeGen.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libjulia/backends/evm/AbstractAssembly.h b/libjulia/backends/evm/AbstractAssembly.h index ba2c8e20..73c6699f 100644 --- a/libjulia/backends/evm/AbstractAssembly.h +++ b/libjulia/backends/evm/AbstractAssembly.h @@ -83,7 +83,7 @@ public: /// Call a subroutine. virtual void appendJumpsub(LabelID _label, int _arguments, int _returns) = 0; /// Return from a subroutine. - virtual void appendReturnsub(int _returns) = 0; + virtual void appendReturnsub(int _returns, int _stackDiffAfter = 0) = 0; }; enum class IdentifierContext { LValue, RValue }; diff --git a/libjulia/backends/evm/EVMAssembly.cpp b/libjulia/backends/evm/EVMAssembly.cpp index a8019e86..a24d9779 100644 --- a/libjulia/backends/evm/EVMAssembly.cpp +++ b/libjulia/backends/evm/EVMAssembly.cpp @@ -134,12 +134,12 @@ void EVMAssembly::appendJumpsub(AbstractAssembly::LabelID _labelId, int _argumen m_stackHeight += _returns - _arguments; } -void EVMAssembly::appendReturnsub(int _returns) +void EVMAssembly::appendReturnsub(int _returns, int _stackDiffAfter) { solAssert(m_evm15, "RETURNSUB used for EVM 1.0"); solAssert(_returns >= 0, ""); m_bytecode.push_back(byte(solidity::Instruction::RETURNSUB)); - m_stackHeight -= _returns; + m_stackHeight += _stackDiffAfter - _returns; } eth::LinkerObject EVMAssembly::finalize() diff --git a/libjulia/backends/evm/EVMAssembly.h b/libjulia/backends/evm/EVMAssembly.h index 003eeaf5..4b0076dd 100644 --- a/libjulia/backends/evm/EVMAssembly.h +++ b/libjulia/backends/evm/EVMAssembly.h @@ -68,7 +68,7 @@ public: /// Call a subroutine. virtual void appendJumpsub(LabelID _label, int _arguments, int _returns) override; /// Return from a subroutine. - virtual void appendReturnsub(int _returns) override; + virtual void appendReturnsub(int _returns, int _stackDiffAfter) override; /// Resolves references inside the bytecode and returns the linker object. diff --git a/libjulia/backends/evm/EVMCodeTransform.cpp b/libjulia/backends/evm/EVMCodeTransform.cpp index c9624f82..43bd5a44 100644 --- a/libjulia/backends/evm/EVMCodeTransform.cpp +++ b/libjulia/backends/evm/EVMCodeTransform.cpp @@ -347,7 +347,7 @@ void CodeTransform::operator()(FunctionDefinition const& _function) } if (m_evm15) - m_assembly.appendReturnsub(_function.returns.size()); + m_assembly.appendReturnsub(_function.returns.size(), stackHeightBefore); else m_assembly.appendJump(stackHeightBefore - _function.returns.size()); m_stackAdjustment -= localStackAdjustment; diff --git a/libsolidity/inlineasm/AsmCodeGen.cpp b/libsolidity/inlineasm/AsmCodeGen.cpp index 875d7ce4..dd91673b 100644 --- a/libsolidity/inlineasm/AsmCodeGen.cpp +++ b/libsolidity/inlineasm/AsmCodeGen.cpp @@ -115,7 +115,7 @@ public: } /// Return from a subroutine. - virtual void appendReturnsub(int) override + virtual void appendReturnsub(int, int) override { // TODO we could emulate that, though solAssert(false, "RETURNSUB not implemented for EVM 1.0"); -- cgit