diff options
author | Liana Husikyan <liana@ethdev.com> | 2015-04-01 20:22:42 +0800 |
---|---|---|
committer | Liana Husikyan <liana@ethdev.com> | 2015-04-08 21:56:35 +0800 |
commit | fb1cf35f3b624b01c56cca4cb1f919134a34082e (patch) | |
tree | eb3ad7b041863afad90551b6de2e8aa78d56b29a /ExpressionCompiler.cpp | |
parent | df3ce3ad8f365ab7842823f4694490ad80a651c5 (diff) | |
download | dexon-solidity-fb1cf35f3b624b01c56cca4cb1f919134a34082e.tar.gz dexon-solidity-fb1cf35f3b624b01c56cca4cb1f919134a34082e.tar.zst dexon-solidity-fb1cf35f3b624b01c56cca4cb1f919134a34082e.zip |
added implementation to append code for State variable accessor
fixed tests
Diffstat (limited to 'ExpressionCompiler.cpp')
-rw-r--r-- | ExpressionCompiler.cpp | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp index 30cc3c6f..92fca636 100644 --- a/ExpressionCompiler.cpp +++ b/ExpressionCompiler.cpp @@ -60,43 +60,37 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const& CompilerContext::LocationSetter locationSetter(m_context, _varDecl); FunctionType accessorType(_varDecl); - unsigned length = 0; TypePointers const& paramTypes = accessorType.getParameterTypes(); - // to exclude the last key if it is an array - TypePointer finalMappingValueType = _varDecl.getType(); - while (finalMappingValueType->getCategory() == Type::Category::Mapping) - finalMappingValueType = dynamic_cast<MappingType const&>(*finalMappingValueType).getValueType(); - - bool finalIsArrayType = finalMappingValueType->getCategory() == Type::Category::Array; - TypePointers mappingKeys(paramTypes); - if (finalIsArrayType) - mappingKeys.pop_back(); - - // move mapping arguments to memory - for (TypePointer const& paramType: boost::adaptors::reverse(mappingKeys)) - length += CompilerUtils(m_context).storeInMemory(length, *paramType, true); - // retrieve the position of the variable auto const& location = m_context.getStorageLocationOfVariable(_varDecl); m_context << location.first; TypePointer returnType = _varDecl.getType(); - for (TypePointer const& paramType: mappingKeys) - { - // move offset to memory - CompilerUtils(m_context).storeInMemory(length); - unsigned argLen = paramType->getCalldataEncodedSize(); - length -= argLen; - m_context << u256(argLen + 32) << u256(length) << eth::Instruction::SHA3; - - returnType = dynamic_cast<MappingType const&>(*returnType).getValueType(); - } - if (finalMappingValueType->isDynamicallySized()) + for (size_t i = 0; i < paramTypes.size(); ++i) { - + if (auto mappingType = dynamic_cast<MappingType const*>(returnType.get())) + { + // move storage offset to memory. + CompilerUtils(m_context).storeInMemory(32); + //move key to memory. + CompilerUtils(m_context).copyToStackTop(paramTypes.size() - i, 1); + CompilerUtils(m_context).storeInMemory(0); + m_context << u256(64) << u256(0) << eth::Instruction::SHA3; + returnType = mappingType->getValueType(); + } + else if (auto arrayType = dynamic_cast<ArrayType const*>(returnType.get())) + { + CompilerUtils(m_context).copyToStackTop(paramTypes.size() - i + 1, 1); + ArrayUtils(m_context).accessIndex(*arrayType); + returnType = arrayType->getBaseType(); + } + else + solAssert(false, "Index access is allowed only for \"mapping\" and \"array\" types."); } + //remove index arguments. + CompilerUtils(m_context).popStackSlots(paramTypes.size()); unsigned retSizeOnStack = 0; solAssert(accessorType.getReturnParameterTypes().size() >= 1, ""); |