diff options
author | chriseth <chris@ethereum.org> | 2018-03-16 23:06:40 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2018-03-29 16:57:11 +0800 |
commit | 5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb (patch) | |
tree | 16232775c6f6c4b9257f0f1fde8cbbf9054a152c /libsolidity/ast | |
parent | c2ae33f8067c2ed2a70a86f9e29cce06e23af28a (diff) | |
download | dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.gz dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.bz2 dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.lz dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.xz dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.zst dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.zip |
Prevent encoding of weird types and support packed encoding of external function types.
Diffstat (limited to 'libsolidity/ast')
-rw-r--r-- | libsolidity/ast/Types.cpp | 2 | ||||
-rw-r--r-- | libsolidity/ast/Types.h | 11 |
2 files changed, 10 insertions, 3 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 720215c9..4c462d09 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1262,6 +1262,8 @@ bool ContractType::isPayable() const TypePointer ContractType::unaryOperatorResult(Token::Value _operator) const { + if (isSuper()) + return TypePointer{}; return _operator == Token::Delete ? make_shared<TupleType>() : TypePointer(); } diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index c930dd24..b7e64891 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -692,22 +692,27 @@ public: virtual bool operator==(Type const& _other) const override; virtual unsigned calldataEncodedSize(bool _padded ) const override { + solAssert(!isSuper(), ""); return encodingType()->calldataEncodedSize(_padded); } - virtual unsigned storageBytes() const override { return 20; } - virtual bool canLiveOutsideStorage() const override { return true; } + virtual unsigned storageBytes() const override { solAssert(!isSuper(), ""); return 20; } + virtual bool canLiveOutsideStorage() const override { return !isSuper(); } virtual unsigned sizeOnStack() const override { return m_super ? 0 : 1; } - virtual bool isValueType() const override { return true; } + virtual bool isValueType() const override { return !isSuper(); } virtual std::string toString(bool _short) const override; virtual std::string canonicalName() const override; virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override; virtual TypePointer encodingType() const override { + if (isSuper()) + return TypePointer{}; return std::make_shared<IntegerType>(160, IntegerType::Modifier::Address); } virtual TypePointer interfaceType(bool _inLibrary) const override { + if (isSuper()) + return TypePointer{}; return _inLibrary ? shared_from_this() : encodingType(); } |