From 7eec25b6eb07f1549725884221402a6e692b46e1 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Thu, 26 Mar 2015 12:22:49 +0100 Subject: [PATCH] added createing FunctionType from ArrayType VariableDeclaration added test --- ExpressionCompiler.cpp | 20 ++++++++++++-------- Types.cpp | 17 +++++++++++------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp index daea21623..59781f821 100644 --- a/ExpressionCompiler.cpp +++ b/ExpressionCompiler.cpp @@ -71,16 +71,20 @@ void ExpressionCompiler::appendStateVariableAccessor(VariableDeclaration const& m_context << location.first; TypePointer returnType = _varDecl.getType(); - for (TypePointer const& paramType: paramTypes) + if (ArrayType const* arrayType = dynamic_cast(returnType.get())) { - // 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; + (void)arrayType; + } else + for (TypePointer const& paramType: paramTypes) + { + // 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(*returnType).getValueType(); - } + returnType = dynamic_cast(*returnType).getValueType(); + } unsigned retSizeOnStack = 0; solAssert(accessorType.getReturnParameterTypes().size() >= 1, ""); diff --git a/Types.cpp b/Types.cpp index 78649cc95..0c80a0f7d 100644 --- a/Types.cpp +++ b/Types.cpp @@ -1002,12 +1002,17 @@ FunctionType::FunctionType(VariableDeclaration const& _varDecl): retParamNames.push_back(member.first); retParams.push_back(member.second); } - } - else - { - retParams.push_back(returnType); - retParamNames.push_back(""); - } + } else + if (auto arrayType = dynamic_cast(returnType.get())) + { + params.push_back(make_shared(256)); + paramNames.push_back(""); + returnType = arrayType->getBaseType(); + } else + { + retParams.push_back(returnType); + retParamNames.push_back(""); + } swap(params, m_parameterTypes); swap(paramNames, m_parameterNames);