|
|
@ -498,12 +498,10 @@ void ExpressionCompiler::endVisit(MemberAccess const& _memberAccess) |
|
|
|
case Type::Category::TypeType: |
|
|
|
{ |
|
|
|
TypeType const& type = dynamic_cast<TypeType const&>(*_memberAccess.getExpression().getType()); |
|
|
|
ContractType const* contractType; |
|
|
|
EnumType const* enumType; |
|
|
|
if (!type.getMembers().getMemberType(member)) |
|
|
|
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Invalid member access to " + type.toString())); |
|
|
|
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Invalid member access to " + type.toString())); |
|
|
|
|
|
|
|
if ((contractType = dynamic_cast<ContractType const*>(type.getActualType().get()))) |
|
|
|
if (auto contractType = dynamic_cast<ContractType const*>(type.getActualType().get())) |
|
|
|
{ |
|
|
|
ContractDefinition const& contract = contractType->getContractDefinition(); |
|
|
|
for (ASTPointer<FunctionDefinition> const& function: contract.getDefinedFunctions()) |
|
|
@ -513,12 +511,9 @@ void ExpressionCompiler::endVisit(MemberAccess const& _memberAccess) |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
else if ((enumType = dynamic_cast<EnumType const*>(type.getActualType().get()))) |
|
|
|
{ |
|
|
|
else if (auto enumType = dynamic_cast<EnumType const*>(type.getActualType().get())) |
|
|
|
m_context << enumType->getMemberValue(_memberAccess.getMemberName()); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
case Type::Category::ByteArray: |
|
|
|
{ |
|
|
@ -764,8 +759,11 @@ void ExpressionCompiler::appendTypeConversion(Type const& _typeOnStack, Type con |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if (stackTypeCategory == Type::Category::Enum) |
|
|
|
solAssert(targetTypeCategory == Type::Category::Integer || |
|
|
|
targetTypeCategory == Type::Category::Enum, ""); |
|
|
|
else if (stackTypeCategory == Type::Category::Integer || stackTypeCategory == Type::Category::Contract || |
|
|
|
stackTypeCategory == Type::Category::IntegerConstant || stackTypeCategory == Type::Category::Enum) |
|
|
|
stackTypeCategory == Type::Category::IntegerConstant) |
|
|
|
{ |
|
|
|
if (targetTypeCategory == Type::Category::String && stackTypeCategory == Type::Category::Integer) |
|
|
|
{ |
|
|
@ -777,6 +775,9 @@ void ExpressionCompiler::appendTypeConversion(Type const& _typeOnStack, Type con |
|
|
|
solAssert(typeOnStack.getNumBits() == targetStringType.getNumBytes() * 8, "The size should be the same."); |
|
|
|
m_context << (u256(1) << (256 - typeOnStack.getNumBits())) << eth::Instruction::MUL; |
|
|
|
} |
|
|
|
else if (targetTypeCategory == Type::Category::Enum) |
|
|
|
// just clean
|
|
|
|
appendTypeConversion(_typeOnStack, *_typeOnStack.getRealType(), true); |
|
|
|
else |
|
|
|
{ |
|
|
|
solAssert(targetTypeCategory == Type::Category::Integer || targetTypeCategory == Type::Category::Contract, ""); |
|
|
|