mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #756 from chriseth/alloczero
Bugfix: Allocate empty array.
This commit is contained in:
commit
56727d61a6
@ -104,6 +104,7 @@ public:
|
||||
);
|
||||
|
||||
/// Zero-initialises (the data part of) an already allocated memory array.
|
||||
/// Length has to be nonzero!
|
||||
/// Stack pre: <length> <memptr>
|
||||
/// Stack post: <updated_memptr>
|
||||
void zeroInitialiseMemoryArray(ArrayType const& _type);
|
||||
|
@ -792,15 +792,18 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
|
||||
utils().storeFreeMemoryPointer();
|
||||
// Stack: memptr requested_length
|
||||
|
||||
// Check if length is zero
|
||||
m_context << Instruction::DUP1 << Instruction::ISZERO;
|
||||
auto skipInit = m_context.appendConditionalJump();
|
||||
|
||||
// We only have to initialise if the base type is a not a value type.
|
||||
if (dynamic_cast<ReferenceType const*>(arrayType.baseType().get()))
|
||||
{
|
||||
m_context << Instruction::DUP2 << u256(32) << Instruction::ADD;
|
||||
utils().zeroInitialiseMemoryArray(arrayType);
|
||||
m_context << Instruction::POP;
|
||||
}
|
||||
else
|
||||
m_context << Instruction::POP;
|
||||
m_context << skipInit;
|
||||
m_context << Instruction::POP;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -6837,6 +6837,20 @@ BOOST_AUTO_TEST_CASE(skip_dynamic_types_for_structs)
|
||||
BOOST_CHECK(callContractFunction("g()") == encodeArgs(u256(2), u256(6)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(create_dynamic_array_with_zero_length)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
function f() returns (uint) {
|
||||
var a = new uint[][](0);
|
||||
return 7;
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "C");
|
||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(7)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user