aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/CompilerUtils.cpp
diff options
context:
space:
mode:
authorLianaHus <liana@ethdev.com>2015-09-23 23:31:37 +0800
committerLianaHus <liana@ethdev.com>2015-09-23 23:31:37 +0800
commit9547c4563c09fa816330ccd539d393344ac03fb4 (patch)
treea1dbe51789424f933f63dc5ee891c6410203b8bd /libsolidity/CompilerUtils.cpp
parent09f1f1e5955fc358697b49542c6c8eb42496ef10 (diff)
downloaddexon-solidity-9547c4563c09fa816330ccd539d393344ac03fb4.tar.gz
dexon-solidity-9547c4563c09fa816330ccd539d393344ac03fb4.tar.zst
dexon-solidity-9547c4563c09fa816330ccd539d393344ac03fb4.zip
fixed-sized arrays as return type
Conflicts: test/libsolidity/SolidityEndToEndTest.cpp
Diffstat (limited to 'libsolidity/CompilerUtils.cpp')
-rw-r--r--libsolidity/CompilerUtils.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/libsolidity/CompilerUtils.cpp b/libsolidity/CompilerUtils.cpp
index b9b554e8..a77e6536 100644
--- a/libsolidity/CompilerUtils.cpp
+++ b/libsolidity/CompilerUtils.cpp
@@ -86,16 +86,27 @@ void CompilerUtils::loadFromMemoryDynamic(
bool _padToWordBoundaries,
bool _keepUpdatedMemoryOffset
)
-{
- solAssert(_type.category() != Type::Category::Array, "Arrays not yet implemented.");
+{
if (_keepUpdatedMemoryOffset)
m_context << eth::Instruction::DUP1;
- unsigned numBytes = loadFromMemoryHelper(_type, _fromCalldata, _padToWordBoundaries);
- if (_keepUpdatedMemoryOffset)
+
+ if (auto arrayType = dynamic_cast<ArrayType const*>(&_type))
{
- // update memory counter
- moveToStackTop(_type.sizeOnStack());
- m_context << u256(numBytes) << eth::Instruction::ADD;
+ solAssert(!arrayType->isDynamicallySized(), "");
+ solAssert(!_fromCalldata, "");
+ solAssert(_padToWordBoundaries, "");
+ if (_keepUpdatedMemoryOffset)
+ m_context << arrayType->memorySize() << eth::Instruction::ADD;
+ }
+ else
+ {
+ unsigned numBytes = loadFromMemoryHelper(_type, _fromCalldata, _padToWordBoundaries);
+ if (_keepUpdatedMemoryOffset)
+ {
+ // update memory counter
+ moveToStackTop(_type.sizeOnStack());
+ m_context << u256(numBytes) << eth::Instruction::ADD;
+ }
}
}