aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-10-19 17:20:12 +0800
committerGitHub <noreply@github.com>2018-10-19 17:20:12 +0800
commitc13b5280c1b44f18a2a1fb61ef5556e91c5678e7 (patch)
treee5a568e2a1446e91059768976248c6a1b2f3d5c0
parentc676b009e1de3e8f87d43342d6f82d687acbe7fa (diff)
parentc14dfeb8c5ffcc15cff1014a39ffa425aee1430a (diff)
downloaddexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.tar
dexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.tar.gz
dexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.tar.bz2
dexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.tar.lz
dexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.tar.xz
dexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.tar.zst
dexon-solidity-c13b5280c1b44f18a2a1fb61ef5556e91c5678e7.zip
Merge pull request #5256 from ethereum/lvalueCleanup
Lvalue cleanup
-rw-r--r--libsolidity/codegen/LValue.cpp49
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp18
2 files changed, 25 insertions, 42 deletions
diff --git a/libsolidity/codegen/LValue.cpp b/libsolidity/codegen/LValue.cpp
index 77684683..790ab309 100644
--- a/libsolidity/codegen/LValue.cpp
+++ b/libsolidity/codegen/LValue.cpp
@@ -134,8 +134,7 @@ void MemoryItem::storeValue(Type const& _sourceType, SourceLocation const&, bool
void MemoryItem::setToZero(SourceLocation const&, bool _removeReference) const
{
CompilerUtils utils(m_context);
- if (!_removeReference)
- m_context << Instruction::DUP1;
+ solAssert(_removeReference, "");
utils.pushZeroValue(*m_dataType);
utils.storeInMemoryDynamic(*m_dataType, m_padded);
m_context << Instruction::POP;
@@ -460,8 +459,7 @@ void StorageByteArrayElement::storeValue(Type const&, SourceLocation const&, boo
void StorageByteArrayElement::setToZero(SourceLocation const&, bool _removeReference) const
{
// stack: ref byte_number
- if (!_removeReference)
- m_context << Instruction::DUP2 << Instruction::DUP2;
+ solAssert(_removeReference, "");
m_context << u256(31) << Instruction::SUB << u256(0x100) << Instruction::EXP;
// stack: ref (1<<(8*(31-byte_number)))
m_context << Instruction::DUP2 << Instruction::SLOAD;
@@ -498,8 +496,7 @@ void StorageArrayLength::storeValue(Type const&, SourceLocation const&, bool _mo
void StorageArrayLength::setToZero(SourceLocation const&, bool _removeReference) const
{
- if (!_removeReference)
- m_context << Instruction::DUP1;
+ solAssert(_removeReference, "");
ArrayUtils(m_context).clearDynamicArray(m_arrayType);
}
@@ -521,24 +518,9 @@ unsigned TupleObject::sizeOnStack() const
return size;
}
-void TupleObject::retrieveValue(SourceLocation const& _location, bool _remove) const
+void TupleObject::retrieveValue(SourceLocation const&, bool) const
{
- unsigned initialDepth = sizeOnStack();
- unsigned initialStack = m_context.stackHeight();
- for (auto const& lv: m_lvalues)
- if (lv)
- {
- solAssert(initialDepth + m_context.stackHeight() >= initialStack, "");
- unsigned depth = initialDepth + m_context.stackHeight() - initialStack;
- if (lv->sizeOnStack() > 0)
- {
- if (_remove && depth > lv->sizeOnStack())
- CompilerUtils(m_context).moveToStackTop(depth, depth - lv->sizeOnStack());
- else if (!_remove && depth > 0)
- CompilerUtils(m_context).copyToStackTop(depth, lv->sizeOnStack());
- }
- lv->retrieveValue(_location, true);
- }
+ solAssert(false, "Tried to retrieve value of tuple.");
}
void TupleObject::storeValue(Type const& _sourceType, SourceLocation const& _location, bool) const
@@ -569,24 +551,7 @@ void TupleObject::storeValue(Type const& _sourceType, SourceLocation const& _loc
CompilerUtils(m_context).popStackElement(_sourceType);
}
-void TupleObject::setToZero(SourceLocation const& _location, bool _removeReference) const
+void TupleObject::setToZero(SourceLocation const&, bool) const
{
- if (_removeReference)
- {
- for (size_t i = 0; i < m_lvalues.size(); ++i)
- if (m_lvalues[m_lvalues.size() - i])
- m_lvalues[m_lvalues.size() - i]->setToZero(_location, true);
- }
- else
- {
- unsigned depth = sizeOnStack();
- for (auto const& val: m_lvalues)
- if (val)
- {
- if (val->sizeOnStack() > 0)
- CompilerUtils(m_context).copyToStackTop(depth, val->sizeOnStack());
- val->setToZero(_location, false);
- depth -= val->sizeOnStack();
- }
- }
+ solAssert(false, "Tried to delete tuple.");
}
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 133387c8..8d17e56f 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -1787,6 +1787,24 @@ BOOST_AUTO_TEST_CASE(deleteLocals)
ABI_CHECK(callContractFunction("delLocal()"), encodeArgs(6, 7));
}
+BOOST_AUTO_TEST_CASE(deleteLength)
+{
+ char const* sourceCode = R"(
+ contract test {
+ uint[] x;
+ function f() public returns (uint){
+ x.length = 1;
+ x[0] = 1;
+ delete x.length;
+ return x.length;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ ABI_CHECK(callContractFunction("f()"), encodeArgs(0));
+ BOOST_CHECK(storageEmpty(m_contractAddress));
+}
+
BOOST_AUTO_TEST_CASE(constructor)
{
char const* sourceCode = R"(