mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Transition from bytecode to more general linker objects.
This commit is contained in:
parent
337fde9d11
commit
a9edc7b1a6
@ -48,8 +48,9 @@ private:
|
||||
unsigned stackHeight;
|
||||
};
|
||||
|
||||
void Compiler::compileContract(ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, bytes const*> const& _contracts)
|
||||
void Compiler::compileContract(
|
||||
ContractDefinition const& _contract,
|
||||
std::map<const ContractDefinition*, eth::Assembly const*> const& _contracts)
|
||||
{
|
||||
m_context = CompilerContext(); // clear it just in case
|
||||
{
|
||||
@ -70,7 +71,7 @@ void Compiler::compileContract(ContractDefinition const& _contract,
|
||||
|
||||
void Compiler::compileClone(
|
||||
ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, bytes const*> const& _contracts
|
||||
map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
)
|
||||
{
|
||||
m_context = CompilerContext(); // clear it just in case
|
||||
@ -98,11 +99,13 @@ eth::AssemblyItem Compiler::functionEntryLabel(FunctionDefinition const& _functi
|
||||
return m_runtimeContext.functionEntryLabelIfExists(_function);
|
||||
}
|
||||
|
||||
void Compiler::initializeContext(ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, bytes const*> const& _contracts)
|
||||
void Compiler::initializeContext(
|
||||
ContractDefinition const& _contract,
|
||||
map<ContractDefinition const*, eth::Assembly const*> const& _compiledContracts
|
||||
)
|
||||
{
|
||||
CompilerUtils(m_context).initialiseFreeMemoryPointer();
|
||||
m_context.setCompiledContracts(_contracts);
|
||||
m_context.setCompiledContracts(_compiledContracts);
|
||||
m_context.setInheritanceHierarchy(_contract.linearizedBaseContracts());
|
||||
registerStateVariables(_contract);
|
||||
m_context.resetVisitedNodes(&_contract);
|
||||
|
@ -42,16 +42,19 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void compileContract(ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, bytes const*> const& _contracts);
|
||||
void compileContract(
|
||||
ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
);
|
||||
/// Compiles a contract that uses CALLCODE to call into a pre-deployed version of the given
|
||||
/// contract at runtime, but contains the full creation-time code.
|
||||
void compileClone(
|
||||
ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, bytes const*> const& _contracts
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts
|
||||
);
|
||||
bytes assembledBytecode() { return m_context.assembledBytecode(); }
|
||||
bytes runtimeBytecode() { return m_context.assembledRuntimeBytecode(m_runtimeSub); }
|
||||
eth::Assembly const& assembly() { return m_context.assembly(); }
|
||||
eth::LinkerObject assembledObject() { return m_context.assembledObject(); }
|
||||
eth::LinkerObject runtimeObject() { return m_context.assembledRuntimeObject(m_runtimeSub); }
|
||||
/// @arg _sourceCodes is the map of input files to source code strings
|
||||
/// @arg _inJsonFromat shows whether the out should be in Json format
|
||||
Json::Value streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
|
||||
@ -69,8 +72,10 @@ public:
|
||||
|
||||
private:
|
||||
/// Registers the non-function objects inside the contract with the context.
|
||||
void initializeContext(ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, bytes const*> const& _contracts);
|
||||
void initializeContext(
|
||||
ContractDefinition const& _contract,
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> const& _compiledContracts
|
||||
);
|
||||
/// Adds the code that is run at creation time. Should be run after exchanging the run-time context
|
||||
/// with a new and initialized context. Adds the constructor code.
|
||||
void packIntoContractCreator(ContractDefinition const& _contract, CompilerContext const& _runtimeContext);
|
||||
|
@ -65,7 +65,7 @@ void CompilerContext::removeVariable(VariableDeclaration const& _declaration)
|
||||
m_localVariables.erase(&_declaration);
|
||||
}
|
||||
|
||||
bytes const& CompilerContext::compiledContract(const ContractDefinition& _contract) const
|
||||
eth::Assembly const& CompilerContext::compiledContract(const ContractDefinition& _contract) const
|
||||
{
|
||||
auto ret = m_compiledContracts.find(&_contract);
|
||||
solAssert(ret != m_compiledContracts.end(), "Compiled contract not found.");
|
||||
|
@ -47,8 +47,8 @@ public:
|
||||
void addVariable(VariableDeclaration const& _declaration, unsigned _offsetToCurrent = 0);
|
||||
void removeVariable(VariableDeclaration const& _declaration);
|
||||
|
||||
void setCompiledContracts(std::map<ContractDefinition const*, bytes const*> const& _contracts) { m_compiledContracts = _contracts; }
|
||||
bytes const& compiledContract(ContractDefinition const& _contract) const;
|
||||
void setCompiledContracts(std::map<ContractDefinition const*, eth::Assembly const*> const& _contracts) { m_compiledContracts = _contracts; }
|
||||
eth::Assembly const& compiledContract(ContractDefinition const& _contract) const;
|
||||
|
||||
void setStackOffset(int _offset) { m_asm.setDeposit(_offset); }
|
||||
void adjustStackOffset(int _adjustment) { m_asm.adjustDeposit(_adjustment); }
|
||||
@ -135,8 +135,8 @@ public:
|
||||
return m_asm.stream(_stream, "", _sourceCodes, _inJsonFormat);
|
||||
}
|
||||
|
||||
bytes assembledBytecode() { return m_asm.assemble(); }
|
||||
bytes assembledRuntimeBytecode(size_t _subIndex) { m_asm.assemble(); return m_asm.data(u256(_subIndex)); }
|
||||
eth::LinkerObject const& assembledObject() { return m_asm.assemble(); }
|
||||
eth::LinkerObject const& assembledRuntimeObject(size_t _subIndex) { return m_asm.sub(_subIndex).assemble(); }
|
||||
|
||||
/**
|
||||
* Helper class to pop the visited nodes stack when a scope closes
|
||||
@ -164,7 +164,7 @@ private:
|
||||
/// Magic global variables like msg, tx or this, distinguished by type.
|
||||
std::set<Declaration const*> m_magicGlobals;
|
||||
/// Other already compiled contracts to be used in contract creation calls.
|
||||
std::map<ContractDefinition const*, bytes const*> m_compiledContracts;
|
||||
std::map<ContractDefinition const*, eth::Assembly const*> m_compiledContracts;
|
||||
/// Storage offsets of state variables
|
||||
std::map<Declaration const*, std::pair<u256, unsigned>> m_stateVariables;
|
||||
/// Offsets of local variables on the stack (relative to stack base).
|
||||
|
@ -153,7 +153,7 @@ void CompilerStack::compile(bool _optimize, unsigned _runs)
|
||||
if (!m_parseSuccessful)
|
||||
parse();
|
||||
|
||||
map<ContractDefinition const*, bytes const*> contractBytecode;
|
||||
map<ContractDefinition const*, eth::Assembly const*> compiledContracts;
|
||||
for (Source const* source: m_sourceOrder)
|
||||
for (ASTPointer<ASTNode> const& node: source->ast->nodes())
|
||||
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
|
||||
@ -161,26 +161,24 @@ void CompilerStack::compile(bool _optimize, unsigned _runs)
|
||||
if (!contract->isFullyImplemented())
|
||||
continue;
|
||||
shared_ptr<Compiler> compiler = make_shared<Compiler>(_optimize, _runs);
|
||||
compiler->compileContract(*contract, contractBytecode);
|
||||
compiler->compileContract(*contract, compiledContracts);
|
||||
Contract& compiledContract = m_contracts.at(contract->name());
|
||||
compiledContract.bytecode = compiler->assembledBytecode();
|
||||
compiledContract.runtimeBytecode = compiler->runtimeBytecode();
|
||||
compiledContract.compiler = move(compiler);
|
||||
compiler = make_shared<Compiler>(_optimize, _runs);
|
||||
compiler->compileContract(*contract, contractBytecode);
|
||||
contractBytecode[compiledContract.contract] = &compiledContract.bytecode;
|
||||
compiledContract.compiler = compiler;
|
||||
compiledContract.object = compiler->assembledObject();
|
||||
compiledContract.runtimeObject = compiler->runtimeObject();
|
||||
compiledContracts[compiledContract.contract] = &compiler->assembly();
|
||||
|
||||
Compiler cloneCompiler(_optimize, _runs);
|
||||
cloneCompiler.compileClone(*contract, contractBytecode);
|
||||
compiledContract.cloneBytecode = cloneCompiler.assembledBytecode();
|
||||
cloneCompiler.compileClone(*contract, compiledContracts);
|
||||
compiledContract.cloneObject = cloneCompiler.assembledObject();
|
||||
}
|
||||
}
|
||||
|
||||
bytes const& CompilerStack::compile(string const& _sourceCode, bool _optimize)
|
||||
eth::LinkerObject const& CompilerStack::compile(string const& _sourceCode, bool _optimize)
|
||||
{
|
||||
parse(_sourceCode);
|
||||
compile(_optimize);
|
||||
return bytecode();
|
||||
return object();
|
||||
}
|
||||
|
||||
eth::AssemblyItems const* CompilerStack::assemblyItems(string const& _contractName) const
|
||||
@ -195,24 +193,28 @@ eth::AssemblyItems const* CompilerStack::runtimeAssemblyItems(string const& _con
|
||||
return currentContract.compiler ? &contract(_contractName).compiler->runtimeAssemblyItems() : nullptr;
|
||||
}
|
||||
|
||||
bytes const& CompilerStack::bytecode(string const& _contractName) const
|
||||
eth::LinkerObject const& CompilerStack::object(string const& _contractName) const
|
||||
{
|
||||
return contract(_contractName).bytecode;
|
||||
return contract(_contractName).object;
|
||||
}
|
||||
|
||||
bytes const& CompilerStack::runtimeBytecode(string const& _contractName) const
|
||||
eth::LinkerObject const& CompilerStack::runtimeObject(string const& _contractName) const
|
||||
{
|
||||
return contract(_contractName).runtimeBytecode;
|
||||
return contract(_contractName).runtimeObject;
|
||||
}
|
||||
|
||||
bytes const& CompilerStack::cloneBytecode(string const& _contractName) const
|
||||
eth::LinkerObject const& CompilerStack::cloneObject(string const& _contractName) const
|
||||
{
|
||||
return contract(_contractName).cloneBytecode;
|
||||
return contract(_contractName).cloneObject;
|
||||
}
|
||||
|
||||
dev::h256 CompilerStack::contractCodeHash(string const& _contractName) const
|
||||
{
|
||||
return dev::sha3(runtimeBytecode(_contractName));
|
||||
auto const& obj = runtimeObject(_contractName);
|
||||
if (obj.bytecode.empty() || !obj.linkReferences.empty())
|
||||
return dev::h256();
|
||||
else
|
||||
return dev::sha3(obj.bytecode);
|
||||
}
|
||||
|
||||
Json::Value CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName, StringMap _sourceCodes, bool _inJsonFormat) const
|
||||
@ -305,7 +307,7 @@ size_t CompilerStack::functionEntryPoint(
|
||||
return 0;
|
||||
}
|
||||
|
||||
bytes CompilerStack::staticCompile(std::string const& _sourceCode, bool _optimize)
|
||||
eth::LinkerObject CompilerStack::staticCompile(std::string const& _sourceCode, bool _optimize)
|
||||
{
|
||||
CompilerStack stack;
|
||||
return stack.compile(_sourceCode, _optimize);
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <libdevcore/Common.h>
|
||||
#include <libdevcore/FixedHash.h>
|
||||
#include <libevmasm/SourceLocation.h>
|
||||
#include <libevmasm/LinkerObject.h>
|
||||
|
||||
namespace dev
|
||||
{
|
||||
@ -92,23 +93,25 @@ public:
|
||||
/// Compiles the source units that were previously added and parsed.
|
||||
void compile(bool _optimize = false, unsigned _runs = 200);
|
||||
/// Parses and compiles the given source code.
|
||||
/// @returns the compiled bytecode
|
||||
bytes const& compile(std::string const& _sourceCode, bool _optimize = false);
|
||||
/// @returns the compiled linker object
|
||||
eth::LinkerObject const& compile(std::string const& _sourceCode, bool _optimize = false);
|
||||
|
||||
/// @returns the assembled bytecode for a contract.
|
||||
bytes const& bytecode(std::string const& _contractName = "") const;
|
||||
/// @returns the runtime bytecode for the contract, i.e. the code that is returned by the constructor.
|
||||
bytes const& runtimeBytecode(std::string const& _contractName = "") const;
|
||||
/// @returns the assembled bytecode for a contract (empty if it has to be linked or lacks implementation).
|
||||
eth::LinkerObject const& object(std::string const& _contractName = "") const;
|
||||
/// @returns the runtime bytecode for the contract (empty if it has to be linked or lacks implementation).
|
||||
eth::LinkerObject const& runtimeObject(std::string const& _contractName = "") const;
|
||||
/// @returns the bytecode of a contract that uses an already deployed contract via CALLCODE.
|
||||
/// The returned bytes will contain a sequence of 20 bytes of the format "XXX...XXX" which have to
|
||||
/// substituted by the actual address. Note that this sequence starts end ends in three X
|
||||
/// characters but can contain anything in between.
|
||||
bytes const& cloneBytecode(std::string const& _contractName = "") const;
|
||||
eth::LinkerObject const& cloneObject(std::string const& _contractName = "") const;
|
||||
/// @returns normal contract assembly items
|
||||
eth::AssemblyItems const* assemblyItems(std::string const& _contractName = "") const;
|
||||
/// @returns runtime contract assembly items
|
||||
eth::AssemblyItems const* runtimeAssemblyItems(std::string const& _contractName = "") const;
|
||||
/// @returns hash of the runtime bytecode for the contract, i.e. the code that is returned by the constructor.
|
||||
/// @returns hash of the runtime bytecode for the contract, i.e. the code that is
|
||||
/// returned by the constructor or the zero-h256 if the contract still needs to be linked or
|
||||
/// does not have runtime code.
|
||||
dev::h256 contractCodeHash(std::string const& _contractName = "") const;
|
||||
|
||||
/// Streams a verbose version of the assembly to @a _outStream.
|
||||
@ -146,7 +149,7 @@ public:
|
||||
|
||||
/// Compile the given @a _sourceCode to bytecode. If a scanner is provided, it is used for
|
||||
/// scanning the source code - this is useful for printing exception information.
|
||||
static bytes staticCompile(std::string const& _sourceCode, bool _optimize = false);
|
||||
static eth::LinkerObject staticCompile(std::string const& _sourceCode, bool _optimize = false);
|
||||
|
||||
/// Helper function for logs printing. Do only use in error cases, it's quite expensive.
|
||||
/// line and columns are numbered starting from 1 with following order:
|
||||
@ -170,9 +173,9 @@ private:
|
||||
{
|
||||
ContractDefinition const* contract = nullptr;
|
||||
std::shared_ptr<Compiler> compiler;
|
||||
bytes bytecode;
|
||||
bytes runtimeBytecode;
|
||||
bytes cloneBytecode;
|
||||
eth::LinkerObject object;
|
||||
eth::LinkerObject runtimeObject;
|
||||
eth::LinkerObject cloneObject;
|
||||
std::shared_ptr<InterfaceHandler> interfaceHandler;
|
||||
mutable std::unique_ptr<std::string const> interface;
|
||||
mutable std::unique_ptr<std::string const> solidityInterface;
|
||||
|
@ -454,12 +454,11 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
|
||||
ContractDefinition const& contract =
|
||||
dynamic_cast<ContractType const&>(*function.returnParameterTypes().front()).contractDefinition();
|
||||
// copy the contract's code into memory
|
||||
bytes const& bytecode = m_context.compiledContract(contract);
|
||||
eth::Assembly const& assembly = m_context.compiledContract(contract);
|
||||
utils().fetchFreeMemoryPointer();
|
||||
m_context << u256(bytecode.size()) << eth::Instruction::DUP1;
|
||||
//@todo could be done by actually appending the Assembly, but then we probably need to compile
|
||||
// multiple times. Will revisit once external fuctions are inlined.
|
||||
m_context.appendData(bytecode);
|
||||
// pushes size
|
||||
eth::AssemblyItem subroutine = m_context.addSubroutine(assembly);
|
||||
m_context << eth::Instruction::DUP1 << subroutine;
|
||||
m_context << eth::Instruction::DUP4 << eth::Instruction::CODECOPY;
|
||||
|
||||
m_context << eth::Instruction::ADD;
|
||||
|
@ -123,31 +123,31 @@ void CommandLineInterface::handleBinary(string const& _contract)
|
||||
if (m_args.count(g_argBinaryStr))
|
||||
{
|
||||
if (m_args.count("output-dir"))
|
||||
createFile(_contract + ".bin", toHex(m_compiler->bytecode(_contract)));
|
||||
createFile(_contract + ".bin", m_compiler->object(_contract).toHex());
|
||||
else
|
||||
{
|
||||
cout << "Binary: " << endl;
|
||||
cout << toHex(m_compiler->bytecode(_contract)) << endl;
|
||||
cout << m_compiler->object(_contract).toHex() << endl;
|
||||
}
|
||||
}
|
||||
if (m_args.count(g_argCloneBinaryStr))
|
||||
{
|
||||
if (m_args.count("output-dir"))
|
||||
createFile(_contract + ".clone_bin", toHex(m_compiler->cloneBytecode(_contract)));
|
||||
createFile(_contract + ".clone_bin", m_compiler->cloneObject(_contract).toHex());
|
||||
else
|
||||
{
|
||||
cout << "Clone Binary: " << endl;
|
||||
cout << toHex(m_compiler->cloneBytecode(_contract)) << endl;
|
||||
cout << m_compiler->cloneObject(_contract).toHex() << endl;
|
||||
}
|
||||
}
|
||||
if (m_args.count(g_argRuntimeBinaryStr))
|
||||
{
|
||||
if (m_args.count("output-dir"))
|
||||
createFile(_contract + ".bin", toHex(m_compiler->runtimeBytecode(_contract)));
|
||||
createFile(_contract + ".bin", m_compiler->runtimeObject(_contract).toHex());
|
||||
else
|
||||
{
|
||||
cout << "Binary of the runtime part: " << endl;
|
||||
cout << toHex(m_compiler->runtimeBytecode(_contract)) << endl;
|
||||
cout << m_compiler->runtimeObject(_contract).toHex() << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -155,11 +155,11 @@ void CommandLineInterface::handleBinary(string const& _contract)
|
||||
void CommandLineInterface::handleOpcode(string const& _contract)
|
||||
{
|
||||
if (m_args.count("output-dir"))
|
||||
createFile(_contract + ".opcode", eth::disassemble(m_compiler->bytecode(_contract)));
|
||||
createFile(_contract + ".opcode", eth::disassemble(m_compiler->object(_contract).bytecode));
|
||||
else
|
||||
{
|
||||
cout << "Opcodes: " << endl;
|
||||
cout << eth::disassemble(m_compiler->bytecode(_contract));
|
||||
cout << eth::disassemble(m_compiler->object(_contract).bytecode);
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
@ -242,7 +242,7 @@ void CommandLineInterface::handleGasEstimation(string const& _contract)
|
||||
if (eth::AssemblyItems const* items = m_compiler->assemblyItems(_contract))
|
||||
{
|
||||
Gas gas = GasEstimator::functionalEstimation(*items);
|
||||
u256 bytecodeSize(m_compiler->runtimeBytecode(_contract).size());
|
||||
u256 bytecodeSize(m_compiler->runtimeObject(_contract).bytecode.size());
|
||||
cout << "construction:" << endl;
|
||||
cout << " " << gas << " + " << (bytecodeSize * eth::c_createDataGas) << " = ";
|
||||
gas += bytecodeSize * eth::c_createDataGas;
|
||||
@ -500,11 +500,11 @@ void CommandLineInterface::handleCombinedJSON()
|
||||
if (requests.count("abi"))
|
||||
contractData["abi"] = m_compiler->interface(contractName);
|
||||
if (requests.count("bin"))
|
||||
contractData["bin"] = toHex(m_compiler->bytecode(contractName));
|
||||
contractData["bin"] = m_compiler->runtimeObject(contractName).toHex();
|
||||
if (requests.count("clone-bin"))
|
||||
contractData["clone-bin"] = toHex(m_compiler->cloneBytecode(contractName));
|
||||
contractData["clone-bin"] = m_compiler->cloneObject(contractName).toHex();
|
||||
if (requests.count("opcodes"))
|
||||
contractData["opcodes"] = eth::disassemble(m_compiler->bytecode(contractName));
|
||||
contractData["opcodes"] = eth::disassemble(m_compiler->object(contractName).bytecode);
|
||||
if (requests.count("asm"))
|
||||
{
|
||||
ostringstream unused;
|
||||
|
@ -76,7 +76,7 @@ Json::Value estimateGas(CompilerStack const& _compiler, string const& _contract)
|
||||
if (eth::AssemblyItems const* items = _compiler.assemblyItems(_contract))
|
||||
{
|
||||
Gas gas = GasEstimator::functionalEstimation(*items);
|
||||
u256 bytecodeSize(_compiler.runtimeBytecode(_contract).size());
|
||||
u256 bytecodeSize(_compiler.runtimeObject(_contract).bytecode.size());
|
||||
Json::Value creationGas(Json::arrayValue);
|
||||
creationGas[0] = gasToJson(gas);
|
||||
creationGas[1] = gasToJson(bytecodeSize * eth::c_createDataGas);
|
||||
@ -168,8 +168,8 @@ string compile(string _input, bool _optimize)
|
||||
Json::Value contractData(Json::objectValue);
|
||||
contractData["solidity_interface"] = compiler.solidityInterface(contractName);
|
||||
contractData["interface"] = compiler.interface(contractName);
|
||||
contractData["bytecode"] = toHex(compiler.bytecode(contractName));
|
||||
contractData["opcodes"] = eth::disassemble(compiler.bytecode(contractName));
|
||||
contractData["bytecode"] = compiler.object(contractName).toHex();
|
||||
contractData["opcodes"] = eth::disassemble(compiler.object(contractName).bytecode);
|
||||
contractData["functionHashes"] = functionHashes(compiler.contractDefinition(contractName));
|
||||
contractData["gasEstimates"] = estimateGas(compiler, contractName);
|
||||
ostringstream unused;
|
||||
|
@ -233,7 +233,7 @@ protected:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", registrarCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.bytecode("GlobalRegistrar")));
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.object("GlobalRegistrar").bytecode));
|
||||
}
|
||||
sendMessage(*s_compiledRegistrar, true);
|
||||
BOOST_REQUIRE(!m_output.empty());
|
||||
|
@ -125,7 +125,7 @@ protected:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", registrarCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.bytecode("FixedFeeRegistrar")));
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.object("FixedFeeRegistrar").bytecode));
|
||||
}
|
||||
sendMessage(*s_compiledRegistrar, true);
|
||||
BOOST_REQUIRE(!m_output.empty());
|
||||
|
@ -440,7 +440,7 @@ protected:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", walletCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
s_compiledWallet.reset(new bytes(m_compiler.bytecode("Wallet")));
|
||||
s_compiledWallet.reset(new bytes(m_compiler.object("Wallet").bytecode));
|
||||
}
|
||||
bytes args = encodeArgs(u256(0x60), _required, _dailyLimit, u256(_owners.size()), _owners);
|
||||
sendMessage(*s_compiledWallet + args, true, _value);
|
||||
|
@ -66,7 +66,7 @@ eth::AssemblyItems compileContract(const string& _sourceCode)
|
||||
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
|
||||
{
|
||||
Compiler compiler;
|
||||
compiler.compileContract(*contract, map<ContractDefinition const*, bytes const*>{});
|
||||
compiler.compileContract(*contract, map<ContractDefinition const*, Assembly const*>{});
|
||||
|
||||
return compiler.runtimeAssemblyItems();
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
auto state = make_shared<KnownState>();
|
||||
PathGasMeter meter(*m_compiler.assemblyItems());
|
||||
GasMeter::GasConsumption gas = meter.estimateMax(0, state);
|
||||
u256 bytecodeSize(m_compiler.runtimeBytecode().size());
|
||||
u256 bytecodeSize(m_compiler.runtimeObject().bytecode.size());
|
||||
gas += bytecodeSize * c_createDataGas;
|
||||
BOOST_REQUIRE(!gas.isInfinite);
|
||||
BOOST_CHECK(gas.value == m_gasUsed);
|
||||
|
@ -138,7 +138,7 @@ bytes compileFirstExpression(const string& _sourceCode, vector<vector<string>> _
|
||||
|
||||
for (vector<string> const& function: _functions)
|
||||
context << context.functionEntryLabel(dynamic_cast<FunctionDefinition const&>(resolveDeclaration(function, resolver)));
|
||||
bytes instructions = context.assembledBytecode();
|
||||
bytes instructions = context.assembledObject().bytecode;
|
||||
// debug
|
||||
// cout << eth::disassemble(instructions) << endl;
|
||||
return instructions;
|
||||
|
@ -59,7 +59,7 @@ public:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", _sourceCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
bytes code = m_compiler.bytecode(_contractName);
|
||||
bytes code = m_compiler.object(_contractName).bytecode;
|
||||
sendMessage(code + _arguments, true, _value);
|
||||
return m_output;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user