diff options
author | Gav Wood <i@gavwood.com> | 2015-01-27 07:02:06 +0800 |
---|---|---|
committer | Gav Wood <i@gavwood.com> | 2015-01-27 07:02:06 +0800 |
commit | 8dbdaa79e37619fc79b7111b12d5385f140fd1a1 (patch) | |
tree | 340678643ca5d2394533df2eb168393f970b009e /CompilerContext.cpp | |
parent | 6e33b8cce1a7e4881f207e73fc366df1929de5c3 (diff) | |
parent | 8d09d8deb75a28b43a493d8afee5e743a3b201bb (diff) | |
download | dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.tar dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.tar.gz dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.tar.bz2 dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.tar.lz dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.tar.xz dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.tar.zst dexon-solidity-8dbdaa79e37619fc79b7111b12d5385f140fd1a1.zip |
Merge branch 'develop' of github.com:ethereum/cpp-ethereum into develop
Diffstat (limited to 'CompilerContext.cpp')
-rw-r--r-- | CompilerContext.cpp | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/CompilerContext.cpp b/CompilerContext.cpp index 27ec3efd..ad1877ba 100644 --- a/CompilerContext.cpp +++ b/CompilerContext.cpp @@ -43,10 +43,11 @@ void CompilerContext::addStateVariable(VariableDeclaration const& _declaration) m_stateVariablesSize += _declaration.getType()->getStorageSize(); } -void CompilerContext::addVariable(VariableDeclaration const& _declaration) +void CompilerContext::addVariable(VariableDeclaration const& _declaration, + unsigned _offsetToCurrent) { - m_localVariables[&_declaration] = m_localVariablesSize; - m_localVariablesSize += _declaration.getType()->getSizeOnStack(); + solAssert(m_asm.deposit() >= 0 && unsigned(m_asm.deposit()) >= _offsetToCurrent, ""); + m_localVariables[&_declaration] = unsigned(m_asm.deposit()) - _offsetToCurrent; } void CompilerContext::addAndInitializeVariable(VariableDeclaration const& _declaration) @@ -56,7 +57,6 @@ void CompilerContext::addAndInitializeVariable(VariableDeclaration const& _decla int const size = _declaration.getType()->getSizeOnStack(); for (int i = 0; i < size; ++i) *this << u256(0); - m_asm.adjustDeposit(-size); } void CompilerContext::addFunction(FunctionDefinition const& _function) @@ -66,6 +66,11 @@ void CompilerContext::addFunction(FunctionDefinition const& _function) m_virtualFunctionEntryLabels.insert(make_pair(_function.getName(), tag)); } +void CompilerContext::addModifier(ModifierDefinition const& _modifier) +{ + m_functionModifiers.insert(make_pair(_modifier.getName(), &_modifier)); +} + bytes const& CompilerContext::getCompiledContract(const ContractDefinition& _contract) const { auto ret = m_compiledContracts.find(&_contract); @@ -75,7 +80,7 @@ bytes const& CompilerContext::getCompiledContract(const ContractDefinition& _con bool CompilerContext::isLocalVariable(Declaration const* _declaration) const { - return m_localVariables.count(_declaration) > 0; + return m_localVariables.count(_declaration); } eth::AssemblyItem CompilerContext::getFunctionEntryLabel(FunctionDefinition const& _function) const @@ -92,21 +97,28 @@ eth::AssemblyItem CompilerContext::getVirtualFunctionEntryLabel(FunctionDefiniti return res->second.tag(); } +ModifierDefinition const& CompilerContext::getFunctionModifier(string const& _name) const +{ + auto res = m_functionModifiers.find(_name); + solAssert(res != m_functionModifiers.end(), "Function modifier override not found."); + return *res->second; +} + unsigned CompilerContext::getBaseStackOffsetOfVariable(Declaration const& _declaration) const { auto res = m_localVariables.find(&_declaration); solAssert(res != m_localVariables.end(), "Variable not found on stack."); - return m_localVariablesSize - res->second - 1; + return res->second; } unsigned CompilerContext::baseToCurrentStackOffset(unsigned _baseOffset) const { - return _baseOffset + m_asm.deposit(); + return m_asm.deposit() - _baseOffset - 1; } unsigned CompilerContext::currentToBaseStackOffset(unsigned _offset) const { - return -baseToCurrentStackOffset(-_offset); + return m_asm.deposit() - _offset - 1; } u256 CompilerContext::getStorageLocationOfVariable(const Declaration& _declaration) const |