aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-11-26 23:08:04 +0800
committerGitHub <noreply@github.com>2018-11-26 23:08:04 +0800
commit764d618c442c969e72ab73ffda8475060fca1299 (patch)
tree3c719ccd0a4be7487c8d3f629f6c17b403b84be2
parentbd40c0ac028878a6b9a915bd2498fa5370edc347 (diff)
parent2d0326aad2a2233f58dd4c2c1cb4ef7bbbb22d87 (diff)
downloaddexon-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.md1
-rw-r--r--libsolidity/codegen/CompilerContext.h5
-rw-r--r--libsolidity/codegen/ContractCompiler.cpp5
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(