mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Register variably-sized variables on stack.
This commit is contained in:
parent
57e6827cb5
commit
cd5f495861
@ -199,11 +199,12 @@ bool Compiler::visit(FunctionDefinition& _function)
|
||||
unsigned const numReturnValues = _function.getReturnParameters().size();
|
||||
unsigned const numLocalVariables = _function.getLocalVariables().size();
|
||||
|
||||
for (ASTPointer<VariableDeclaration> const& variable: _function.getParameters() + _function.getReturnParameters())
|
||||
for (ASTPointer<VariableDeclaration> const& variable: _function.getParameters())
|
||||
m_context.addVariable(*variable);
|
||||
for (ASTPointer<VariableDeclaration> const& variable: _function.getReturnParameters())
|
||||
m_context.addAndInitializeVariable(*variable);
|
||||
for (VariableDeclaration const* localVariable: _function.getLocalVariables())
|
||||
m_context.addVariable(*localVariable);
|
||||
m_context.initializeLocalVariables(numReturnValues + numLocalVariables);
|
||||
m_context.addAndInitializeVariable(*localVariable);
|
||||
|
||||
_function.getBody().accept(*this);
|
||||
|
||||
|
@ -41,20 +41,25 @@ void CompilerContext::addStateVariable(VariableDeclaration const& _declaration)
|
||||
m_stateVariablesSize += _declaration.getType()->getStorageSize();
|
||||
}
|
||||
|
||||
void CompilerContext::initializeLocalVariables(unsigned _numVariables)
|
||||
void CompilerContext::addVariable(VariableDeclaration const& _declaration)
|
||||
{
|
||||
if (_numVariables > 0)
|
||||
{
|
||||
m_localVariables[&_declaration] = m_localVariablesSize;
|
||||
m_localVariablesSize += _declaration.getType()->getSizeOnStack();
|
||||
}
|
||||
|
||||
void CompilerContext::addAndInitializeVariable(VariableDeclaration const& _declaration)
|
||||
{
|
||||
addVariable(_declaration);
|
||||
|
||||
unsigned const size = _declaration.getType()->getSizeOnStack();
|
||||
for (unsigned i = 0; i < size; ++i)
|
||||
*this << u256(0);
|
||||
for (unsigned i = 1; i < _numVariables; ++i)
|
||||
*this << eth::Instruction::DUP1;
|
||||
m_asm.adjustDeposit(-_numVariables);
|
||||
}
|
||||
m_asm.adjustDeposit(-size);
|
||||
}
|
||||
|
||||
bool CompilerContext::isLocalVariable(Declaration const* _declaration) const
|
||||
{
|
||||
return std::find(m_localVariables.begin(), m_localVariables.end(), _declaration) != m_localVariables.end();
|
||||
return m_localVariables.count(_declaration) > 0;
|
||||
}
|
||||
|
||||
eth::AssemblyItem CompilerContext::getFunctionEntryLabel(FunctionDefinition const& _function) const
|
||||
@ -67,10 +72,10 @@ eth::AssemblyItem CompilerContext::getFunctionEntryLabel(FunctionDefinition cons
|
||||
|
||||
unsigned CompilerContext::getBaseStackOffsetOfVariable(Declaration const& _declaration) const
|
||||
{
|
||||
auto res = find(begin(m_localVariables), end(m_localVariables), &_declaration);
|
||||
auto res = m_localVariables.find(&_declaration);
|
||||
if (asserts(res != m_localVariables.end()))
|
||||
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Variable not found on stack."));
|
||||
return unsigned(end(m_localVariables) - res - 1);
|
||||
return m_localVariablesSize - res->second - 1;
|
||||
}
|
||||
|
||||
unsigned CompilerContext::baseToCurrentStackOffset(unsigned _baseOffset) const
|
||||
|
@ -43,8 +43,8 @@ public:
|
||||
void addMagicGlobal(MagicVariableDeclaration const& _declaration);
|
||||
void addStateVariable(VariableDeclaration const& _declaration);
|
||||
void startNewFunction() { m_localVariables.clear(); m_asm.setDeposit(0); }
|
||||
void initializeLocalVariables(unsigned _numVariables);
|
||||
void addVariable(VariableDeclaration const& _declaration) { m_localVariables.push_back(&_declaration); }
|
||||
void addVariable(VariableDeclaration const& _declaration);
|
||||
void addAndInitializeVariable(VariableDeclaration const& _declaration);
|
||||
void addFunction(FunctionDefinition const& _function) { m_functionEntryLabels.insert(std::make_pair(&_function, m_asm.newTag())); }
|
||||
|
||||
void adjustStackOffset(int _adjustment) { m_asm.adjustDeposit(_adjustment); }
|
||||
@ -98,8 +98,10 @@ private:
|
||||
u256 m_stateVariablesSize;
|
||||
/// Storage offsets of state variables
|
||||
std::map<Declaration const*, u256> m_stateVariables;
|
||||
/// Offsets of local variables on the stack.
|
||||
std::vector<Declaration const*> m_localVariables;
|
||||
/// Offsets of local variables on the stack (relative to stack base).
|
||||
std::map<Declaration const*, unsigned> m_localVariables;
|
||||
/// Sum of stack sizes of local variables
|
||||
unsigned m_localVariablesSize;
|
||||
/// Labels pointing to the entry points of funcitons.
|
||||
std::map<Declaration const*, eth::AssemblyItem> m_functionEntryLabels;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user