diff options
author | RJ Catalano <rj@erisindustries.com> | 2017-01-25 03:05:51 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-25 03:05:51 +0800 |
commit | ba9a04500217e301bec63cab4e0c0f1d9322646d (patch) | |
tree | 27f954262b0a12670ac0780e8e19da08c204b3fb /libsolidity/codegen | |
parent | 3dc83aa34e83d668cde82953f9efa94ebb7de8ed (diff) | |
parent | ead1a3b33fae83ad65210d6f82b2ca12150bf2bb (diff) | |
download | dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.tar dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.tar.gz dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.tar.bz2 dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.tar.lz dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.tar.xz dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.tar.zst dexon-solidity-ba9a04500217e301bec63cab4e0c0f1d9322646d.zip |
Merge pull request #1595 from ethereum/noDuplicatedContracts
Include bytecode of created contracts only once.
Diffstat (limited to 'libsolidity/codegen')
-rw-r--r-- | libsolidity/codegen/ExpressionCompiler.cpp | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 81d3409e..fe0eeb1c 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -556,20 +556,24 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) arg->accept(*this); argumentTypes.push_back(arg->annotation().type); } - ContractDefinition const& contract = - dynamic_cast<ContractType const&>(*function.returnParameterTypes().front()).contractDefinition(); - // copy the contract's code into memory - eth::Assembly const& assembly = m_context.compiledContract(contract); - utils().fetchFreeMemoryPointer(); - // TODO we create a copy here, which is actually what we want. - // This should be revisited at the point where we fix - // https://github.com/ethereum/solidity/issues/1092 - // pushes size - auto subroutine = m_context.addSubroutine(make_shared<eth::Assembly>(assembly)); - m_context << Instruction::DUP1 << subroutine; - m_context << Instruction::DUP4 << Instruction::CODECOPY; - - m_context << Instruction::ADD; + ContractDefinition const* contract = + &dynamic_cast<ContractType const&>(*function.returnParameterTypes().front()).contractDefinition(); + m_context.callLowLevelFunction( + "$copyContractCreationCodeToMemory_" + contract->type()->identifier(), + 0, + 1, + [contract](CompilerContext& _context) + { + // copy the contract's code into memory + eth::Assembly const& assembly = _context.compiledContract(*contract); + CompilerUtils(_context).fetchFreeMemoryPointer(); + // pushes size + auto subroutine = _context.addSubroutine(make_shared<eth::Assembly>(assembly)); + _context << Instruction::DUP1 << subroutine; + _context << Instruction::DUP4 << Instruction::CODECOPY; + _context << Instruction::ADD; + } + ); utils().encodeToMemory(argumentTypes, function.parameterTypes()); // now on stack: memory_end_ptr // need: size, offset, endowment |