Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1110)

Unified Diff: runtime/vm/object.h

Issue 1815733003: Remove recently introduced FunctionType vm class by merging it into class Type. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comment Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/megamorphic_cache_table.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.h
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 4271a58f28d9962cb82ce48ebf1145cc89adfd1b..9a8d743be1420fc0b17b946727c8fc131bb14d34 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1102,7 +1102,7 @@ class Class : public Object {
bool IsObjectClass() const { return id() == kInstanceCid; }
// Check if this class represents the 'Function' class.
- bool IsFunctionClass() const;
+ bool IsDartFunctionClass() const;
// Check if this class represents the 'Closure' class.
bool IsClosureClass() const { return id() == kClosureCid; }
@@ -1514,7 +1514,6 @@ class Class : public Object {
friend class Instance;
friend class Object;
friend class Type;
- friend class FunctionType;
friend class Intrinsifier;
friend class Precompiler;
};
@@ -2147,16 +2146,16 @@ class Function : public Object {
// Return the type of this function's signature. It may not be canonical yet.
// For example, if this function has a signature of the form
- // '(T, [b: B, c: C]) => R', where 'T' and 'R' are type parameters of the
+ // '(T, [B, C]) => R', where 'T' and 'R' are type parameters of the
// owner class of this function, then its signature type is a parameterized
- // FunctionType with uninstantiated type arguments 'T' and 'R' as elements of
+ // function type with uninstantiated type arguments 'T' and 'R' as elements of
// its type argument vector.
- RawFunctionType* SignatureType() const;
+ RawType* SignatureType() const;
// Update the signature type (with a canonical version).
- void SetSignatureType(const FunctionType& value) const;
+ void SetSignatureType(const Type& value) const;
- // Build a string of the form 'C<T, R>(T, {b: B, c: C}) => R' representing the
+ // Build a string of the form 'C<T, R>(T, {B b, C c}) => R' representing the
// internal signature of the given function. In this example, T and R are
// type parameters of class C, the owner of the function.
RawString* Signature() const {
@@ -2164,7 +2163,7 @@ class Function : public Object {
return BuildSignature(instantiate, kInternalName, TypeArguments::Handle());
}
- // Build a string of the form '(T, {b: B, c: C}) => R' representing the
+ // Build a string of the form '(T, {B b, C c}) => R' representing the
// user visible signature of the given function. In this example, T and R are
// type parameters of class C, the owner of the function, also called the
// scope class of the function type.
@@ -2176,9 +2175,9 @@ class Function : public Object {
instantiate, kUserVisibleName, TypeArguments::Handle());
}
- // Build a string of the form '(A, {b: B, c: C}) => D' representing the
+ // Build a string of the form '(A, {B b, C c}) => D' representing the
// signature of the given function, where all generic types (e.g. '<T, R>' in
- // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given
+ // 'C<T, R>(T, {B b, C c}) => R') are instantiated using the given
// instantiator type argument vector of a C instance (e.g. '<A, D>').
RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator,
NameVisibility name_visibility) const {
@@ -2190,7 +2189,7 @@ class Function : public Object {
// does not involve generic parameter types or generic result type.
bool HasInstantiatedSignature() const;
- // Build a string of the form 'T, {b: B, c: C} representing the user
+ // Build a string of the form 'T, {B b, C c}' representing the user
// visible formal parameters of the function.
RawString* UserVisibleFormalParameters() const;
@@ -2868,8 +2867,8 @@ class ClosureData: public Object {
void set_parent_function(const Function& value) const;
// Signature type of this closure function.
- RawFunctionType* signature_type() const { return raw_ptr()->signature_type_; }
- void set_signature_type(const FunctionType& value) const;
+ RawType* signature_type() const { return raw_ptr()->signature_type_; }
+ void set_signature_type(const Type& value) const;
RawInstance* implicit_static_closure() const {
return raw_ptr()->closure_;
@@ -5330,6 +5329,9 @@ class AbstractType : public Instance {
virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
virtual bool IsRecursive() const;
+ // Check if this type represents a function type.
+ virtual bool IsFunctionType() const { return false; }
+
// Instantiate this type using the given type argument vector.
// Return a new type, or return 'this' if it is already instantiated.
// If bound_error is not NULL, it may be set to reflect a bound error.
@@ -5405,7 +5407,9 @@ class AbstractType : public Instance {
// Check if this type represents the 'dynamic' type.
bool IsDynamicType() const {
- return HasResolvedTypeClass() && (type_class() == Object::dynamic_class());
+ return !IsFunctionType() &&
+ HasResolvedTypeClass() &&
+ (type_class() == Object::dynamic_class());
}
// Check if this type represents the 'Null' type.
@@ -5413,12 +5417,15 @@ class AbstractType : public Instance {
// Check if this type represents the 'void' type.
bool IsVoidType() const {
- return HasResolvedTypeClass() && (type_class() == Object::void_class());
+ return !IsFunctionType() &&
+ HasResolvedTypeClass() &&
+ (type_class() == Object::void_class());
}
bool IsObjectType() const {
- return HasResolvedTypeClass() &&
- Class::Handle(type_class()).IsObjectClass();
+ return !IsFunctionType() &&
+ HasResolvedTypeClass() &&
+ Class::Handle(type_class()).IsObjectClass();
}
// Check if this type represents the 'bool' type.
@@ -5506,6 +5513,7 @@ class Type : public AbstractType {
(raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated);
}
virtual void SetIsFinalized() const;
+ void ResetIsFinalized() const; // Ignore current state and set again.
virtual bool IsBeingFinalized() const {
return raw_ptr()->type_state_ == RawType::kBeingFinalized;
}
@@ -5513,7 +5521,7 @@ class Type : public AbstractType {
virtual bool IsMalformed() const;
virtual bool IsMalbounded() const;
virtual bool IsMalformedOrMalbounded() const;
- virtual RawLanguageError* error() const { return raw_ptr()->error_; }
+ virtual RawLanguageError* error() const;
virtual void set_error(const LanguageError& value) const;
virtual bool IsResolved() const {
return raw_ptr()->type_state_ >= RawType::kResolved;
@@ -5529,6 +5537,12 @@ class Type : public AbstractType {
virtual bool IsInstantiated(TrailPtr trail = NULL) const;
virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
virtual bool IsRecursive() const;
+ // If signature is not null, this type represents a function type.
+ RawFunction* signature() const;
+ void set_signature(const Function& value) const;
+ virtual bool IsFunctionType() const {
+ return signature() != Function::null();
+ }
virtual RawAbstractType* InstantiateFrom(
const TypeArguments& instantiator_type_arguments,
Error* bound_error,
@@ -5594,7 +5608,7 @@ class Type : public AbstractType {
static RawType* ArrayType();
// The 'Function' type.
- static RawType* Function();
+ static RawType* DartFunctionType();
// The finalized type of the given non-parameterized class.
static RawType* NewNonParameterizedType(const Class& type_class);
@@ -5616,106 +5630,6 @@ class Type : public AbstractType {
};
-// TODO(regis): FunctionType is very similar to Type. Instead of a separate
-// class FunctionType, we could consider an object of class Type as representing
-// a function type if it has a non-null function (signature) field.
-// In order to save space, we could reuse the error_ field? A malformed or
-// malbounded function type would lose its function reference, but the error
-// string would contain relevant info.
-
-// A FunctionType describes the signature of a function, i.e. the result type
-// and formal parameter types of the function, as well as the names of optional
-// named formal parameters.
-// If these types refer to type parameters of a class in scope, the function
-// type is generic. A generic function type may be instantiated by a type
-// argument vector.
-// Therefore, a FunctionType consists of a scope class, a type argument vector,
-// and a signature.
-// The scope class is either a generic class (or generic typedef) declaring the
-// type parameters referred to by the signature, or class _Closure in the
-// non-generic case (including the non-generic typedef case).
-// The type arguments specify an instantiation of the generic signature (null in
-// the non-generic case).
-// The signature is a reference to an actual closure function (kClosureFunction)
-// or to a signature function (kSignatureFunction).
-// Since typedefs cannot refer to themselves, directly or indirectly, a
-// FunctionType cannot be recursive. Only individual formal parameter types can.
-class FunctionType : public AbstractType {
- public:
- virtual bool IsFinalized() const {
- return
- (raw_ptr()->type_state_ == RawFunctionType::kFinalizedInstantiated) ||
- (raw_ptr()->type_state_ == RawFunctionType::kFinalizedUninstantiated);
- }
- virtual void SetIsFinalized() const;
- void ResetIsFinalized() const; // Ignore current state and set again.
- virtual bool IsBeingFinalized() const {
- return raw_ptr()->type_state_ == RawFunctionType::kBeingFinalized;
- }
- virtual void SetIsBeingFinalized() const;
- virtual bool IsMalformed() const;
- virtual bool IsMalbounded() const;
- virtual bool IsMalformedOrMalbounded() const;
- virtual RawLanguageError* error() const { return raw_ptr()->error_; }
- virtual void set_error(const LanguageError& value) const;
- virtual bool IsResolved() const {
- return raw_ptr()->type_state_ >= RawFunctionType::kResolved;
- }
- virtual void SetIsResolved() const;
- // The scope class of a FunctionType is always resolved. It has no actual
- // type class. Returning false is important for the type testers to work, e.g.
- // IsDynamicType(), IsBoolType(), etc...
- virtual bool HasResolvedTypeClass() const { return false; }
- // Return scope_class from virtual type_class() to factorize finalization
- // with Type, also a parameterized type.
- virtual RawClass* type_class() const { return scope_class(); }
- RawClass* scope_class() const { return raw_ptr()->scope_class_; }
- void set_scope_class(const Class& value) const;
- virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; }
- virtual void set_arguments(const TypeArguments& value) const;
- RawFunction* signature() const { return raw_ptr()->signature_; }
- virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
- virtual bool IsInstantiated(TrailPtr trail = NULL) const;
- virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
- virtual bool IsRecursive() const;
- virtual RawAbstractType* InstantiateFrom(
- const TypeArguments& instantiator_type_arguments,
- Error* malformed_error,
- TrailPtr instantiation_trail,
- TrailPtr bound_trail,
- Heap::Space space) const;
- virtual RawAbstractType* CloneUnfinalized() const;
- virtual RawAbstractType* CloneUninstantiated(
- const Class& new_owner,
- TrailPtr trail = NULL) const;
- virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
- virtual RawString* EnumerateURIs() const;
-
- virtual intptr_t Hash() const;
-
- static intptr_t InstanceSize() {
- return RoundedAllocationSize(sizeof(RawFunctionType));
- }
-
- static RawFunctionType* New(const Class& scope_class,
- const TypeArguments& arguments,
- const Function& signature,
- TokenPosition token_pos,
- Heap::Space space = Heap::kOld);
-
- private:
- void set_signature(const Function& value) const;
- void set_token_pos(TokenPosition token_pos) const;
- void set_type_state(int8_t state) const;
-
- static RawFunctionType* New(Heap::Space space = Heap::kOld);
-
- FINAL_HEAP_OBJECT_IMPLEMENTATION(FunctionType, AbstractType);
- friend class Class;
- friend class TypeArguments;
-};
-
-
// A TypeRef is used to break cycles in the representation of recursive types.
// Its only field is the recursive AbstractType it refers to.
// Note that the cycle always involves type arguments.
@@ -5738,7 +5652,6 @@ class TypeRef : public AbstractType {
}
virtual bool IsResolved() const { return true; }
virtual bool HasResolvedTypeClass() const {
- // Returns false if the ref type is a function type.
return AbstractType::Handle(type()).HasResolvedTypeClass();
}
RawAbstractType* type() const { return raw_ptr()->type_; }
« no previous file with comments | « runtime/vm/megamorphic_cache_table.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698