diff options
author | chriseth <chris@ethereum.org> | 2017-06-13 16:51:49 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2017-09-16 19:12:43 +0800 |
commit | 36a90289e65b06c54326a1c254baa5fa6029f766 (patch) | |
tree | b84191a9460b107396618fe42ad1fada1ba05f67 /libsolidity | |
parent | 823e67bf4014d20c6c83d509264e1464d9578f99 (diff) | |
download | dexon-solidity-36a90289e65b06c54326a1c254baa5fa6029f766.tar.gz dexon-solidity-36a90289e65b06c54326a1c254baa5fa6029f766.tar.zst dexon-solidity-36a90289e65b06c54326a1c254baa5fa6029f766.zip |
Fix interface type conversion internal to structs.
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/ast/Types.cpp | 6 | ||||
-rw-r--r-- | libsolidity/interface/ABI.cpp | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 9fdfe632..14b30df8 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1783,6 +1783,8 @@ TypePointer StructType::interfaceType(bool _inLibrary) const if (_inLibrary && location() == DataLocation::Storage) return shared_from_this(); else if (!recursive()) + // TODO this might not be enough, we have to convert all members to + // their interfaceType return copyForLocation(DataLocation::Memory, true); else return TypePointer(); @@ -1805,7 +1807,9 @@ string StructType::signatureInExternalFunction(bool _structsByName) const auto memberTypeStrings = memberTypes | boost::adaptors::transformed([&](TypePointer _t) -> string { solAssert(_t, "Parameter should have external type."); - return _t->signatureInExternalFunction(_structsByName); + auto t = _t->interfaceType(_structsByName); + solAssert(t, ""); + return t->signatureInExternalFunction(_structsByName); }); return "(" + boost::algorithm::join(memberTypeStrings, ",") + ")"; } diff --git a/libsolidity/interface/ABI.cpp b/libsolidity/interface/ABI.cpp index c04de57e..0e28d010 100644 --- a/libsolidity/interface/ABI.cpp +++ b/libsolidity/interface/ABI.cpp @@ -152,7 +152,9 @@ Json::Value ABI::formatType(string const& _name, Type const& _type, bool _forLib for (auto const& member: structType->members(nullptr)) { solAssert(member.type, ""); - ret["type"].append(formatType(member.name, *member.type, _forLibrary)); + auto t = member.type->interfaceType(_forLibrary); + solAssert(t, ""); + ret["type"].append(formatType(member.name, *t, _forLibrary)); } } else |