aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/ast
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2016-09-29 01:22:23 +0800
committerchriseth <c@ethdev.com>2016-11-16 21:37:17 +0800
commitdd173f83e3a6a9046d1aa7e64cb171598a73b272 (patch)
tree7c5b47b6a4b15a151284d6503af27667993a782b /libsolidity/ast
parentcc8583ec7d6fd86ca7e129475fde32b76d102e79 (diff)
downloaddexon-solidity-dd173f83e3a6a9046d1aa7e64cb171598a73b272.tar.gz
dexon-solidity-dd173f83e3a6a9046d1aa7e64cb171598a73b272.tar.zst
dexon-solidity-dd173f83e3a6a9046d1aa7e64cb171598a73b272.zip
Code generator for function types.
Diffstat (limited to 'libsolidity/ast')
-rw-r--r--libsolidity/ast/Types.cpp12
-rw-r--r--libsolidity/ast/Types.h1
2 files changed, 12 insertions, 1 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index 808b0c55..19a1b9d1 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -2065,6 +2065,16 @@ MemberList::MemberMap FunctionType::nativeMembers(ContractDefinition const*) con
}
}
+TypePointer FunctionType::encodingType() const
+{
+ // Only external functions can be encoded, internal functions cannot leave code boundaries.
+ if (m_location == Location::External)
+ // This looks like bytes24, but bytes24 is stored differently on the stack.
+ return shared_from_this();
+ else
+ return TypePointer();
+}
+
TypePointer FunctionType::interfaceType(bool _inLibrary) const
{
if (m_location != Location::External && m_location != Location::Internal)
@@ -2072,7 +2082,7 @@ TypePointer FunctionType::interfaceType(bool _inLibrary) const
if (_inLibrary)
return shared_from_this();
else
- return make_shared<FixedBytesType>(storageBytes());
+ return make_shared<IntegerType>(8 * storageBytes());
}
bool FunctionType::canTakeArguments(TypePointers const& _argumentTypes, TypePointer const& _selfType) const
diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h
index 358c7efc..691ddf29 100644
--- a/libsolidity/ast/Types.h
+++ b/libsolidity/ast/Types.h
@@ -901,6 +901,7 @@ public:
virtual bool canLiveOutsideStorage() const override { return m_location == Location::Internal || m_location == Location::External; }
virtual unsigned sizeOnStack() const override;
virtual MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
+ virtual TypePointer encodingType() const override;
virtual TypePointer interfaceType(bool _inLibrary) const override;
/// @returns TypePointer of a new FunctionType object. All input/return parameters are an