Browse Source

added createing FunctionType from ArrayType VariableDeclaration

added test
cl-refactor
Liana Husikyan 10 years ago
parent
commit
561e461ded
  1. 20
      libsolidity/ExpressionCompiler.cpp
  2. 17
      libsolidity/Types.cpp
  3. 13
      test/SolidityEndToEndTest.cpp

20
libsolidity/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<ArrayType const*>(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<MappingType const&>(*returnType).getValueType();
}
returnType = dynamic_cast<MappingType const&>(*returnType).getValueType();
}
unsigned retSizeOnStack = 0;
solAssert(accessorType.getReturnParameterTypes().size() >= 1, "");

17
libsolidity/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<ArrayType const*>(returnType.get()))
{
params.push_back(make_shared<IntegerType>(256));
paramNames.push_back("");
returnType = arrayType->getBaseType();
} else
{
retParams.push_back(returnType);
retParamNames.push_back("");
}
swap(params, m_parameterTypes);
swap(paramNames, m_parameterNames);

13
test/SolidityEndToEndTest.cpp

@ -966,6 +966,19 @@ BOOST_AUTO_TEST_CASE(simple_accessor)
BOOST_CHECK(callContractFunction("data()") == encodeArgs(8));
}
BOOST_AUTO_TEST_CASE(array_accessor)
{
char const* sourceCode = R"(
contract test {
uint[8] datas;
function test() {
datas[2] = 8;
}
})";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("data(2)") == encodeArgs(8));
}
BOOST_AUTO_TEST_CASE(multiple_elementary_accessors)
{
char const* sourceCode = "contract test {\n"

Loading…
Cancel
Save