diff options
author | chriseth <chris@ethereum.org> | 2017-06-14 20:12:33 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-14 20:12:33 +0800 |
commit | 43cfab70d0dfb7e5a6058ba2a84874f7622abb2f (patch) | |
tree | e93dd49913dfcde29c52a9c42bdcb9e0ae66bfa6 /libjulia/backends/evm/EVMCodeTransform.h | |
parent | c99c1c76f7ce2963b1401b53676ca3bbb0eadbea (diff) | |
parent | 154002cda05a75203b625d23ce507787bd5fa5e4 (diff) | |
download | dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.gz dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.bz2 dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.lz dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.xz dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.tar.zst dexon-solidity-43cfab70d0dfb7e5a6058ba2a84874f7622abb2f.zip |
Merge pull request #2389 from ethereum/moveLabelIDs
Move LabelIDs to generation phase.
Diffstat (limited to 'libjulia/backends/evm/EVMCodeTransform.h')
-rw-r--r-- | libjulia/backends/evm/EVMCodeTransform.h | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/libjulia/backends/evm/EVMCodeTransform.h b/libjulia/backends/evm/EVMCodeTransform.h index f65948dc..202f5051 100644 --- a/libjulia/backends/evm/EVMCodeTransform.h +++ b/libjulia/backends/evm/EVMCodeTransform.h @@ -64,7 +64,14 @@ public: solidity::assembly::AsmAnalysisInfo& _analysisInfo, bool _evm15 = false, ExternalIdentifierAccess const& _identifierAccess = ExternalIdentifierAccess() - ): CodeTransform(_assembly, _analysisInfo, _evm15, _identifierAccess, _assembly.stackHeight()) + ): CodeTransform( + _assembly, + _analysisInfo, + _evm15, + _identifierAccess, + _assembly.stackHeight(), + std::make_shared<Context>() + ) { } @@ -72,18 +79,28 @@ public: void run(solidity::assembly::Block const& _block); protected: + struct Context + { + using Scope = solidity::assembly::Scope; + std::map<Scope::Label const*, AbstractAssembly::LabelID> labelIDs; + std::map<Scope::Function const*, AbstractAssembly::LabelID> functionEntryIDs; + std::map<Scope::Variable const*, int> variableStackHeights; + }; + CodeTransform( julia::AbstractAssembly& _assembly, solidity::assembly::AsmAnalysisInfo& _analysisInfo, bool _evm15, ExternalIdentifierAccess const& _identifierAccess, - int _stackAdjustment + int _stackAdjustment, + std::shared_ptr<Context> _context ): m_assembly(_assembly), m_info(_analysisInfo), m_evm15(_evm15), m_identifierAccess(_identifierAccess), - m_stackAdjustment(_stackAdjustment) + m_stackAdjustment(_stackAdjustment), + m_context(_context) {} public: @@ -102,6 +119,10 @@ public: private: AbstractAssembly::LabelID labelFromIdentifier(solidity::assembly::Identifier const& _identifier); + /// @returns the label ID corresponding to the given label, allocating a new one if + /// necessary. + AbstractAssembly::LabelID labelID(solidity::assembly::Scope::Label const& _label); + AbstractAssembly::LabelID functionEntryID(solidity::assembly::Scope::Function const& _function); /// Generates code for an expression that is supposed to return a single value. void visitExpression(solidity::assembly::Statement const& _expression); @@ -116,9 +137,6 @@ private: void checkStackHeight(void const* _astElement); - /// Assigns the label's or function's id to a value taken from eth::Assembly if it has not yet been set. - void assignLabelIdIfUnset(boost::optional<AbstractAssembly::LabelID>& _labelId); - julia::AbstractAssembly& m_assembly; solidity::assembly::AsmAnalysisInfo& m_info; solidity::assembly::Scope* m_scope = nullptr; @@ -129,6 +147,7 @@ private: /// for inline assembly and different stack heights depending on the EVM backend used /// (EVM 1.0 or 1.5). int m_stackAdjustment = 0; + std::shared_ptr<Context> m_context; }; } |