mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
added information about jump type for jump instructions
Conflicts: libevmcore/Assembly.cpp libsolidity/Compiler.cpp
This commit is contained in:
parent
9c82cbeddf
commit
74a01826ee
11
Compiler.cpp
11
Compiler.cpp
@ -177,7 +177,9 @@ void Compiler::appendFunctionSelector(ContractDefinition const& _contract)
|
|||||||
{
|
{
|
||||||
callDataUnpackerEntryPoints.insert(std::make_pair(it.first, m_context.newTag()));
|
callDataUnpackerEntryPoints.insert(std::make_pair(it.first, m_context.newTag()));
|
||||||
m_context << eth::dupInstruction(1) << u256(FixedHash<4>::Arith(it.first)) << eth::Instruction::EQ;
|
m_context << eth::dupInstruction(1) << u256(FixedHash<4>::Arith(it.first)) << eth::Instruction::EQ;
|
||||||
m_context.appendConditionalJumpTo(callDataUnpackerEntryPoints.at(it.first));
|
auto assemblyItem = callDataUnpackerEntryPoints.at(it.first);
|
||||||
|
//assemblyItem.setJumpType(eth::AssemblyItem::JumpType::IntoFunction);
|
||||||
|
m_context.appendConditionalJumpTo(assemblyItem);
|
||||||
}
|
}
|
||||||
if (FunctionDefinition const* fallback = _contract.getFallbackFunction())
|
if (FunctionDefinition const* fallback = _contract.getFallbackFunction())
|
||||||
{
|
{
|
||||||
@ -197,7 +199,9 @@ void Compiler::appendFunctionSelector(ContractDefinition const& _contract)
|
|||||||
m_context << callDataUnpackerEntryPoints.at(it.first);
|
m_context << callDataUnpackerEntryPoints.at(it.first);
|
||||||
eth::AssemblyItem returnTag = m_context.pushNewTag();
|
eth::AssemblyItem returnTag = m_context.pushNewTag();
|
||||||
appendCalldataUnpacker(functionType->getParameterTypes());
|
appendCalldataUnpacker(functionType->getParameterTypes());
|
||||||
m_context.appendJumpTo(m_context.getFunctionEntryLabel(functionType->getDeclaration()));
|
auto assemblyItem = m_context.getFunctionEntryLabel(functionType->getDeclaration());
|
||||||
|
//assemblyItem.setJumpType(eth::AssemblyItem::JumpType::IntoFunction);
|
||||||
|
m_context.appendJumpTo(assemblyItem);
|
||||||
m_context << returnTag;
|
m_context << returnTag;
|
||||||
appendReturnValuePacker(functionType->getReturnParameterTypes());
|
appendReturnValuePacker(functionType->getReturnParameterTypes());
|
||||||
}
|
}
|
||||||
@ -378,8 +382,9 @@ bool Compiler::visit(FunctionDefinition const& _function)
|
|||||||
m_context.removeVariable(*localVariable);
|
m_context.removeVariable(*localVariable);
|
||||||
|
|
||||||
m_context.adjustStackOffset(-(int)c_returnValuesSize);
|
m_context.adjustStackOffset(-(int)c_returnValuesSize);
|
||||||
|
|
||||||
if (!_function.isConstructor())
|
if (!_function.isConstructor())
|
||||||
m_context << eth::Instruction::JUMP;
|
m_context.appendJump(eth::AssemblyItem::JumpType::OutOfFunction);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,6 +177,13 @@ u256 CompilerContext::getStorageLocationOfVariable(const Declaration& _declarati
|
|||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompilerContext& CompilerContext::appendJump(eth::AssemblyItem::JumpType _jumpType)
|
||||||
|
{
|
||||||
|
eth::AssemblyItem item(eth::Instruction::JUMP);
|
||||||
|
item.setJumpType(_jumpType);
|
||||||
|
return *this << item;
|
||||||
|
}
|
||||||
|
|
||||||
void CompilerContext::resetVisitedNodes(ASTNode const* _node)
|
void CompilerContext::resetVisitedNodes(ASTNode const* _node)
|
||||||
{
|
{
|
||||||
stack<ASTNode const*> newStack;
|
stack<ASTNode const*> newStack;
|
||||||
|
@ -91,7 +91,7 @@ public:
|
|||||||
/// Appends a JUMP to a new tag and @returns the tag
|
/// Appends a JUMP to a new tag and @returns the tag
|
||||||
eth::AssemblyItem appendJumpToNew() { return m_asm.appendJump().tag(); }
|
eth::AssemblyItem appendJumpToNew() { return m_asm.appendJump().tag(); }
|
||||||
/// Appends a JUMP to a tag already on the stack
|
/// Appends a JUMP to a tag already on the stack
|
||||||
CompilerContext& appendJump() { return *this << eth::Instruction::JUMP; }
|
CompilerContext& appendJump(eth::AssemblyItem::JumpType _jumpType = eth::AssemblyItem::JumpType::Ordinary);
|
||||||
/// Appends a JUMP to a specific tag
|
/// 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) { m_asm.appendJump(_tag); return *this; }
|
||||||
/// Appends pushing of a new tag and @returns the new tag.
|
/// Appends pushing of a new tag and @returns the new tag.
|
||||||
|
@ -108,7 +108,8 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const&
|
|||||||
retSizeOnStack = returnType->getSizeOnStack();
|
retSizeOnStack = returnType->getSizeOnStack();
|
||||||
}
|
}
|
||||||
solAssert(retSizeOnStack <= 15, "Stack too deep.");
|
solAssert(retSizeOnStack <= 15, "Stack too deep.");
|
||||||
m_context << eth::dupInstruction(retSizeOnStack + 1) << eth::Instruction::JUMP;
|
m_context << eth::dupInstruction(retSizeOnStack + 1);
|
||||||
|
m_context.appendJump(eth::AssemblyItem::JumpType::OutOfFunction);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpressionCompiler::appendTypeConversion(Type const& _typeOnStack, Type const& _targetType, bool _cleanupNeeded)
|
void ExpressionCompiler::appendTypeConversion(Type const& _typeOnStack, Type const& _targetType, bool _cleanupNeeded)
|
||||||
@ -405,7 +406,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
|
|||||||
}
|
}
|
||||||
_functionCall.getExpression().accept(*this);
|
_functionCall.getExpression().accept(*this);
|
||||||
|
|
||||||
m_context.appendJump();
|
m_context.appendJump(eth::AssemblyItem::JumpType::IntoFunction);
|
||||||
m_context << returnLabel;
|
m_context << returnLabel;
|
||||||
|
|
||||||
unsigned returnParametersSize = CompilerUtils::getSizeOnStack(function.getReturnParameterTypes());
|
unsigned returnParametersSize = CompilerUtils::getSizeOnStack(function.getReturnParameterTypes());
|
||||||
|
Loading…
Reference in New Issue
Block a user