diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2017-06-01 20:28:32 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2017-06-01 20:44:08 +0800 |
commit | 998ca552b8966d67bbbc7482e972563efade9a80 (patch) | |
tree | c45c41ac4eef9838317f0b34bab24394bd9e2f3a /libsolidity/interface | |
parent | c212d7c2e6b16063191d85471871eeddf0e6510d (diff) | |
download | dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.tar dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.tar.gz dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.tar.bz2 dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.tar.lz dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.tar.xz dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.tar.zst dexon-solidity-998ca552b8966d67bbbc7482e972563efade9a80.zip |
Fix state after CompilerStack.reset()
Diffstat (limited to 'libsolidity/interface')
-rw-r--r-- | libsolidity/interface/CompilerStack.cpp | 20 | ||||
-rw-r--r-- | libsolidity/interface/CompilerStack.h | 7 |
2 files changed, 26 insertions, 1 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index c3fcc1ef..aca9ce39 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -85,6 +85,7 @@ void CompilerStack::reset(bool _keepSources) } else { + m_stackState = Empty; m_sources.clear(); } m_optimize = false; @@ -94,7 +95,6 @@ void CompilerStack::reset(bool _keepSources) m_sourceOrder.clear(); m_contracts.clear(); m_errorReporter.clear(); - m_stackState = Empty; } bool CompilerStack::addSource(string const& _name, string const& _content, bool _isLibrary) @@ -513,6 +513,24 @@ ContractDefinition const& CompilerStack::contractDefinition(string const& _contr return *contract(_contractName).contract; } +size_t CompilerStack::functionEntryPoint( + std::string const& _contractName, + FunctionDefinition const& _function +) const +{ + shared_ptr<Compiler> const& compiler = contract(_contractName).compiler; + if (!compiler) + return 0; + eth::AssemblyItem tag = compiler->functionEntryLabel(_function); + if (tag.type() == eth::UndefinedItem) + return 0; + eth::AssemblyItems const& items = compiler->runtimeAssemblyItems(); + for (size_t i = 0; i < items.size(); ++i) + if (items.at(i).type() == eth::Tag && items.at(i).data() == tag.data()) + return i; + return 0; +} + tuple<int, int, int, int> CompilerStack::positionFromSourceLocation(SourceLocation const& _sourceLocation) const { int startLine; diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index d97b3960..bffdeabd 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -259,6 +259,13 @@ private: Json::Value const& contractABI(Contract const&) const; Json::Value const& natspec(Contract const&, DocumentationType _type) const; + /// @returns the offset of the entry point of the given function into the list of assembly items + /// or zero if it is not found or does not exist. + size_t functionEntryPoint( + std::string const& _contractName, + FunctionDefinition const& _function + ) const; + struct Remapping { std::string context; |