diff options
author | chriseth <chris@ethereum.org> | 2018-11-26 23:08:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-26 23:08:04 +0800 |
commit | 764d618c442c969e72ab73ffda8475060fca1299 (patch) | |
tree | 3c719ccd0a4be7487c8d3f629f6c17b403b84be2 | |
parent | bd40c0ac028878a6b9a915bd2498fa5370edc347 (diff) | |
parent | 2d0326aad2a2233f58dd4c2c1cb4ef7bbbb22d87 (diff) | |
download | dexon-solidity-764d618c442c969e72ab73ffda8475060fca1299.tar.gz dexon-solidity-764d618c442c969e72ab73ffda8475060fca1299.tar.zst dexon-solidity-764d618c442c969e72ab73ffda8475060fca1299.zip |
Merge pull request #5404 from ethereum/jumpFixes
Annotate jump from calldata decode to function as "jump in".
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libsolidity/codegen/CompilerContext.h | 5 | ||||
-rw-r--r-- | libsolidity/codegen/ContractCompiler.cpp | 5 |
3 files changed, 9 insertions, 2 deletions
diff --git a/Changelog.md b/Changelog.md index e6f01553..5408bb8e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -15,6 +15,7 @@ Compiler Features: Bugfixes: * Assembly output: Do not mix in/out jump annotations with arguments. + * Code Generator: Annotate jump from calldata decoder to function as "jump in". Build System: * Emscripten: Upgrade to Emscripten SDK 1.37.21 and boost 1.67. diff --git a/libsolidity/codegen/CompilerContext.h b/libsolidity/codegen/CompilerContext.h index 63365175..02369813 100644 --- a/libsolidity/codegen/CompilerContext.h +++ b/libsolidity/codegen/CompilerContext.h @@ -167,7 +167,10 @@ public: /// the data. CompilerContext& appendConditionalRevert(bool _forwardReturnData = false); /// Appends a JUMP to a specific tag - CompilerContext& appendJumpTo(eth::AssemblyItem const& _tag) { m_asm->appendJump(_tag); return *this; } + CompilerContext& appendJumpTo( + eth::AssemblyItem const& _tag, + eth::AssemblyItem::JumpType _jumpType = eth::AssemblyItem::JumpType::Ordinary + ) { *m_asm << _tag.pushTag(); return appendJump(_jumpType); } /// Appends pushing of a new tag and @returns the new tag. eth::AssemblyItem pushNewTag() { return m_asm->append(m_asm->newPushTag()).tag(); } /// @returns a new tag without pushing any opcodes or data diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp index 157d5fa7..aabdbb79 100644 --- a/libsolidity/codegen/ContractCompiler.cpp +++ b/libsolidity/codegen/ContractCompiler.cpp @@ -344,7 +344,10 @@ void ContractCompiler::appendFunctionSelector(ContractDefinition const& _contrac m_context << Instruction::DUP1 << Instruction::CALLDATASIZE << Instruction::SUB; CompilerUtils(m_context).abiDecode(functionType->parameterTypes()); } - m_context.appendJumpTo(m_context.functionEntryLabel(functionType->declaration())); + m_context.appendJumpTo( + m_context.functionEntryLabel(functionType->declaration()), + eth::AssemblyItem::JumpType::IntoFunction + ); m_context << returnTag; // Return tag and input parameters get consumed. m_context.adjustStackOffset( |