| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
| 6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1095 // Check if this class represents the 'dynamic' class. | 1095 // Check if this class represents the 'dynamic' class. |
| 1096 bool IsDynamicClass() const { return id() == kDynamicCid; } | 1096 bool IsDynamicClass() const { return id() == kDynamicCid; } |
| 1097 | 1097 |
| 1098 // Check if this class represents the 'void' class. | 1098 // Check if this class represents the 'void' class. |
| 1099 bool IsVoidClass() const { return id() == kVoidCid; } | 1099 bool IsVoidClass() const { return id() == kVoidCid; } |
| 1100 | 1100 |
| 1101 // Check if this class represents the 'Object' class. | 1101 // Check if this class represents the 'Object' class. |
| 1102 bool IsObjectClass() const { return id() == kInstanceCid; } | 1102 bool IsObjectClass() const { return id() == kInstanceCid; } |
| 1103 | 1103 |
| 1104 // Check if this class represents the 'Function' class. | 1104 // Check if this class represents the 'Function' class. |
| 1105 bool IsFunctionClass() const; | 1105 bool IsDartFunctionClass() const; |
| 1106 | 1106 |
| 1107 // Check if this class represents the 'Closure' class. | 1107 // Check if this class represents the 'Closure' class. |
| 1108 bool IsClosureClass() const { return id() == kClosureCid; } | 1108 bool IsClosureClass() const { return id() == kClosureCid; } |
| 1109 static bool IsClosureClass(RawClass* cls) { | 1109 static bool IsClosureClass(RawClass* cls) { |
| 1110 NoSafepointScope no_safepoint; | 1110 NoSafepointScope no_safepoint; |
| 1111 return cls->ptr()->id_ == kClosureCid; | 1111 return cls->ptr()->id_ == kClosureCid; |
| 1112 } | 1112 } |
| 1113 | 1113 |
| 1114 // Check if this class represents a typedef class. | 1114 // Check if this class represents a typedef class. |
| 1115 bool IsTypedefClass() const { | 1115 bool IsTypedefClass() const { |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1507 | 1507 |
| 1508 // Returns canonical type. Thread safe. | 1508 // Returns canonical type. Thread safe. |
| 1509 RawAbstractType* LookupOrAddCanonicalType(const AbstractType& type, | 1509 RawAbstractType* LookupOrAddCanonicalType(const AbstractType& type, |
| 1510 intptr_t start_index) const; | 1510 intptr_t start_index) const; |
| 1511 | 1511 |
| 1512 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); | 1512 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); |
| 1513 friend class AbstractType; | 1513 friend class AbstractType; |
| 1514 friend class Instance; | 1514 friend class Instance; |
| 1515 friend class Object; | 1515 friend class Object; |
| 1516 friend class Type; | 1516 friend class Type; |
| 1517 friend class FunctionType; | |
| 1518 friend class Intrinsifier; | 1517 friend class Intrinsifier; |
| 1519 friend class Precompiler; | 1518 friend class Precompiler; |
| 1520 }; | 1519 }; |
| 1521 | 1520 |
| 1522 | 1521 |
| 1523 // Unresolved class is used for storing unresolved names which will be resolved | 1522 // Unresolved class is used for storing unresolved names which will be resolved |
| 1524 // to a class after all classes have been loaded and finalized. | 1523 // to a class after all classes have been loaded and finalized. |
| 1525 class UnresolvedClass : public Object { | 1524 class UnresolvedClass : public Object { |
| 1526 public: | 1525 public: |
| 1527 RawLibraryPrefix* library_prefix() const { | 1526 RawLibraryPrefix* library_prefix() const { |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 } | 2139 } |
| 2141 RawString* QualifiedUserVisibleName() const { | 2140 RawString* QualifiedUserVisibleName() const { |
| 2142 return QualifiedName(kUserVisibleName); | 2141 return QualifiedName(kUserVisibleName); |
| 2143 } | 2142 } |
| 2144 virtual RawString* DictionaryName() const { return name(); } | 2143 virtual RawString* DictionaryName() const { return name(); } |
| 2145 | 2144 |
| 2146 RawString* GetSource() const; | 2145 RawString* GetSource() const; |
| 2147 | 2146 |
| 2148 // Return the type of this function's signature. It may not be canonical yet. | 2147 // Return the type of this function's signature. It may not be canonical yet. |
| 2149 // For example, if this function has a signature of the form | 2148 // For example, if this function has a signature of the form |
| 2150 // '(T, [b: B, c: C]) => R', where 'T' and 'R' are type parameters of the | 2149 // '(T, [B, C]) => R', where 'T' and 'R' are type parameters of the |
| 2151 // owner class of this function, then its signature type is a parameterized | 2150 // owner class of this function, then its signature type is a parameterized |
| 2152 // FunctionType with uninstantiated type arguments 'T' and 'R' as elements of | 2151 // function type with uninstantiated type arguments 'T' and 'R' as elements of |
| 2153 // its type argument vector. | 2152 // its type argument vector. |
| 2154 RawFunctionType* SignatureType() const; | 2153 RawType* SignatureType() const; |
| 2155 | 2154 |
| 2156 // Update the signature type (with a canonical version). | 2155 // Update the signature type (with a canonical version). |
| 2157 void SetSignatureType(const FunctionType& value) const; | 2156 void SetSignatureType(const Type& value) const; |
| 2158 | 2157 |
| 2159 // Build a string of the form 'C<T, R>(T, {b: B, c: C}) => R' representing the | 2158 // Build a string of the form 'C<T, R>(T, {B b, C c}) => R' representing the |
| 2160 // internal signature of the given function. In this example, T and R are | 2159 // internal signature of the given function. In this example, T and R are |
| 2161 // type parameters of class C, the owner of the function. | 2160 // type parameters of class C, the owner of the function. |
| 2162 RawString* Signature() const { | 2161 RawString* Signature() const { |
| 2163 const bool instantiate = false; | 2162 const bool instantiate = false; |
| 2164 return BuildSignature(instantiate, kInternalName, TypeArguments::Handle()); | 2163 return BuildSignature(instantiate, kInternalName, TypeArguments::Handle()); |
| 2165 } | 2164 } |
| 2166 | 2165 |
| 2167 // Build a string of the form '(T, {b: B, c: C}) => R' representing the | 2166 // Build a string of the form '(T, {B b, C c}) => R' representing the |
| 2168 // user visible signature of the given function. In this example, T and R are | 2167 // user visible signature of the given function. In this example, T and R are |
| 2169 // type parameters of class C, the owner of the function, also called the | 2168 // type parameters of class C, the owner of the function, also called the |
| 2170 // scope class of the function type. | 2169 // scope class of the function type. |
| 2171 // Implicit parameters are hidden, as well as the prefix denoting the | 2170 // Implicit parameters are hidden, as well as the prefix denoting the |
| 2172 // scope class and its type parameters. | 2171 // scope class and its type parameters. |
| 2173 RawString* UserVisibleSignature() const { | 2172 RawString* UserVisibleSignature() const { |
| 2174 const bool instantiate = false; | 2173 const bool instantiate = false; |
| 2175 return BuildSignature( | 2174 return BuildSignature( |
| 2176 instantiate, kUserVisibleName, TypeArguments::Handle()); | 2175 instantiate, kUserVisibleName, TypeArguments::Handle()); |
| 2177 } | 2176 } |
| 2178 | 2177 |
| 2179 // Build a string of the form '(A, {b: B, c: C}) => D' representing the | 2178 // Build a string of the form '(A, {B b, C c}) => D' representing the |
| 2180 // signature of the given function, where all generic types (e.g. '<T, R>' in | 2179 // signature of the given function, where all generic types (e.g. '<T, R>' in |
| 2181 // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given | 2180 // 'C<T, R>(T, {B b, C c}) => R') are instantiated using the given |
| 2182 // instantiator type argument vector of a C instance (e.g. '<A, D>'). | 2181 // instantiator type argument vector of a C instance (e.g. '<A, D>'). |
| 2183 RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator, | 2182 RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator, |
| 2184 NameVisibility name_visibility) const { | 2183 NameVisibility name_visibility) const { |
| 2185 const bool instantiate = true; | 2184 const bool instantiate = true; |
| 2186 return BuildSignature(instantiate, name_visibility, instantiator); | 2185 return BuildSignature(instantiate, name_visibility, instantiator); |
| 2187 } | 2186 } |
| 2188 | 2187 |
| 2189 // Returns true if the signature of this function is instantiated, i.e. if it | 2188 // Returns true if the signature of this function is instantiated, i.e. if it |
| 2190 // does not involve generic parameter types or generic result type. | 2189 // does not involve generic parameter types or generic result type. |
| 2191 bool HasInstantiatedSignature() const; | 2190 bool HasInstantiatedSignature() const; |
| 2192 | 2191 |
| 2193 // Build a string of the form 'T, {b: B, c: C} representing the user | 2192 // Build a string of the form 'T, {B b, C c}' representing the user |
| 2194 // visible formal parameters of the function. | 2193 // visible formal parameters of the function. |
| 2195 RawString* UserVisibleFormalParameters() const; | 2194 RawString* UserVisibleFormalParameters() const; |
| 2196 | 2195 |
| 2197 RawClass* Owner() const; | 2196 RawClass* Owner() const; |
| 2198 RawClass* origin() const; | 2197 RawClass* origin() const; |
| 2199 RawScript* script() const; | 2198 RawScript* script() const; |
| 2200 RawObject* RawOwner() const { return raw_ptr()->owner_; } | 2199 RawObject* RawOwner() const { return raw_ptr()->owner_; } |
| 2201 | 2200 |
| 2202 RawJSRegExp* regexp() const; | 2201 RawJSRegExp* regexp() const; |
| 2203 intptr_t string_specialization_cid() const; | 2202 intptr_t string_specialization_cid() const; |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2861 | 2860 |
| 2862 private: | 2861 private: |
| 2863 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } | 2862 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } |
| 2864 void set_context_scope(const ContextScope& value) const; | 2863 void set_context_scope(const ContextScope& value) const; |
| 2865 | 2864 |
| 2866 // Enclosing function of this local function. | 2865 // Enclosing function of this local function. |
| 2867 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } | 2866 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } |
| 2868 void set_parent_function(const Function& value) const; | 2867 void set_parent_function(const Function& value) const; |
| 2869 | 2868 |
| 2870 // Signature type of this closure function. | 2869 // Signature type of this closure function. |
| 2871 RawFunctionType* signature_type() const { return raw_ptr()->signature_type_; } | 2870 RawType* signature_type() const { return raw_ptr()->signature_type_; } |
| 2872 void set_signature_type(const FunctionType& value) const; | 2871 void set_signature_type(const Type& value) const; |
| 2873 | 2872 |
| 2874 RawInstance* implicit_static_closure() const { | 2873 RawInstance* implicit_static_closure() const { |
| 2875 return raw_ptr()->closure_; | 2874 return raw_ptr()->closure_; |
| 2876 } | 2875 } |
| 2877 void set_implicit_static_closure(const Instance& closure) const; | 2876 void set_implicit_static_closure(const Instance& closure) const; |
| 2878 | 2877 |
| 2879 static RawClosureData* New(); | 2878 static RawClosureData* New(); |
| 2880 | 2879 |
| 2881 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); | 2880 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); |
| 2882 friend class Class; | 2881 friend class Class; |
| (...skipping 2440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5323 virtual bool IsInstantiated(TrailPtr trail = NULL) const; | 5322 virtual bool IsInstantiated(TrailPtr trail = NULL) const; |
| 5324 virtual bool CanonicalizeEquals(const Instance& other) const { | 5323 virtual bool CanonicalizeEquals(const Instance& other) const { |
| 5325 return Equals(other); | 5324 return Equals(other); |
| 5326 } | 5325 } |
| 5327 virtual bool Equals(const Instance& other) const { | 5326 virtual bool Equals(const Instance& other) const { |
| 5328 return IsEquivalent(other); | 5327 return IsEquivalent(other); |
| 5329 } | 5328 } |
| 5330 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; | 5329 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; |
| 5331 virtual bool IsRecursive() const; | 5330 virtual bool IsRecursive() const; |
| 5332 | 5331 |
| 5332 // Check if this type represents a function type. |
| 5333 virtual bool IsFunctionType() const { return false; } |
| 5334 |
| 5333 // Instantiate this type using the given type argument vector. | 5335 // Instantiate this type using the given type argument vector. |
| 5334 // Return a new type, or return 'this' if it is already instantiated. | 5336 // Return a new type, or return 'this' if it is already instantiated. |
| 5335 // If bound_error is not NULL, it may be set to reflect a bound error. | 5337 // If bound_error is not NULL, it may be set to reflect a bound error. |
| 5336 virtual RawAbstractType* InstantiateFrom( | 5338 virtual RawAbstractType* InstantiateFrom( |
| 5337 const TypeArguments& instantiator_type_arguments, | 5339 const TypeArguments& instantiator_type_arguments, |
| 5338 Error* bound_error, | 5340 Error* bound_error, |
| 5339 TrailPtr instantiation_trail, | 5341 TrailPtr instantiation_trail, |
| 5340 TrailPtr bound_trail, | 5342 TrailPtr bound_trail, |
| 5341 Heap::Space space) const; | 5343 Heap::Space space) const; |
| 5342 | 5344 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5398 virtual RawString* EnumerateURIs() const; | 5400 virtual RawString* EnumerateURIs() const; |
| 5399 | 5401 |
| 5400 virtual intptr_t Hash() const; | 5402 virtual intptr_t Hash() const; |
| 5401 | 5403 |
| 5402 // The name of this type's class, i.e. without the type argument names of this | 5404 // The name of this type's class, i.e. without the type argument names of this |
| 5403 // type. | 5405 // type. |
| 5404 RawString* ClassName() const; | 5406 RawString* ClassName() const; |
| 5405 | 5407 |
| 5406 // Check if this type represents the 'dynamic' type. | 5408 // Check if this type represents the 'dynamic' type. |
| 5407 bool IsDynamicType() const { | 5409 bool IsDynamicType() const { |
| 5408 return HasResolvedTypeClass() && (type_class() == Object::dynamic_class()); | 5410 return !IsFunctionType() && |
| 5411 HasResolvedTypeClass() && |
| 5412 (type_class() == Object::dynamic_class()); |
| 5409 } | 5413 } |
| 5410 | 5414 |
| 5411 // Check if this type represents the 'Null' type. | 5415 // Check if this type represents the 'Null' type. |
| 5412 bool IsNullType() const; | 5416 bool IsNullType() const; |
| 5413 | 5417 |
| 5414 // Check if this type represents the 'void' type. | 5418 // Check if this type represents the 'void' type. |
| 5415 bool IsVoidType() const { | 5419 bool IsVoidType() const { |
| 5416 return HasResolvedTypeClass() && (type_class() == Object::void_class()); | 5420 return !IsFunctionType() && |
| 5421 HasResolvedTypeClass() && |
| 5422 (type_class() == Object::void_class()); |
| 5417 } | 5423 } |
| 5418 | 5424 |
| 5419 bool IsObjectType() const { | 5425 bool IsObjectType() const { |
| 5420 return HasResolvedTypeClass() && | 5426 return !IsFunctionType() && |
| 5421 Class::Handle(type_class()).IsObjectClass(); | 5427 HasResolvedTypeClass() && |
| 5428 Class::Handle(type_class()).IsObjectClass(); |
| 5422 } | 5429 } |
| 5423 | 5430 |
| 5424 // Check if this type represents the 'bool' type. | 5431 // Check if this type represents the 'bool' type. |
| 5425 bool IsBoolType() const; | 5432 bool IsBoolType() const; |
| 5426 | 5433 |
| 5427 // Check if this type represents the 'int' type. | 5434 // Check if this type represents the 'int' type. |
| 5428 bool IsIntType() const; | 5435 bool IsIntType() const; |
| 5429 | 5436 |
| 5430 // Check if this type represents the 'double' type. | 5437 // Check if this type represents the 'double' type. |
| 5431 bool IsDoubleType() const; | 5438 bool IsDoubleType() const; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5499 public: | 5506 public: |
| 5500 static intptr_t type_class_offset() { | 5507 static intptr_t type_class_offset() { |
| 5501 return OFFSET_OF(RawType, type_class_); | 5508 return OFFSET_OF(RawType, type_class_); |
| 5502 } | 5509 } |
| 5503 virtual bool IsFinalized() const { | 5510 virtual bool IsFinalized() const { |
| 5504 return | 5511 return |
| 5505 (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) || | 5512 (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) || |
| 5506 (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated); | 5513 (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated); |
| 5507 } | 5514 } |
| 5508 virtual void SetIsFinalized() const; | 5515 virtual void SetIsFinalized() const; |
| 5516 void ResetIsFinalized() const; // Ignore current state and set again. |
| 5509 virtual bool IsBeingFinalized() const { | 5517 virtual bool IsBeingFinalized() const { |
| 5510 return raw_ptr()->type_state_ == RawType::kBeingFinalized; | 5518 return raw_ptr()->type_state_ == RawType::kBeingFinalized; |
| 5511 } | 5519 } |
| 5512 virtual void SetIsBeingFinalized() const; | 5520 virtual void SetIsBeingFinalized() const; |
| 5513 virtual bool IsMalformed() const; | 5521 virtual bool IsMalformed() const; |
| 5514 virtual bool IsMalbounded() const; | 5522 virtual bool IsMalbounded() const; |
| 5515 virtual bool IsMalformedOrMalbounded() const; | 5523 virtual bool IsMalformedOrMalbounded() const; |
| 5516 virtual RawLanguageError* error() const { return raw_ptr()->error_; } | 5524 virtual RawLanguageError* error() const; |
| 5517 virtual void set_error(const LanguageError& value) const; | 5525 virtual void set_error(const LanguageError& value) const; |
| 5518 virtual bool IsResolved() const { | 5526 virtual bool IsResolved() const { |
| 5519 return raw_ptr()->type_state_ >= RawType::kResolved; | 5527 return raw_ptr()->type_state_ >= RawType::kResolved; |
| 5520 } | 5528 } |
| 5521 virtual void SetIsResolved() const; | 5529 virtual void SetIsResolved() const; |
| 5522 virtual bool HasResolvedTypeClass() const; // Own type class resolved. | 5530 virtual bool HasResolvedTypeClass() const; // Own type class resolved. |
| 5523 virtual RawClass* type_class() const; | 5531 virtual RawClass* type_class() const; |
| 5524 void set_type_class(const Object& value) const; | 5532 void set_type_class(const Object& value) const; |
| 5525 virtual RawUnresolvedClass* unresolved_class() const; | 5533 virtual RawUnresolvedClass* unresolved_class() const; |
| 5526 virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; } | 5534 virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; } |
| 5527 virtual void set_arguments(const TypeArguments& value) const; | 5535 virtual void set_arguments(const TypeArguments& value) const; |
| 5528 virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; } | 5536 virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; } |
| 5529 virtual bool IsInstantiated(TrailPtr trail = NULL) const; | 5537 virtual bool IsInstantiated(TrailPtr trail = NULL) const; |
| 5530 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; | 5538 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; |
| 5531 virtual bool IsRecursive() const; | 5539 virtual bool IsRecursive() const; |
| 5540 // If signature is not null, this type represents a function type. |
| 5541 RawFunction* signature() const; |
| 5542 void set_signature(const Function& value) const; |
| 5543 virtual bool IsFunctionType() const { |
| 5544 return signature() != Function::null(); |
| 5545 } |
| 5532 virtual RawAbstractType* InstantiateFrom( | 5546 virtual RawAbstractType* InstantiateFrom( |
| 5533 const TypeArguments& instantiator_type_arguments, | 5547 const TypeArguments& instantiator_type_arguments, |
| 5534 Error* bound_error, | 5548 Error* bound_error, |
| 5535 TrailPtr instantiation_trail, | 5549 TrailPtr instantiation_trail, |
| 5536 TrailPtr bound_trail, | 5550 TrailPtr bound_trail, |
| 5537 Heap::Space space) const; | 5551 Heap::Space space) const; |
| 5538 virtual RawAbstractType* CloneUnfinalized() const; | 5552 virtual RawAbstractType* CloneUnfinalized() const; |
| 5539 virtual RawAbstractType* CloneUninstantiated( | 5553 virtual RawAbstractType* CloneUninstantiated( |
| 5540 const Class& new_owner, | 5554 const Class& new_owner, |
| 5541 TrailPtr trail = NULL) const; | 5555 TrailPtr trail = NULL) const; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5587 // The 'num' type. | 5601 // The 'num' type. |
| 5588 static RawType* Number(); | 5602 static RawType* Number(); |
| 5589 | 5603 |
| 5590 // The 'String' type. | 5604 // The 'String' type. |
| 5591 static RawType* StringType(); | 5605 static RawType* StringType(); |
| 5592 | 5606 |
| 5593 // The 'Array' type. | 5607 // The 'Array' type. |
| 5594 static RawType* ArrayType(); | 5608 static RawType* ArrayType(); |
| 5595 | 5609 |
| 5596 // The 'Function' type. | 5610 // The 'Function' type. |
| 5597 static RawType* Function(); | 5611 static RawType* DartFunctionType(); |
| 5598 | 5612 |
| 5599 // The finalized type of the given non-parameterized class. | 5613 // The finalized type of the given non-parameterized class. |
| 5600 static RawType* NewNonParameterizedType(const Class& type_class); | 5614 static RawType* NewNonParameterizedType(const Class& type_class); |
| 5601 | 5615 |
| 5602 static RawType* New(const Object& clazz, | 5616 static RawType* New(const Object& clazz, |
| 5603 const TypeArguments& arguments, | 5617 const TypeArguments& arguments, |
| 5604 TokenPosition token_pos, | 5618 TokenPosition token_pos, |
| 5605 Heap::Space space = Heap::kOld); | 5619 Heap::Space space = Heap::kOld); |
| 5606 | 5620 |
| 5607 private: | 5621 private: |
| 5608 void set_token_pos(TokenPosition token_pos) const; | 5622 void set_token_pos(TokenPosition token_pos) const; |
| 5609 void set_type_state(int8_t state) const; | 5623 void set_type_state(int8_t state) const; |
| 5610 | 5624 |
| 5611 static RawType* New(Heap::Space space = Heap::kOld); | 5625 static RawType* New(Heap::Space space = Heap::kOld); |
| 5612 | 5626 |
| 5613 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); | 5627 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); |
| 5614 friend class Class; | 5628 friend class Class; |
| 5615 friend class TypeArguments; | 5629 friend class TypeArguments; |
| 5616 }; | 5630 }; |
| 5617 | 5631 |
| 5618 | 5632 |
| 5619 // TODO(regis): FunctionType is very similar to Type. Instead of a separate | |
| 5620 // class FunctionType, we could consider an object of class Type as representing | |
| 5621 // a function type if it has a non-null function (signature) field. | |
| 5622 // In order to save space, we could reuse the error_ field? A malformed or | |
| 5623 // malbounded function type would lose its function reference, but the error | |
| 5624 // string would contain relevant info. | |
| 5625 | |
| 5626 // A FunctionType describes the signature of a function, i.e. the result type | |
| 5627 // and formal parameter types of the function, as well as the names of optional | |
| 5628 // named formal parameters. | |
| 5629 // If these types refer to type parameters of a class in scope, the function | |
| 5630 // type is generic. A generic function type may be instantiated by a type | |
| 5631 // argument vector. | |
| 5632 // Therefore, a FunctionType consists of a scope class, a type argument vector, | |
| 5633 // and a signature. | |
| 5634 // The scope class is either a generic class (or generic typedef) declaring the | |
| 5635 // type parameters referred to by the signature, or class _Closure in the | |
| 5636 // non-generic case (including the non-generic typedef case). | |
| 5637 // The type arguments specify an instantiation of the generic signature (null in | |
| 5638 // the non-generic case). | |
| 5639 // The signature is a reference to an actual closure function (kClosureFunction) | |
| 5640 // or to a signature function (kSignatureFunction). | |
| 5641 // Since typedefs cannot refer to themselves, directly or indirectly, a | |
| 5642 // FunctionType cannot be recursive. Only individual formal parameter types can. | |
| 5643 class FunctionType : public AbstractType { | |
| 5644 public: | |
| 5645 virtual bool IsFinalized() const { | |
| 5646 return | |
| 5647 (raw_ptr()->type_state_ == RawFunctionType::kFinalizedInstantiated) || | |
| 5648 (raw_ptr()->type_state_ == RawFunctionType::kFinalizedUninstantiated); | |
| 5649 } | |
| 5650 virtual void SetIsFinalized() const; | |
| 5651 void ResetIsFinalized() const; // Ignore current state and set again. | |
| 5652 virtual bool IsBeingFinalized() const { | |
| 5653 return raw_ptr()->type_state_ == RawFunctionType::kBeingFinalized; | |
| 5654 } | |
| 5655 virtual void SetIsBeingFinalized() const; | |
| 5656 virtual bool IsMalformed() const; | |
| 5657 virtual bool IsMalbounded() const; | |
| 5658 virtual bool IsMalformedOrMalbounded() const; | |
| 5659 virtual RawLanguageError* error() const { return raw_ptr()->error_; } | |
| 5660 virtual void set_error(const LanguageError& value) const; | |
| 5661 virtual bool IsResolved() const { | |
| 5662 return raw_ptr()->type_state_ >= RawFunctionType::kResolved; | |
| 5663 } | |
| 5664 virtual void SetIsResolved() const; | |
| 5665 // The scope class of a FunctionType is always resolved. It has no actual | |
| 5666 // type class. Returning false is important for the type testers to work, e.g. | |
| 5667 // IsDynamicType(), IsBoolType(), etc... | |
| 5668 virtual bool HasResolvedTypeClass() const { return false; } | |
| 5669 // Return scope_class from virtual type_class() to factorize finalization | |
| 5670 // with Type, also a parameterized type. | |
| 5671 virtual RawClass* type_class() const { return scope_class(); } | |
| 5672 RawClass* scope_class() const { return raw_ptr()->scope_class_; } | |
| 5673 void set_scope_class(const Class& value) const; | |
| 5674 virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; } | |
| 5675 virtual void set_arguments(const TypeArguments& value) const; | |
| 5676 RawFunction* signature() const { return raw_ptr()->signature_; } | |
| 5677 virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; } | |
| 5678 virtual bool IsInstantiated(TrailPtr trail = NULL) const; | |
| 5679 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; | |
| 5680 virtual bool IsRecursive() const; | |
| 5681 virtual RawAbstractType* InstantiateFrom( | |
| 5682 const TypeArguments& instantiator_type_arguments, | |
| 5683 Error* malformed_error, | |
| 5684 TrailPtr instantiation_trail, | |
| 5685 TrailPtr bound_trail, | |
| 5686 Heap::Space space) const; | |
| 5687 virtual RawAbstractType* CloneUnfinalized() const; | |
| 5688 virtual RawAbstractType* CloneUninstantiated( | |
| 5689 const Class& new_owner, | |
| 5690 TrailPtr trail = NULL) const; | |
| 5691 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; | |
| 5692 virtual RawString* EnumerateURIs() const; | |
| 5693 | |
| 5694 virtual intptr_t Hash() const; | |
| 5695 | |
| 5696 static intptr_t InstanceSize() { | |
| 5697 return RoundedAllocationSize(sizeof(RawFunctionType)); | |
| 5698 } | |
| 5699 | |
| 5700 static RawFunctionType* New(const Class& scope_class, | |
| 5701 const TypeArguments& arguments, | |
| 5702 const Function& signature, | |
| 5703 TokenPosition token_pos, | |
| 5704 Heap::Space space = Heap::kOld); | |
| 5705 | |
| 5706 private: | |
| 5707 void set_signature(const Function& value) const; | |
| 5708 void set_token_pos(TokenPosition token_pos) const; | |
| 5709 void set_type_state(int8_t state) const; | |
| 5710 | |
| 5711 static RawFunctionType* New(Heap::Space space = Heap::kOld); | |
| 5712 | |
| 5713 FINAL_HEAP_OBJECT_IMPLEMENTATION(FunctionType, AbstractType); | |
| 5714 friend class Class; | |
| 5715 friend class TypeArguments; | |
| 5716 }; | |
| 5717 | |
| 5718 | |
| 5719 // A TypeRef is used to break cycles in the representation of recursive types. | 5633 // A TypeRef is used to break cycles in the representation of recursive types. |
| 5720 // Its only field is the recursive AbstractType it refers to. | 5634 // Its only field is the recursive AbstractType it refers to. |
| 5721 // Note that the cycle always involves type arguments. | 5635 // Note that the cycle always involves type arguments. |
| 5722 class TypeRef : public AbstractType { | 5636 class TypeRef : public AbstractType { |
| 5723 public: | 5637 public: |
| 5724 virtual bool IsFinalized() const { | 5638 virtual bool IsFinalized() const { |
| 5725 return AbstractType::Handle(type()).IsFinalized(); | 5639 return AbstractType::Handle(type()).IsFinalized(); |
| 5726 } | 5640 } |
| 5727 virtual bool IsBeingFinalized() const { | 5641 virtual bool IsBeingFinalized() const { |
| 5728 return AbstractType::Handle(type()).IsBeingFinalized(); | 5642 return AbstractType::Handle(type()).IsBeingFinalized(); |
| 5729 } | 5643 } |
| 5730 virtual bool IsMalformed() const { | 5644 virtual bool IsMalformed() const { |
| 5731 return AbstractType::Handle(type()).IsMalformed(); | 5645 return AbstractType::Handle(type()).IsMalformed(); |
| 5732 } | 5646 } |
| 5733 virtual bool IsMalbounded() const { | 5647 virtual bool IsMalbounded() const { |
| 5734 return AbstractType::Handle(type()).IsMalbounded(); | 5648 return AbstractType::Handle(type()).IsMalbounded(); |
| 5735 } | 5649 } |
| 5736 virtual bool IsMalformedOrMalbounded() const { | 5650 virtual bool IsMalformedOrMalbounded() const { |
| 5737 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); | 5651 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); |
| 5738 } | 5652 } |
| 5739 virtual bool IsResolved() const { return true; } | 5653 virtual bool IsResolved() const { return true; } |
| 5740 virtual bool HasResolvedTypeClass() const { | 5654 virtual bool HasResolvedTypeClass() const { |
| 5741 // Returns false if the ref type is a function type. | |
| 5742 return AbstractType::Handle(type()).HasResolvedTypeClass(); | 5655 return AbstractType::Handle(type()).HasResolvedTypeClass(); |
| 5743 } | 5656 } |
| 5744 RawAbstractType* type() const { return raw_ptr()->type_; } | 5657 RawAbstractType* type() const { return raw_ptr()->type_; } |
| 5745 void set_type(const AbstractType& value) const; | 5658 void set_type(const AbstractType& value) const; |
| 5746 virtual RawClass* type_class() const { | 5659 virtual RawClass* type_class() const { |
| 5747 return AbstractType::Handle(type()).type_class(); | 5660 return AbstractType::Handle(type()).type_class(); |
| 5748 } | 5661 } |
| 5749 virtual RawTypeArguments* arguments() const { | 5662 virtual RawTypeArguments* arguments() const { |
| 5750 return AbstractType::Handle(type()).arguments(); | 5663 return AbstractType::Handle(type()).arguments(); |
| 5751 } | 5664 } |
| (...skipping 2753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8505 | 8418 |
| 8506 | 8419 |
| 8507 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 8420 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
| 8508 intptr_t index) { | 8421 intptr_t index) { |
| 8509 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 8422 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
| 8510 } | 8423 } |
| 8511 | 8424 |
| 8512 } // namespace dart | 8425 } // namespace dart |
| 8513 | 8426 |
| 8514 #endif // VM_OBJECT_H_ | 8427 #endif // VM_OBJECT_H_ |
| OLD | NEW |