mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Introduce named concept for types.
This commit is contained in:
		
							parent
							
								
									50b200a5d5
								
							
						
					
					
						commit
						e4b31e7230
					
				@ -3029,6 +3029,17 @@ unsigned FunctionType::storageBytes() const
 | 
				
			|||||||
		solAssert(false, "Storage size of non-storable function type requested.");
 | 
							solAssert(false, "Storage size of non-storable function type requested.");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool FunctionType::nameable() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
							(m_kind == Kind::Internal || m_kind == Kind::External) &&
 | 
				
			||||||
 | 
							!m_bound &&
 | 
				
			||||||
 | 
							!m_arbitraryParameters &&
 | 
				
			||||||
 | 
							!m_gasSet &&
 | 
				
			||||||
 | 
							!m_valueSet &&
 | 
				
			||||||
 | 
							!m_saltSet;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vector<tuple<string, TypePointer>> FunctionType::makeStackItems() const
 | 
					vector<tuple<string, TypePointer>> FunctionType::makeStackItems() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	vector<tuple<string, TypePointer>> slots;
 | 
						vector<tuple<string, TypePointer>> slots;
 | 
				
			||||||
 | 
				
			|||||||
@ -263,6 +263,10 @@ public:
 | 
				
			|||||||
	/// Returns true if the type can be stored as a value (as opposed to a reference) on the stack,
 | 
						/// Returns true if the type can be stored as a value (as opposed to a reference) on the stack,
 | 
				
			||||||
	/// i.e. it behaves differently in lvalue context and in value context.
 | 
						/// i.e. it behaves differently in lvalue context and in value context.
 | 
				
			||||||
	virtual bool isValueType() const { return false; }
 | 
						virtual bool isValueType() const { return false; }
 | 
				
			||||||
 | 
						/// @returns true if this type can be used for variables. It returns false for
 | 
				
			||||||
 | 
						/// types like magic types, literals and function types with a kind that is not
 | 
				
			||||||
 | 
						/// internal or external.
 | 
				
			||||||
 | 
						virtual bool nameable() const { return false; }
 | 
				
			||||||
	/// @returns a list of named and typed stack items that determine the layout of this type on the stack.
 | 
						/// @returns a list of named and typed stack items that determine the layout of this type on the stack.
 | 
				
			||||||
	/// A stack item either has an empty name and type ``nullptr`` referring to a single stack slot, or
 | 
						/// A stack item either has an empty name and type ``nullptr`` referring to a single stack slot, or
 | 
				
			||||||
	/// has a non-empty name and a valid type referring to the stack layout of that type.
 | 
						/// has a non-empty name and a valid type referring to the stack layout of that type.
 | 
				
			||||||
@ -402,6 +406,7 @@ public:
 | 
				
			|||||||
	unsigned storageBytes() const override { return 160 / 8; }
 | 
						unsigned storageBytes() const override { return 160 / 8; }
 | 
				
			||||||
	bool leftAligned() const override { return false; }
 | 
						bool leftAligned() const override { return false; }
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
 | 
						MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -446,6 +451,7 @@ public:
 | 
				
			|||||||
	unsigned storageBytes() const override { return m_bits / 8; }
 | 
						unsigned storageBytes() const override { return m_bits / 8; }
 | 
				
			||||||
	bool leftAligned() const override { return false; }
 | 
						bool leftAligned() const override { return false; }
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string toString(bool _short) const override;
 | 
						std::string toString(bool _short) const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -492,6 +498,7 @@ public:
 | 
				
			|||||||
	unsigned storageBytes() const override { return m_totalBits / 8; }
 | 
						unsigned storageBytes() const override { return m_totalBits / 8; }
 | 
				
			||||||
	bool leftAligned() const override { return false; }
 | 
						bool leftAligned() const override { return false; }
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string toString(bool _short) const override;
 | 
						std::string toString(bool _short) const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -639,6 +646,7 @@ public:
 | 
				
			|||||||
	unsigned storageBytes() const override { return m_bytes; }
 | 
						unsigned storageBytes() const override { return m_bytes; }
 | 
				
			||||||
	bool leftAligned() const override { return true; }
 | 
						bool leftAligned() const override { return true; }
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string toString(bool) const override { return "bytes" + util::toString(m_bytes); }
 | 
						std::string toString(bool) const override { return "bytes" + util::toString(m_bytes); }
 | 
				
			||||||
	MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
 | 
						MemberList::MemberMap nativeMembers(ContractDefinition const*) const override;
 | 
				
			||||||
@ -666,6 +674,7 @@ public:
 | 
				
			|||||||
	unsigned storageBytes() const override { return 1; }
 | 
						unsigned storageBytes() const override { return 1; }
 | 
				
			||||||
	bool leftAligned() const override { return false; }
 | 
						bool leftAligned() const override { return false; }
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string toString(bool) const override { return "bool"; }
 | 
						std::string toString(bool) const override { return "bool"; }
 | 
				
			||||||
	u256 literalValue(Literal const* _literal) const override;
 | 
						u256 literalValue(Literal const* _literal) const override;
 | 
				
			||||||
@ -773,6 +782,7 @@ public:
 | 
				
			|||||||
	bool isDynamicallyEncoded() const override;
 | 
						bool isDynamicallyEncoded() const override;
 | 
				
			||||||
	u256 storageSize() const override;
 | 
						u256 storageSize() const override;
 | 
				
			||||||
	bool canLiveOutsideStorage() const override { return m_baseType->canLiveOutsideStorage(); }
 | 
						bool canLiveOutsideStorage() const override { return m_baseType->canLiveOutsideStorage(); }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
	std::string toString(bool _short) const override;
 | 
						std::string toString(bool _short) const override;
 | 
				
			||||||
	std::string canonicalName() const override;
 | 
						std::string canonicalName() const override;
 | 
				
			||||||
	std::string signatureInExternalFunction(bool _structsByName) const override;
 | 
						std::string signatureInExternalFunction(bool _structsByName) const override;
 | 
				
			||||||
@ -875,6 +885,7 @@ public:
 | 
				
			|||||||
	bool leftAligned() const override { solAssert(!isSuper(), ""); return false; }
 | 
						bool leftAligned() const override { solAssert(!isSuper(), ""); return false; }
 | 
				
			||||||
	bool canLiveOutsideStorage() const override { return !isSuper(); }
 | 
						bool canLiveOutsideStorage() const override { return !isSuper(); }
 | 
				
			||||||
	bool isValueType() const override { return !isSuper(); }
 | 
						bool isValueType() const override { return !isSuper(); }
 | 
				
			||||||
 | 
						bool nameable() const override { return !isSuper(); }
 | 
				
			||||||
	std::string toString(bool _short) const override;
 | 
						std::string toString(bool _short) const override;
 | 
				
			||||||
	std::string canonicalName() const override;
 | 
						std::string canonicalName() const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -935,6 +946,7 @@ public:
 | 
				
			|||||||
	u256 memoryDataSize() const override;
 | 
						u256 memoryDataSize() const override;
 | 
				
			||||||
	u256 storageSize() const override;
 | 
						u256 storageSize() const override;
 | 
				
			||||||
	bool canLiveOutsideStorage() const override { return true; }
 | 
						bool canLiveOutsideStorage() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
	std::string toString(bool _short) const override;
 | 
						std::string toString(bool _short) const override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
 | 
						MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
 | 
				
			||||||
@ -997,6 +1009,7 @@ public:
 | 
				
			|||||||
	std::string toString(bool _short) const override;
 | 
						std::string toString(bool _short) const override;
 | 
				
			||||||
	std::string canonicalName() const override;
 | 
						std::string canonicalName() const override;
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override;
 | 
						BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override;
 | 
				
			||||||
	TypePointer encodingType() const override;
 | 
						TypePointer encodingType() const override;
 | 
				
			||||||
@ -1202,6 +1215,7 @@ public:
 | 
				
			|||||||
	bool leftAligned() const override;
 | 
						bool leftAligned() const override;
 | 
				
			||||||
	unsigned storageBytes() const override;
 | 
						unsigned storageBytes() const override;
 | 
				
			||||||
	bool isValueType() const override { return true; }
 | 
						bool isValueType() const override { return true; }
 | 
				
			||||||
 | 
						bool nameable() const override;
 | 
				
			||||||
	bool canLiveOutsideStorage() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
 | 
						bool canLiveOutsideStorage() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
 | 
				
			||||||
	bool hasSimpleZeroValueInMemory() const override { return false; }
 | 
						bool hasSimpleZeroValueInMemory() const override { return false; }
 | 
				
			||||||
	MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
 | 
						MemberList::MemberMap nativeMembers(ContractDefinition const* _currentScope) const override;
 | 
				
			||||||
@ -1339,6 +1353,7 @@ public:
 | 
				
			|||||||
	bool dataStoredIn(DataLocation _location) const override { return _location == DataLocation::Storage; }
 | 
						bool dataStoredIn(DataLocation _location) const override { return _location == DataLocation::Storage; }
 | 
				
			||||||
	/// Cannot be stored in memory, but just in case.
 | 
						/// Cannot be stored in memory, but just in case.
 | 
				
			||||||
	bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
 | 
						bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
 | 
				
			||||||
 | 
						bool nameable() const override { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Type const* keyType() const { return m_keyType; }
 | 
						Type const* keyType() const { return m_keyType; }
 | 
				
			||||||
	Type const* valueType() const { return m_valueType; }
 | 
						Type const* valueType() const { return m_valueType; }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user