mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #1595 from ethereum/noDuplicatedContracts
Include bytecode of created contracts only once.
This commit is contained in:
commit
ba9a045002
@ -556,20 +556,24 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
|
|||||||
arg->accept(*this);
|
arg->accept(*this);
|
||||||
argumentTypes.push_back(arg->annotation().type);
|
argumentTypes.push_back(arg->annotation().type);
|
||||||
}
|
}
|
||||||
ContractDefinition const& contract =
|
ContractDefinition const* contract =
|
||||||
dynamic_cast<ContractType const&>(*function.returnParameterTypes().front()).contractDefinition();
|
&dynamic_cast<ContractType const&>(*function.returnParameterTypes().front()).contractDefinition();
|
||||||
// copy the contract's code into memory
|
m_context.callLowLevelFunction(
|
||||||
eth::Assembly const& assembly = m_context.compiledContract(contract);
|
"$copyContractCreationCodeToMemory_" + contract->type()->identifier(),
|
||||||
utils().fetchFreeMemoryPointer();
|
0,
|
||||||
// TODO we create a copy here, which is actually what we want.
|
1,
|
||||||
// This should be revisited at the point where we fix
|
[contract](CompilerContext& _context)
|
||||||
// https://github.com/ethereum/solidity/issues/1092
|
{
|
||||||
// pushes size
|
// copy the contract's code into memory
|
||||||
auto subroutine = m_context.addSubroutine(make_shared<eth::Assembly>(assembly));
|
eth::Assembly const& assembly = _context.compiledContract(*contract);
|
||||||
m_context << Instruction::DUP1 << subroutine;
|
CompilerUtils(_context).fetchFreeMemoryPointer();
|
||||||
m_context << Instruction::DUP4 << Instruction::CODECOPY;
|
// pushes size
|
||||||
|
auto subroutine = _context.addSubroutine(make_shared<eth::Assembly>(assembly));
|
||||||
m_context << Instruction::ADD;
|
_context << Instruction::DUP1 << subroutine;
|
||||||
|
_context << Instruction::DUP4 << Instruction::CODECOPY;
|
||||||
|
_context << Instruction::ADD;
|
||||||
|
}
|
||||||
|
);
|
||||||
utils().encodeToMemory(argumentTypes, function.parameterTypes());
|
utils().encodeToMemory(argumentTypes, function.parameterTypes());
|
||||||
// now on stack: memory_end_ptr
|
// now on stack: memory_end_ptr
|
||||||
// need: size, offset, endowment
|
// need: size, offset, endowment
|
||||||
|
@ -8992,6 +8992,35 @@ BOOST_AUTO_TEST_CASE(contracts_separated_with_comment)
|
|||||||
compileAndRun(sourceCode, 0, "C2");
|
compileAndRun(sourceCode, 0, "C2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(include_creation_bytecode_only_once)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract D {
|
||||||
|
bytes a = hex"1237651237125387136581271652831736512837126583171583712358126123765123712538713658127165283173651283712658317158371235812612376512371253871365812716528317365128371265831715837123581261237651237125387136581271652831736512837126583171583712358126";
|
||||||
|
bytes b = hex"1237651237125327136581271252831736512837126583171383712358126123765125712538713658127165253173651283712658357158371235812612376512371a5387136581271652a317365128371265a317158371235812612a765123712538a13658127165a83173651283712a58317158371235a126";
|
||||||
|
function D(uint) {}
|
||||||
|
}
|
||||||
|
contract Double {
|
||||||
|
function f() {
|
||||||
|
new D(2);
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
new D(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contract Single {
|
||||||
|
function f() {
|
||||||
|
new D(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
BOOST_CHECK_LE(
|
||||||
|
double(m_compiler.object("Double").bytecode.size()),
|
||||||
|
1.1 * double(m_compiler.object("Single").bytecode.size())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(recursive_structs)
|
BOOST_AUTO_TEST_CASE(recursive_structs)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
|
Loading…
Reference in New Issue
Block a user