From bbfb16cf5ce903150bc3a141ac50553d8bf6d346 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 30 Aug 2017 02:17:15 +0100 Subject: Introduce assemblyString --- libevmasm/Assembly.cpp | 7 +++++++ libevmasm/Assembly.h | 3 +++ liblll/Compiler.cpp | 5 ++--- libsolidity/codegen/Compiler.h | 4 ++-- libsolidity/codegen/CompilerContext.h | 4 ++-- libsolidity/interface/AssemblyStack.cpp | 4 +--- libsolidity/interface/CompilerStack.cpp | 9 ++++----- libsolidity/interface/CompilerStack.h | 4 ++-- libsolidity/interface/StandardCompiler.cpp | 4 +--- solc/CommandLineInterface.cpp | 7 +++---- 10 files changed, 27 insertions(+), 24 deletions(-) diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp index 2203cadf..6b4bb52b 100644 --- a/libevmasm/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -208,6 +208,13 @@ void Assembly::assemblyStream(ostream& _out, string const& _prefix, StringMap co _out << endl << _prefix << "auxdata: 0x" << toHex(m_auxiliaryData) << endl; } +string Assembly::assemblyString(StringMap const& _sourceCodes) const +{ + ostringstream tmp; + assemblyStream(tmp, "", _sourceCodes); + return tmp.str(); +} + Json::Value Assembly::createJsonValue(string _name, int _begin, int _end, string _value, string _jumpType) { Json::Value value; diff --git a/libevmasm/Assembly.h b/libevmasm/Assembly.h index b7e9b354..cbdd71bc 100644 --- a/libevmasm/Assembly.h +++ b/libevmasm/Assembly.h @@ -121,6 +121,9 @@ public: Assembly& optimise(bool _enable, bool _isCreation = true, size_t _runs = 200); /// Create a text representation of the assembly. + std::string assemblyString( + StringMap const& _sourceCodes = StringMap() + ) const; void assemblyStream( std::ostream& _out, std::string const& _prefix = "", diff --git a/liblll/Compiler.cpp b/liblll/Compiler.cpp index f9bd3ab9..b69675aa 100644 --- a/liblll/Compiler.cpp +++ b/liblll/Compiler.cpp @@ -72,14 +72,13 @@ std::string dev::eth::compileLLLToAsm(std::string const& _src, bool _opt, std::v { CompilerState cs; cs.populateStandard(); - stringstream ret; auto assembly = CodeFragment::compile(_src, cs).assembly(cs); if (_opt) assembly = assembly.optimise(true); - assembly.assemblyStream(ret); + string ret = assembly.assemblyString(); for (auto i: cs.treesToKill) killBigints(i); - return ret.str(); + return ret; } catch (Exception const& _e) { diff --git a/libsolidity/codegen/Compiler.h b/libsolidity/codegen/Compiler.h index 5233cc91..06654486 100644 --- a/libsolidity/codegen/Compiler.h +++ b/libsolidity/codegen/Compiler.h @@ -60,9 +60,9 @@ public: /// @returns Only the runtime object (without constructor). eth::LinkerObject runtimeObject() const { return m_context.assembledRuntimeObject(m_runtimeSub); } /// @arg _sourceCodes is the map of input files to source code strings - void assemblyStream(std::ostream& _stream, StringMap const& _sourceCodes = StringMap()) const + std::string assemblyString(StringMap const& _sourceCodes = StringMap()) const { - m_context.assemblyStream(_stream, _sourceCodes); + return m_context.assemblyString(_sourceCodes); } /// @arg _sourceCodes is the map of input files to source code strings Json::Value assemblyJSON(StringMap const& _sourceCodes = StringMap()) const diff --git a/libsolidity/codegen/CompilerContext.h b/libsolidity/codegen/CompilerContext.h index 47d4edde..5116585e 100644 --- a/libsolidity/codegen/CompilerContext.h +++ b/libsolidity/codegen/CompilerContext.h @@ -209,9 +209,9 @@ public: eth::Assembly& nonConstAssembly() { return *m_asm; } /// @arg _sourceCodes is the map of input files to source code strings - void assemblyStream(std::ostream& _stream, StringMap const& _sourceCodes = StringMap()) const + std::string assemblyString(StringMap const& _sourceCodes = StringMap()) const { - m_asm->assemblyStream(_stream, "", _sourceCodes); + return m_asm->assemblyString(_sourceCodes); } /// @arg _sourceCodes is the map of input files to source code strings diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 025a01ac..504ad92c 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -91,9 +91,7 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const eth::Assembly assembly; assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo, assembly); object.bytecode = make_shared(assembly.assemble()); - ostringstream tmp; - assembly.assemblyStream(tmp); - object.assembly = tmp.str(); + object.assembly = assembly.assemblyString(); return object; } case Machine::EVM15: diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 5f62bb03..41bbf687 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -347,15 +347,14 @@ eth::LinkerObject const& CompilerStack::cloneObject(string const& _contractName) return contract(_contractName).cloneObject; } -void CompilerStack::assemblyStream(ostream& _outStream, string const& _contractName, StringMap _sourceCodes) const +/// FIXME: cache this string +string CompilerStack::assemblyString(string const& _contractName, StringMap _sourceCodes) const { Contract const& currentContract = contract(_contractName); if (currentContract.compiler) - currentContract.compiler->assemblyStream(_outStream, _sourceCodes); + return currentContract.compiler->assemblyString(_sourceCodes); else - { - _outStream << "Contract not fully implemented" << endl; - } + return string(); } /// FIXME: cache the JSON diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index 2f1b9bb3..f1bbae47 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -190,10 +190,10 @@ public: /// if the contract does not (yet) have bytecode. std::string const* runtimeSourceMapping(std::string const& _contractName = "") const; - /// Streams a verbose version of the assembly to @a _outStream. + /// @return a verbose text representation of the assembly. /// @arg _sourceCodes is the map of input files to source code strings /// Prerequisite: Successful compilation. - void assemblyStream(std::ostream& _outStream, std::string const& _contractName = "", StringMap _sourceCodes = StringMap()) const; + std::string assemblyString(std::string const& _contractName = "", StringMap _sourceCodes = StringMap()) const; /// @returns a JSON representation of the assembly. /// @arg _sourceCodes is the map of input files to source code strings diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index c821a341..b4fbbef9 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -400,9 +400,7 @@ Json::Value StandardCompiler::compileInternal(Json::Value const& _input) // EVM Json::Value evmData(Json::objectValue); // @TODO: add ir - ostringstream tmp; - m_compilerStack.assemblyStream(tmp, contractName, createSourceList(_input)); - evmData["assembly"] = tmp.str(); + evmData["assembly"] = m_compilerStack.assemblyString(contractName, createSourceList(_input)); evmData["legacyAssembly"] = m_compilerStack.assemblyJSON(contractName, createSourceList(_input)); evmData["methodIdentifiers"] = m_compilerStack.methodIdentifiers(contractName); evmData["gasEstimates"] = m_compilerStack.gasEstimates(contractName); diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 560dc98b..32c61585 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -1156,9 +1156,8 @@ void CommandLineInterface::outputCompilationResults() } else { - stringstream data; - m_compiler->assemblyStream(data, contract, m_sourceCodes); - createFile(m_compiler->filesystemFriendlyName(contract) + ".evm", data.str()); + string ret = m_compiler->assemblyString(contract, m_sourceCodes); + createFile(m_compiler->filesystemFriendlyName(contract) + ".evm", ret)); } } else @@ -1167,7 +1166,7 @@ void CommandLineInterface::outputCompilationResults() if (m_args.count(g_argAsmJson) cout << m_compiler->assemblyJSON(contract, m_sourceCodes); else - m_compiler->assemblyStream(cout, contract, m_sourceCodes); + cout << m_compiler->assemblyString(contract, m_sourceCodes); } } -- cgit