Replace TypePointer with Type const*

This commit is contained in:
Mathias Baumann
2021-03-23 11:47:19 +01:00
parent 8c583784c0
commit e197ebbdd1
50 changed files with 347 additions and 353 deletions
+53 -54
View File
@@ -48,11 +48,10 @@ namespace solidity::frontend
class TypeProvider;
class Type; // forward
class FunctionType; // forward
using TypePointer = Type const*;
using FunctionTypePointer = FunctionType const*;
using TypePointers = std::vector<TypePointer>;
using TypePointers = std::vector<Type const*>;
using rational = boost::rational<bigint>;
using TypeResult = util::Result<TypePointer>;
using TypeResult = util::Result<Type const*>;
using BoolResult = util::Result<bool>;
}
@@ -122,9 +121,9 @@ public:
explicit MemberList(MemberMap _members): m_memberTypes(std::move(_members)) {}
void combine(MemberList const& _other);
TypePointer memberType(std::string const& _name) const
Type const* memberType(std::string const& _name) const
{
TypePointer type = nullptr;
Type const* type = nullptr;
for (auto const& it: m_memberTypes)
if (it.name == _name)
{
@@ -181,7 +180,7 @@ public:
};
/// @returns a pointer to _a or _b if the other is implicitly convertible to it or nullptr otherwise
static TypePointer commonType(Type const* _a, Type const* _b);
static Type const* commonType(Type const* _a, Type const* _b);
virtual Category category() const = 0;
/// @returns a valid solidity identifier such that two types should compare equal if and
@@ -292,7 +291,7 @@ public:
/// The complete layout of a type on the stack can be obtained from its stack items recursively as follows:
/// - Each unnamed stack item is untyped (its type is ``nullptr``) and contributes exactly one stack slot.
/// - Each named stack item is typed and contributes the stack slots given by the stack items of its type.
std::vector<std::tuple<std::string, TypePointer>> const& stackItems() const
std::vector<std::tuple<std::string, Type const*>> const& stackItems() const
{
if (!m_stackItems)
m_stackItems = makeStackItems();
@@ -321,14 +320,14 @@ public:
/// This returns the corresponding IntegerType or FixedPointType for RationalNumberType
/// and the pointer type for storage reference types.
/// Might return a null pointer if there is no fitting type.
virtual TypePointer mobileType() const { return this; }
virtual Type const* mobileType() const { return this; }
/// @returns true if this is a non-value type and the data of this type is stored at the
/// given location.
virtual bool dataStoredIn(DataLocation) const { return false; }
/// @returns the type of a temporary during assignment to a variable of the given type.
/// Specifically, returns the requested itself if it can be dynamically allocated (or is a value type)
/// and the mobile type otherwise.
virtual TypePointer closestTemporaryType(Type const* _targetType) const
virtual Type const* closestTemporaryType(Type const* _targetType) const
{
return _targetType->dataStoredIn(DataLocation::Storage) ? mobileType() : _targetType;
}
@@ -337,7 +336,7 @@ public:
/// @param _currentScope scope in which the members are accessed.
MemberList const& members(ASTNode const* _currentScope) const;
/// Convenience method, returns the type of the given named member or an empty pointer if no such member exists.
TypePointer memberType(std::string const& _name, ASTNode const* _currentScope = nullptr) const
Type const* memberType(std::string const& _name, ASTNode const* _currentScope = nullptr) const
{
return members(_currentScope).memberType(_name);
}
@@ -361,14 +360,14 @@ public:
/// @returns a (simpler) type that is encoded in the same way for external function calls.
/// This for example returns address for contract types.
/// If there is no such type, returns an empty shared pointer.
virtual TypePointer encodingType() const { return nullptr; }
virtual Type const* encodingType() const { return nullptr; }
/// @returns the encoding type used under the given circumstances for the type of an expression
/// when used for e.g. abi.encode(...) or the empty pointer if the object
/// cannot be encoded.
/// This is different from encodingType since it takes implicit conversions into account.
TypePointer fullEncodingType(bool _inLibraryCall, bool _encoderV2, bool _packed) const;
Type const* fullEncodingType(bool _inLibraryCall, bool _encoderV2, bool _packed) const;
/// @returns a (simpler) type that is used when decoding this type in calldata.
virtual TypePointer decodingType() const { return encodingType(); }
virtual Type const* decodingType() const { return encodingType(); }
/// @returns a type that will be used outside of Solidity for e.g. function signatures.
/// This for example returns address for contract types.
/// If there is no such type, returns an empty shared pointer.
@@ -392,7 +391,7 @@ protected:
}
/// Generates the stack items to be returned by ``stackItems()``. Defaults
/// to exactly one unnamed and untyped stack item referring to a single stack slot.
virtual std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const
virtual std::vector<std::tuple<std::string, Type const*>> makeStackItems() const
{
return {std::make_tuple(std::string(), nullptr)};
}
@@ -400,7 +399,7 @@ protected:
/// List of member types (parameterised by scape), will be lazy-initialized.
mutable std::map<ASTNode const*, std::unique_ptr<MemberList>> m_members;
mutable std::optional<std::vector<std::tuple<std::string, TypePointer>>> m_stackItems;
mutable std::optional<std::vector<std::tuple<std::string, Type const*>>> m_stackItems;
mutable std::optional<size_t> m_stackSize;
};
@@ -435,7 +434,7 @@ public:
u256 literalValue(Literal const* _literal) const override;
TypePointer encodingType() const override { return this; }
Type const* encodingType() const override { return this; }
TypeResult interfaceType(bool) const override { return this; }
StateMutability stateMutability(void) const { return m_stateMutability; }
@@ -475,7 +474,7 @@ public:
std::string toString(bool _short) const override;
TypePointer encodingType() const override { return this; }
Type const* encodingType() const override { return this; }
TypeResult interfaceType(bool) const override { return this; }
unsigned numBits() const { return m_bits; }
@@ -522,7 +521,7 @@ public:
std::string toString(bool _short) const override;
TypePointer encodingType() const override { return this; }
Type const* encodingType() const override { return this; }
TypeResult interfaceType(bool) const override { return this; }
/// Number of bits used for this type in total.
@@ -572,7 +571,7 @@ public:
std::string toString(bool _short) const override;
u256 literalValue(Literal const* _literal) const override;
TypePointer mobileType() const override;
Type const* mobileType() const override;
/// @returns the underlying raw literal value.
///
@@ -603,7 +602,7 @@ private:
/// Bytes type to which the rational can be explicitly converted.
/// Empty for all rationals that are not directly parsed from hex literals.
TypePointer m_compatibleBytesType;
Type const* m_compatibleBytesType;
/// @returns true if the literal is a valid rational number.
static std::tuple<bool, rational> parseRational(std::string const& _value);
@@ -636,12 +635,12 @@ public:
bool canBeStored() const override { return false; }
std::string toString(bool) const override;
TypePointer mobileType() const override;
Type const* mobileType() const override;
std::string const& value() const { return m_value; }
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override { return {}; }
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override { return {}; }
private:
std::string m_value;
};
@@ -671,7 +670,7 @@ public:
std::string toString(bool) const override { return "bytes" + util::toString(m_bytes); }
MemberList::MemberMap nativeMembers(ASTNode const*) const override;
TypePointer encodingType() const override { return this; }
Type const* encodingType() const override { return this; }
TypeResult interfaceType(bool) const override { return this; }
unsigned numBytes() const { return m_bytes; }
@@ -699,7 +698,7 @@ public:
std::string toString(bool) const override { return "bool"; }
u256 literalValue(Literal const* _literal) const override;
TypePointer encodingType() const override { return this; }
Type const* encodingType() const override { return this; }
TypeResult interfaceType(bool) const override { return this; }
};
@@ -756,7 +755,7 @@ public:
/// whereas isPointer is only shallowly changed - the deep copy is always a bound reference.
virtual std::unique_ptr<ReferenceType> copyForLocation(DataLocation _location, bool _isPointer) const = 0;
TypePointer mobileType() const override { return withLocation(m_location, true); }
Type const* mobileType() const override { return withLocation(m_location, true); }
bool dataStoredIn(DataLocation _location) const override { return m_location == _location; }
bool hasSimpleZeroValueInMemory() const override { return false; }
@@ -838,8 +837,8 @@ public:
std::string canonicalName() const override;
std::string signatureInExternalFunction(bool _structsByName) const override;
MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override;
TypePointer encodingType() const override;
TypePointer decodingType() const override;
Type const* encodingType() const override;
Type const* decodingType() const override;
TypeResult interfaceType(bool _inLibrary) const override;
BoolResult validForLocation(DataLocation _loc) const override;
@@ -865,7 +864,7 @@ public:
void clearCache() const override;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
std::vector<Type const*> decomposition() const override { return {m_baseType}; }
private:
@@ -897,7 +896,7 @@ public:
bool isDynamicallySized() const override { return true; }
bool isDynamicallyEncoded() const override { return true; }
std::string toString(bool _short) const override;
TypePointer mobileType() const override;
Type const* mobileType() const override;
BoolResult validForLocation(DataLocation _loc) const override { return m_arrayType.validForLocation(_loc); }
@@ -907,7 +906,7 @@ public:
std::unique_ptr<ReferenceType> copyForLocation(DataLocation, bool) const override { solAssert(false, ""); }
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
std::vector<Type const*> decomposition() const override { return {m_arrayType.baseType()}; }
private:
@@ -972,7 +971,7 @@ public:
/// @returns a list of all immutable variables (including inherited) of the contract.
std::vector<VariableDeclaration const*> immutableVariables() const;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
private:
ContractDefinition const& m_contract;
/// If true, this is a special "super" type of m_contract containing only members that m_contract inherited
@@ -1034,7 +1033,7 @@ public:
void clearCache() const override;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
std::vector<Type const*> decomposition() const override;
private:
@@ -1068,7 +1067,7 @@ public:
bool nameable() const override { return true; }
BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override;
TypePointer encodingType() const override;
Type const* encodingType() const override;
TypeResult interfaceType(bool _inLibrary) const override
{
return _inLibrary ? this : encodingType();
@@ -1090,7 +1089,7 @@ private:
class TupleType: public CompositeType
{
public:
explicit TupleType(std::vector<TypePointer> _types = {}): m_components(std::move(_types)) {}
explicit TupleType(std::vector<Type const*> _types = {}): m_components(std::move(_types)) {}
Category category() const override { return Category::Tuple; }
@@ -1102,14 +1101,14 @@ public:
bool canBeStored() const override { return false; }
u256 storageSize() const override;
bool hasSimpleZeroValueInMemory() const override { return false; }
TypePointer mobileType() const override;
Type const* mobileType() const override;
/// Converts components to their temporary types and performs some wildcard matching.
TypePointer closestTemporaryType(Type const* _targetType) const override;
Type const* closestTemporaryType(Type const* _targetType) const override;
std::vector<TypePointer> const& components() const { return m_components; }
std::vector<Type const*> const& components() const { return m_components; }
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
std::vector<Type const*> decomposition() const override
{
// Currently calling TupleType::decomposition() is not expected, because we cannot declare a variable of a tuple type.
@@ -1121,7 +1120,7 @@ protected:
}
private:
std::vector<TypePointer> const m_components;
std::vector<Type const*> const m_components;
};
/**
@@ -1278,11 +1277,11 @@ public:
bool nameable() const override;
bool hasSimpleZeroValueInMemory() const override { return false; }
MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override;
TypePointer encodingType() const override;
Type const* encodingType() const override;
TypeResult interfaceType(bool _inLibrary) const override;
TypePointer mobileType() const override;
Type const* mobileType() const override;
/// @returns TypePointer of a new FunctionType object. All input/return parameters are an
/// @returns Type const* of a new FunctionType object. All input/return parameters are an
/// appropriate external types (i.e. the interfaceType()s) of input/return parameters of
/// current function.
/// @returns an empty shared pointer if one of the input/return parameters does not have an
@@ -1360,7 +1359,7 @@ public:
/// @returns a copy of this type, where gas or value are set manually. This will never set one
/// of the parameters to false.
TypePointer copyAndSetCallOptions(bool _setGas, bool _setValue, bool _setSalt) const;
Type const* copyAndSetCallOptions(bool _setGas, bool _setValue, bool _setSalt) const;
/// @returns a copy of this function type with the `bound` flag set to true.
/// Should only be called on library functions.
@@ -1374,7 +1373,7 @@ public:
FunctionTypePointer asExternallyCallableFunction(bool _inLibrary) const;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
private:
static TypePointers parseElementaryTypeVector(strings const& _types);
@@ -1427,8 +1426,8 @@ protected:
std::vector<Type const*> decomposition() const override { return {m_valueType}; }
private:
TypePointer m_keyType;
TypePointer m_valueType;
Type const* m_keyType;
Type const* m_valueType;
};
/**
@@ -1455,9 +1454,9 @@ public:
BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override;
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override;
private:
TypePointer m_actualType;
Type const* m_actualType;
};
@@ -1479,7 +1478,7 @@ public:
bool operator==(Type const& _other) const override;
std::string toString(bool _short) const override;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override { return {}; }
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override { return {}; }
private:
TypePointers m_parameterTypes;
};
@@ -1506,7 +1505,7 @@ public:
std::string toString(bool _short) const override;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override { return {}; }
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override { return {}; }
private:
SourceUnit const& m_sourceUnit;
};
@@ -1546,14 +1545,14 @@ public:
Kind kind() const { return m_kind; }
TypePointer typeArgument() const;
Type const* typeArgument() const;
protected:
std::vector<std::tuple<std::string, TypePointer>> makeStackItems() const override { return {}; }
std::vector<std::tuple<std::string, Type const*>> makeStackItems() const override { return {}; }
private:
Kind m_kind;
/// Contract type used for contract metadata magic.
TypePointer m_typeArgument;
Type const* m_typeArgument;
};
/**
@@ -1574,7 +1573,7 @@ public:
bool isValueType() const override { return true; }
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
std::string toString(bool) const override { return "inaccessible dynamic type"; }
TypePointer decodingType() const override;
Type const* decodingType() const override;
};
}