aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/codegen/CompilerUtils.cpp
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-11-26 22:28:28 +0800
committerchriseth <c@ethdev.com>2015-11-26 22:28:28 +0800
commitc498dcce22b2921ee57f280da9117e491c021e1b (patch)
tree1eb3bec6140d9b2e1ee57f62343dbc9c70d84c78 /libsolidity/codegen/CompilerUtils.cpp
parentcd94aa978a77ace1296f9978bfae6d8735b5c91d (diff)
parente06768e8b580d009b9a9905f70ae2d8814699115 (diff)
downloaddexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.tar
dexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.tar.gz
dexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.tar.bz2
dexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.tar.lz
dexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.tar.xz
dexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.tar.zst
dexon-solidity-c498dcce22b2921ee57f280da9117e491c021e1b.zip
Merge pull request #222 from chriseth/newArrays
Dynamically create memory arrays.
Diffstat (limited to 'libsolidity/codegen/CompilerUtils.cpp')
-rw-r--r--libsolidity/codegen/CompilerUtils.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp
index 2ebf5b64..357013e6 100644
--- a/libsolidity/codegen/CompilerUtils.cpp
+++ b/libsolidity/codegen/CompilerUtils.cpp
@@ -266,6 +266,19 @@ void CompilerUtils::encodeToMemory(
popStackSlots(argSize + dynPointers + 1);
}
+void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type)
+{
+ auto repeat = m_context.newTag();
+ m_context << repeat;
+ pushZeroValue(*_type.baseType());
+ storeInMemoryDynamic(*_type.baseType());
+ m_context << eth::Instruction::SWAP1 << u256(1) << eth::Instruction::SWAP1;
+ m_context << eth::Instruction::SUB << eth::Instruction::SWAP1;
+ m_context << eth::Instruction::DUP2;
+ m_context.appendConditionalJumpTo(repeat);
+ m_context << eth::Instruction::SWAP1 << eth::Instruction::POP;
+}
+
void CompilerUtils::memoryCopy()
{
// Stack here: size target source
@@ -646,15 +659,8 @@ void CompilerUtils::pushZeroValue(Type const& _type)
{
m_context << arrayType->length() << eth::Instruction::SWAP1;
// stack: items_to_do memory_pos
- auto repeat = m_context.newTag();
- m_context << repeat;
- pushZeroValue(*arrayType->baseType());
- storeInMemoryDynamic(*arrayType->baseType());
- m_context << eth::Instruction::SWAP1 << u256(1) << eth::Instruction::SWAP1;
- m_context << eth::Instruction::SUB << eth::Instruction::SWAP1;
- m_context << eth::Instruction::DUP2;
- m_context.appendConditionalJumpTo(repeat);
- m_context << eth::Instruction::SWAP1 << eth::Instruction::POP;
+ zeroInitialiseMemoryArray(*arrayType);
+ // stack: updated_memory_pos
}
}
else