aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGav Wood <g@ethdev.com>2015-04-21 23:32:01 +0800
committerGav Wood <g@ethdev.com>2015-04-21 23:32:01 +0800
commit5f6a396765c722eca567cee930bc7621a6a20807 (patch)
tree43232e413dd1a72f85199498680fce2af7804129
parent8cd5eed17dce30d704ca7187e350e588d896c658 (diff)
parent8125f93b12243836a3c2edea09715a58d1cc1764 (diff)
downloaddexon-solidity-5f6a396765c722eca567cee930bc7621a6a20807.tar.gz
dexon-solidity-5f6a396765c722eca567cee930bc7621a6a20807.tar.zst
dexon-solidity-5f6a396765c722eca567cee930bc7621a6a20807.zip
Merge pull request #1699 from chriseth/sol_fix_contractTypesAsArguments
Fix for Contract and Enum types as external function arguments.
-rw-r--r--AST.h11
-rw-r--r--Types.cpp8
-rw-r--r--Types.h29
3 files changed, 33 insertions, 15 deletions
diff --git a/AST.h b/AST.h
index f5f36f6f..c9ad6447 100644
--- a/AST.h
+++ b/AST.h
@@ -143,8 +143,8 @@ public:
ASTString const& getName() const { return *m_name; }
Visibility getVisibility() const { return m_visibility == Visibility::Default ? getDefaultVisibility() : m_visibility; }
bool isPublic() const { return getVisibility() >= Visibility::Public; }
- bool isVisibleInContract() const { return getVisibility() != Visibility::External; }
- virtual bool isVisibleInDerivedContracts() const { return isVisibleInContract() && getVisibility() >= Visibility::Internal; }
+ virtual bool isVisibleInContract() const { return getVisibility() != Visibility::External; }
+ bool isVisibleInDerivedContracts() const { return isVisibleInContract() && getVisibility() >= Visibility::Internal; }
/// @returns the scope this declaration resides in. Can be nullptr if it is the global scope.
/// Available only after name and type resolution step.
@@ -156,7 +156,7 @@ public:
/// contract types.
virtual TypePointer getType(ContractDefinition const* m_currentContract = nullptr) const = 0;
virtual bool isLValue() const { return false; }
- virtual bool isPartOfExternalInterface() const { return false; };
+ virtual bool isPartOfExternalInterface() const { return false; }
protected:
virtual Visibility getDefaultVisibility() const { return Visibility::Public; }
@@ -443,10 +443,9 @@ public:
ASTPointer<ParameterList> const& getReturnParameterList() const { return m_returnParameters; }
Block const& getBody() const { return *m_body; }
- virtual bool isVisibleInDerivedContracts() const override
+ virtual bool isVisibleInContract() const override
{
- return !isConstructor() && !getName().empty() && isVisibleInContract() &&
- getVisibility() >= Visibility::Internal;
+ return Declaration::isVisibleInContract() && !isConstructor() && !getName().empty();
}
virtual TypePointer getType(ContractDefinition const*) const override;
virtual bool isPartOfExternalInterface() const override { return isPublic() && !m_isConstructor && !getName().empty(); }
diff --git a/Types.cpp b/Types.cpp
index 48796fd0..a445d56e 100644
--- a/Types.cpp
+++ b/Types.cpp
@@ -1128,7 +1128,7 @@ unsigned FunctionType::getSizeOnStack() const
return size;
}
-TypePointer FunctionType::externalType() const
+FunctionTypePointer FunctionType::externalFunctionType() const
{
TypePointers paramTypes;
TypePointers retParamTypes;
@@ -1136,13 +1136,13 @@ TypePointer FunctionType::externalType() const
for (auto type: m_parameterTypes)
{
if (!type->externalType())
- return TypePointer();
+ return FunctionTypePointer();
paramTypes.push_back(type->externalType());
}
for (auto type: m_returnParameterTypes)
{
if (!type->externalType())
- return TypePointer();
+ return FunctionTypePointer();
retParamTypes.push_back(type->externalType());
}
return make_shared<FunctionType>(paramTypes, retParamTypes, m_location, m_arbitraryParameters);
@@ -1218,7 +1218,7 @@ string FunctionType::externalSignature(std::string const& _name) const
}
string ret = funcName + "(";
- TypePointers externalParameterTypes = dynamic_cast<FunctionType const&>(*externalType()).getParameterTypes();
+ TypePointers externalParameterTypes = externalFunctionType()->getParameterTypes();
for (auto it = externalParameterTypes.cbegin(); it != externalParameterTypes.cend(); ++it)
{
solAssert(!!(*it), "Parameter should have external type");
diff --git a/Types.h b/Types.h
index 97c78f3c..ab41d4d4 100644
--- a/Types.h
+++ b/Types.h
@@ -430,12 +430,20 @@ public:
virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
virtual TypePointer unaryOperatorResult(Token::Value _operator) const override;
virtual bool operator==(Type const& _other) const override;
+ virtual unsigned getCalldataEncodedSize(bool _padded = true) const override
+ {
+ return externalType()->getCalldataEncodedSize(_padded);
+ }
virtual unsigned getStorageBytes() const override { return 20; }
+ virtual bool canLiveOutsideStorage() const override { return true; }
virtual bool isValueType() const override { return true; }
virtual std::string toString() const override;
virtual MemberList const& getMembers() const override;
- virtual TypePointer externalType() const override { return std::make_shared<IntegerType>(160, IntegerType::Modifier::Address); }
+ virtual TypePointer externalType() const override
+ {
+ return std::make_shared<IntegerType>(160, IntegerType::Modifier::Address);
+ }
bool isSuper() const { return m_super; }
ContractDefinition const& getContractDefinition() const { return m_contract; }
@@ -498,13 +506,21 @@ public:
explicit EnumType(EnumDefinition const& _enum): m_enum(_enum) {}
virtual TypePointer unaryOperatorResult(Token::Value _operator) const override;
virtual bool operator==(Type const& _other) const override;
+ virtual unsigned getCalldataEncodedSize(bool _padded = true) const override
+ {
+ return externalType()->getCalldataEncodedSize(_padded);
+ }
virtual unsigned getSizeOnStack() const override { return 1; }
virtual unsigned getStorageBytes() const override;
+ virtual bool canLiveOutsideStorage() const override { return true; }
virtual std::string toString() const override;
virtual bool isValueType() const override { return true; }
virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
- virtual TypePointer externalType() const override { return std::make_shared<IntegerType>(8 * int(getStorageBytes())); }
+ virtual TypePointer externalType() const override
+ {
+ return std::make_shared<IntegerType>(8 * int(getStorageBytes()));
+ }
EnumDefinition const& getEnumDefinition() const { return m_enum; }
/// @returns the value that the string has in the Enum
@@ -538,9 +554,12 @@ public:
virtual Category getCategory() const override { return Category::Function; }
- /// @returns TypePointer of a new FunctionType object. All input/return parameters are an appropriate external types of input/return parameters of current function.
- /// Returns an empty shared pointer if one of the input/return parameters does not have an externaltype.
- virtual TypePointer externalType() const override;
+ /// @returns TypePointer of a new FunctionType object. All input/return parameters are an
+ /// appropriate external types of input/return parameters of current function.
+ /// Returns an empty shared pointer if one of the input/return parameters does not have an
+ /// external type.
+ virtual FunctionTypePointer externalFunctionType() const;
+ virtual TypePointer externalType() const override { return externalFunctionType(); }
explicit FunctionType(FunctionDefinition const& _function, bool _isInternal = true);
explicit FunctionType(VariableDeclaration const& _varDecl);