Correct stack height adjustment after returnsub.

This commit is contained in:
chriseth 2017-05-31 13:06:51 +02:00
parent ba5ee71b7f
commit 0185f3cbf6
5 changed files with 6 additions and 6 deletions

View File

@ -83,7 +83,7 @@ public:
/// Call a subroutine. /// Call a subroutine.
virtual void appendJumpsub(LabelID _label, int _arguments, int _returns) = 0; virtual void appendJumpsub(LabelID _label, int _arguments, int _returns) = 0;
/// Return from a subroutine. /// Return from a subroutine.
virtual void appendReturnsub(int _returns) = 0; virtual void appendReturnsub(int _returns, int _stackDiffAfter = 0) = 0;
}; };
enum class IdentifierContext { LValue, RValue }; enum class IdentifierContext { LValue, RValue };

View File

@ -134,12 +134,12 @@ void EVMAssembly::appendJumpsub(AbstractAssembly::LabelID _labelId, int _argumen
m_stackHeight += _returns - _arguments; 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(m_evm15, "RETURNSUB used for EVM 1.0");
solAssert(_returns >= 0, ""); solAssert(_returns >= 0, "");
m_bytecode.push_back(byte(solidity::Instruction::RETURNSUB)); m_bytecode.push_back(byte(solidity::Instruction::RETURNSUB));
m_stackHeight -= _returns; m_stackHeight += _stackDiffAfter - _returns;
} }
eth::LinkerObject EVMAssembly::finalize() eth::LinkerObject EVMAssembly::finalize()

View File

@ -68,7 +68,7 @@ public:
/// Call a subroutine. /// Call a subroutine.
virtual void appendJumpsub(LabelID _label, int _arguments, int _returns) override; virtual void appendJumpsub(LabelID _label, int _arguments, int _returns) override;
/// Return from a subroutine. /// 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. /// Resolves references inside the bytecode and returns the linker object.

View File

@ -347,7 +347,7 @@ void CodeTransform::operator()(FunctionDefinition const& _function)
} }
if (m_evm15) if (m_evm15)
m_assembly.appendReturnsub(_function.returns.size()); m_assembly.appendReturnsub(_function.returns.size(), stackHeightBefore);
else else
m_assembly.appendJump(stackHeightBefore - _function.returns.size()); m_assembly.appendJump(stackHeightBefore - _function.returns.size());
m_stackAdjustment -= localStackAdjustment; m_stackAdjustment -= localStackAdjustment;

View File

@ -115,7 +115,7 @@ public:
} }
/// Return from a subroutine. /// Return from a subroutine.
virtual void appendReturnsub(int) override virtual void appendReturnsub(int, int) override
{ {
// TODO we could emulate that, though // TODO we could emulate that, though
solAssert(false, "RETURNSUB not implemented for EVM 1.0"); solAssert(false, "RETURNSUB not implemented for EVM 1.0");