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 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 virtual RawString* DictionaryName() const { return Name(); } | 934 virtual RawString* DictionaryName() const { return Name(); } |
935 | 935 |
936 RawScript* script() const { return raw_ptr()->script_; } | 936 RawScript* script() const { return raw_ptr()->script_; } |
937 void set_script(const Script& value) const; | 937 void set_script(const Script& value) const; |
938 | 938 |
939 intptr_t token_pos() const { return raw_ptr()->token_pos_; } | 939 intptr_t token_pos() const { return raw_ptr()->token_pos_; } |
940 void set_token_pos(intptr_t value) const; | 940 void set_token_pos(intptr_t value) const; |
941 | 941 |
942 intptr_t ComputeEndTokenPos() const; | 942 intptr_t ComputeEndTokenPos() const; |
943 | 943 |
944 // This class represents the signature class of a closure function if | 944 // This class represents a typedef if the signature function is not null. |
945 // signature_function() is not null. | |
946 // The associated function may be a closure function (with code) or a | |
947 // signature function (without code) solely describing the result type and | |
948 // parameter types of the signature. | |
949 RawFunction* signature_function() const { | 945 RawFunction* signature_function() const { |
950 return raw_ptr()->signature_function_; | 946 return raw_ptr()->signature_function_; |
951 } | 947 } |
952 static intptr_t signature_function_offset() { | 948 void set_signature_function(const Function& value) const; |
953 return OFFSET_OF(RawClass, signature_function_); | |
954 } | |
955 | |
956 // Return the signature type of this signature class. | |
957 // For example, if this class represents a signature of the form | |
958 // 'F<T, R>(T, [b: B, c: C]) => R', then its signature type is a parameterized | |
959 // type with this class as the type class and type parameters 'T' and 'R' | |
960 // as its type argument vector. | |
961 // SignatureType is used as the type of formal parameters representing a | |
962 // function. | |
963 RawType* SignatureType() const; | |
964 | 949 |
965 // Return the Type with type parameters declared by this class filled in with | 950 // Return the Type with type parameters declared by this class filled in with |
966 // dynamic and type parameters declared in superclasses filled in as declared | 951 // dynamic and type parameters declared in superclasses filled in as declared |
967 // in superclass clauses. | 952 // in superclass clauses. |
968 RawAbstractType* RareType() const; | 953 RawAbstractType* RareType() const; |
969 | 954 |
970 // Return the Type whose arguments are the type parameters declared by this | 955 // Return the Type whose arguments are the type parameters declared by this |
971 // class preceded by the type arguments declared for superclasses, etc. | 956 // class preceded by the type arguments declared for superclasses, etc. |
972 // e.g. given | 957 // e.g. given |
973 // class B<T, S> | 958 // class B<T, S> |
(...skipping 23 matching lines...) Expand all Loading... |
997 RawTypeParameter* LookupTypeParameter(const String& type_name) const; | 982 RawTypeParameter* LookupTypeParameter(const String& type_name) const; |
998 | 983 |
999 // The type argument vector is flattened and includes the type arguments of | 984 // The type argument vector is flattened and includes the type arguments of |
1000 // the super class. | 985 // the super class. |
1001 intptr_t NumTypeArguments() const; | 986 intptr_t NumTypeArguments() const; |
1002 | 987 |
1003 // Return the number of type arguments that are specific to this class, i.e. | 988 // Return the number of type arguments that are specific to this class, i.e. |
1004 // not overlapping with the type arguments of the super class of this class. | 989 // not overlapping with the type arguments of the super class of this class. |
1005 intptr_t NumOwnTypeArguments() const; | 990 intptr_t NumOwnTypeArguments() const; |
1006 | 991 |
| 992 // Return true if this class declares type parameters. |
1007 bool IsGeneric() const; | 993 bool IsGeneric() const; |
1008 | 994 |
1009 // If this class is parameterized, each instance has a type_arguments field. | 995 // If this class is parameterized, each instance has a type_arguments field. |
1010 static const intptr_t kNoTypeArguments = -1; | 996 static const intptr_t kNoTypeArguments = -1; |
1011 intptr_t type_arguments_field_offset() const { | 997 intptr_t type_arguments_field_offset() const { |
1012 ASSERT(is_type_finalized() || is_prefinalized()); | 998 ASSERT(is_type_finalized() || is_prefinalized()); |
1013 if (raw_ptr()->type_arguments_field_offset_in_words_ == kNoTypeArguments) { | 999 if (raw_ptr()->type_arguments_field_offset_in_words_ == kNoTypeArguments) { |
1014 return kNoTypeArguments; | 1000 return kNoTypeArguments; |
1015 } | 1001 } |
1016 return raw_ptr()->type_arguments_field_offset_in_words_ * kWordSize; | 1002 return raw_ptr()->type_arguments_field_offset_in_words_ * kWordSize; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 | 1073 |
1088 // Check if this class represents the 'void' class. | 1074 // Check if this class represents the 'void' class. |
1089 bool IsVoidClass() const { return id() == kVoidCid; } | 1075 bool IsVoidClass() const { return id() == kVoidCid; } |
1090 | 1076 |
1091 // Check if this class represents the 'Object' class. | 1077 // Check if this class represents the 'Object' class. |
1092 bool IsObjectClass() const { return id() == kInstanceCid; } | 1078 bool IsObjectClass() const { return id() == kInstanceCid; } |
1093 | 1079 |
1094 // Check if this class represents the 'Function' class. | 1080 // Check if this class represents the 'Function' class. |
1095 bool IsFunctionClass() const; | 1081 bool IsFunctionClass() const; |
1096 | 1082 |
1097 // Check if this class represents a signature class. | 1083 // Check if this class represents the 'Closure' class. |
1098 bool IsSignatureClass() const { | 1084 bool IsClosureClass() const { return id() == kClosureCid; } |
| 1085 static bool IsClosureClass(RawClass* cls) { |
| 1086 NoSafepointScope no_safepoint; |
| 1087 return cls->ptr()->id_ == kClosureCid; |
| 1088 } |
| 1089 |
| 1090 // Check if this class represents a typedef class. |
| 1091 bool IsTypedefClass() const { |
1099 return signature_function() != Object::null(); | 1092 return signature_function() != Object::null(); |
1100 } | 1093 } |
1101 static bool IsSignatureClass(RawClass* cls) { | 1094 |
1102 return cls->ptr()->signature_function_ != Object::null(); | |
1103 } | |
1104 static bool IsInFullSnapshot(RawClass* cls) { | 1095 static bool IsInFullSnapshot(RawClass* cls) { |
1105 NoSafepointScope no_safepoint; | 1096 NoSafepointScope no_safepoint; |
1106 return cls->ptr()->library_->ptr()->is_in_fullsnapshot_; | 1097 return cls->ptr()->library_->ptr()->is_in_fullsnapshot_; |
1107 } | 1098 } |
1108 | 1099 |
1109 // Check if this class represents a canonical signature class, i.e. not an | |
1110 // alias as defined in a typedef. | |
1111 bool IsCanonicalSignatureClass() const; | |
1112 | |
1113 // Check the subtype relationship. | 1100 // Check the subtype relationship. |
1114 bool IsSubtypeOf(const TypeArguments& type_arguments, | 1101 bool IsSubtypeOf(const TypeArguments& type_arguments, |
1115 const Class& other, | 1102 const Class& other, |
1116 const TypeArguments& other_type_arguments, | 1103 const TypeArguments& other_type_arguments, |
1117 Error* bound_error, | 1104 Error* bound_error, |
1118 Heap::Space space = Heap::kNew) const { | 1105 Heap::Space space = Heap::kNew) const { |
1119 return TypeTest(kIsSubtypeOf, | 1106 return TypeTest(kIsSubtypeOf, |
1120 type_arguments, | 1107 type_arguments, |
1121 other, | 1108 other, |
1122 other_type_arguments, | 1109 other_type_arguments, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1177 RawFunction* LookupGetterFunction(const String& name) const; | 1164 RawFunction* LookupGetterFunction(const String& name) const; |
1178 RawFunction* LookupSetterFunction(const String& name) const; | 1165 RawFunction* LookupSetterFunction(const String& name) const; |
1179 RawField* LookupInstanceField(const String& name) const; | 1166 RawField* LookupInstanceField(const String& name) const; |
1180 RawField* LookupStaticField(const String& name) const; | 1167 RawField* LookupStaticField(const String& name) const; |
1181 RawField* LookupField(const String& name) const; | 1168 RawField* LookupField(const String& name) const; |
1182 | 1169 |
1183 RawLibraryPrefix* LookupLibraryPrefix(const String& name) const; | 1170 RawLibraryPrefix* LookupLibraryPrefix(const String& name) const; |
1184 | 1171 |
1185 void InsertCanonicalConstant(intptr_t index, const Instance& constant) const; | 1172 void InsertCanonicalConstant(intptr_t index, const Instance& constant) const; |
1186 | 1173 |
1187 intptr_t FindCanonicalTypeIndex(const Type& needle) const; | 1174 intptr_t FindCanonicalTypeIndex(const AbstractType& needle) const; |
1188 RawType* CanonicalTypeFromIndex(intptr_t idx) const; | 1175 RawAbstractType* CanonicalTypeFromIndex(intptr_t idx) const; |
1189 | 1176 |
1190 static intptr_t InstanceSize() { | 1177 static intptr_t InstanceSize() { |
1191 return RoundedAllocationSize(sizeof(RawClass)); | 1178 return RoundedAllocationSize(sizeof(RawClass)); |
1192 } | 1179 } |
1193 | 1180 |
1194 bool is_implemented() const { | 1181 bool is_implemented() const { |
1195 return ImplementedBit::decode(raw_ptr()->state_bits_); | 1182 return ImplementedBit::decode(raw_ptr()->state_bits_); |
1196 } | 1183 } |
1197 void set_is_implemented() const; | 1184 void set_is_implemented() const; |
1198 | 1185 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1327 | 1314 |
1328 // Allocate the raw TypedData classes. | 1315 // Allocate the raw TypedData classes. |
1329 static RawClass* NewTypedDataClass(intptr_t class_id); | 1316 static RawClass* NewTypedDataClass(intptr_t class_id); |
1330 | 1317 |
1331 // Allocate the raw TypedDataView classes. | 1318 // Allocate the raw TypedDataView classes. |
1332 static RawClass* NewTypedDataViewClass(intptr_t class_id); | 1319 static RawClass* NewTypedDataViewClass(intptr_t class_id); |
1333 | 1320 |
1334 // Allocate the raw ExternalTypedData classes. | 1321 // Allocate the raw ExternalTypedData classes. |
1335 static RawClass* NewExternalTypedDataClass(intptr_t class_id); | 1322 static RawClass* NewExternalTypedDataClass(intptr_t class_id); |
1336 | 1323 |
1337 // Allocate a class representing a function signature described by | |
1338 // signature_function, which must be a closure function or a signature | |
1339 // function. | |
1340 // The class may be type parameterized unless the signature_function is in a | |
1341 // static scope. In that case, the type parameters are copied from the owner | |
1342 // class of signature_function. | |
1343 // A null signature function may be passed in and patched later. See below. | |
1344 static RawClass* NewSignatureClass(const String& name, | |
1345 const Function& signature_function, | |
1346 const Script& script, | |
1347 intptr_t token_pos); | |
1348 | |
1349 // Patch the signature function of a signature class allocated without it. | |
1350 void PatchSignatureFunction(const Function& signature_function) const; | |
1351 | |
1352 // Register code that has used CHA for optimization. | 1324 // Register code that has used CHA for optimization. |
1353 // TODO(srdjan): Also register kind of CHA optimization (e.g.: leaf class, | 1325 // TODO(srdjan): Also register kind of CHA optimization (e.g.: leaf class, |
1354 // leaf method, ...). | 1326 // leaf method, ...). |
1355 void RegisterCHACode(const Code& code); | 1327 void RegisterCHACode(const Code& code); |
1356 | 1328 |
1357 void DisableCHAOptimizedCode(const Class& subclass); | 1329 void DisableCHAOptimizedCode(const Class& subclass); |
1358 | 1330 |
1359 RawArray* cha_codes() const { return raw_ptr()->cha_codes_; } | 1331 RawArray* cha_codes() const { return raw_ptr()->cha_codes_; } |
1360 void set_cha_codes(const Array& value) const; | 1332 void set_cha_codes(const Array& value) const; |
1361 | 1333 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 kFieldsMarkedNullableBit, 1> {}; // NOLINT | 1374 kFieldsMarkedNullableBit, 1> {}; // NOLINT |
1403 class CycleFreeBit : public BitField<bool, kCycleFreeBit, 1> {}; | 1375 class CycleFreeBit : public BitField<bool, kCycleFreeBit, 1> {}; |
1404 class EnumBit : public BitField<bool, kEnumBit, 1> {}; | 1376 class EnumBit : public BitField<bool, kEnumBit, 1> {}; |
1405 class IsAllocatedBit : public BitField<bool, kIsAllocatedBit, 1> {}; | 1377 class IsAllocatedBit : public BitField<bool, kIsAllocatedBit, 1> {}; |
1406 | 1378 |
1407 void set_name(const String& value) const; | 1379 void set_name(const String& value) const; |
1408 void set_pretty_name(const String& value) const; | 1380 void set_pretty_name(const String& value) const; |
1409 void set_user_name(const String& value) const; | 1381 void set_user_name(const String& value) const; |
1410 RawString* GeneratePrettyName() const; | 1382 RawString* GeneratePrettyName() const; |
1411 RawString* GenerateUserVisibleName() const; | 1383 RawString* GenerateUserVisibleName() const; |
1412 void set_signature_function(const Function& value) const; | |
1413 void set_signature_type(const AbstractType& value) const; | |
1414 void set_state_bits(intptr_t bits) const; | 1384 void set_state_bits(intptr_t bits) const; |
1415 | 1385 |
1416 void set_constants(const Array& value) const; | 1386 void set_constants(const Array& value) const; |
1417 | 1387 |
1418 void set_canonical_types(const Object& value) const; | 1388 void set_canonical_types(const Object& value) const; |
1419 RawObject* canonical_types() const; | 1389 RawObject* canonical_types() const; |
1420 | 1390 |
1421 RawArray* invocation_dispatcher_cache() const; | 1391 RawArray* invocation_dispatcher_cache() const; |
1422 void set_invocation_dispatcher_cache(const Array& cache) const; | 1392 void set_invocation_dispatcher_cache(const Array& cache) const; |
1423 RawFunction* CreateInvocationDispatcher(const String& target_name, | 1393 RawFunction* CreateInvocationDispatcher(const String& target_name, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1476 const Class& other, | 1446 const Class& other, |
1477 const TypeArguments& other_type_arguments, | 1447 const TypeArguments& other_type_arguments, |
1478 Error* bound_error, | 1448 Error* bound_error, |
1479 Heap::Space space); | 1449 Heap::Space space); |
1480 | 1450 |
1481 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); | 1451 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); |
1482 friend class AbstractType; | 1452 friend class AbstractType; |
1483 friend class Instance; | 1453 friend class Instance; |
1484 friend class Object; | 1454 friend class Object; |
1485 friend class Type; | 1455 friend class Type; |
| 1456 friend class FunctionType; |
1486 friend class Intrinsifier; | 1457 friend class Intrinsifier; |
1487 friend class Precompiler; | 1458 friend class Precompiler; |
1488 }; | 1459 }; |
1489 | 1460 |
1490 | 1461 |
1491 // Unresolved class is used for storing unresolved names which will be resolved | 1462 // Unresolved class is used for storing unresolved names which will be resolved |
1492 // to a class after all classes have been loaded and finalized. | 1463 // to a class after all classes have been loaded and finalized. |
1493 class UnresolvedClass : public Object { | 1464 class UnresolvedClass : public Object { |
1494 public: | 1465 public: |
1495 RawLibraryPrefix* library_prefix() const { | 1466 RawLibraryPrefix* library_prefix() const { |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2101 RawString* name() const { return raw_ptr()->name_; } | 2072 RawString* name() const { return raw_ptr()->name_; } |
2102 RawString* PrettyName() const; | 2073 RawString* PrettyName() const; |
2103 RawString* UserVisibleName() const; | 2074 RawString* UserVisibleName() const; |
2104 RawString* QualifiedPrettyName() const; | 2075 RawString* QualifiedPrettyName() const; |
2105 RawString* QualifiedUserVisibleName() const; | 2076 RawString* QualifiedUserVisibleName() const; |
2106 const char* QualifiedUserVisibleNameCString() const; | 2077 const char* QualifiedUserVisibleNameCString() const; |
2107 virtual RawString* DictionaryName() const { return name(); } | 2078 virtual RawString* DictionaryName() const { return name(); } |
2108 | 2079 |
2109 RawString* GetSource() const; | 2080 RawString* GetSource() const; |
2110 | 2081 |
| 2082 // Return the type of this function's signature. It may not be canonical yet. |
| 2083 // For example, if this function has a signature of the form |
| 2084 // '(T, [b: B, c: C]) => R', where 'T' and 'R' are type parameters of the |
| 2085 // owner class of this function, then its signature type is a parameterized |
| 2086 // FunctionType with uninstantiated type arguments 'T' and 'R' as elements of |
| 2087 // its type argument vector. |
| 2088 RawFunctionType* SignatureType() const; |
| 2089 |
| 2090 // Update the signature type (with a canonical version). |
| 2091 void SetSignatureType(const FunctionType& value) const; |
| 2092 |
2111 // Build a string of the form 'C<T, R>(T, {b: B, c: C}) => R' representing the | 2093 // Build a string of the form 'C<T, R>(T, {b: B, c: C}) => R' representing the |
2112 // internal signature of the given function. In this example, T and R are | 2094 // internal signature of the given function. In this example, T and R are |
2113 // type parameters of class C, the owner of the function. | 2095 // type parameters of class C, the owner of the function. |
2114 RawString* Signature() const { | 2096 RawString* Signature() const { |
2115 const bool instantiate = false; | 2097 const bool instantiate = false; |
2116 return BuildSignature(instantiate, kInternalName, TypeArguments::Handle()); | 2098 return BuildSignature(instantiate, kInternalName, TypeArguments::Handle()); |
2117 } | 2099 } |
2118 | 2100 |
2119 RawString* PrettySignature() const { | 2101 RawString* PrettySignature() const { |
2120 const bool instantiate = false; | 2102 const bool instantiate = false; |
2121 return BuildSignature( | 2103 return BuildSignature( |
2122 instantiate, kPrettyName, TypeArguments::Handle()); | 2104 instantiate, kPrettyName, TypeArguments::Handle()); |
2123 } | 2105 } |
2124 | 2106 |
2125 // Build a string of the form '(T, {b: B, c: C}) => R' representing the | 2107 // Build a string of the form '(T, {b: B, c: C}) => R' representing the |
2126 // user visible signature of the given function. In this example, T and R are | 2108 // user visible signature of the given function. In this example, T and R are |
2127 // type parameters of class C, the owner of the function. | 2109 // type parameters of class C, the owner of the function, also called the |
| 2110 // scope class of the function type. |
2128 // Implicit parameters are hidden, as well as the prefix denoting the | 2111 // Implicit parameters are hidden, as well as the prefix denoting the |
2129 // signature class and its type parameters. | 2112 // scope class and its type parameters. |
2130 RawString* UserVisibleSignature() const { | 2113 RawString* UserVisibleSignature() const { |
2131 const bool instantiate = false; | 2114 const bool instantiate = false; |
2132 return BuildSignature( | 2115 return BuildSignature( |
2133 instantiate, kUserVisibleName, TypeArguments::Handle()); | 2116 instantiate, kUserVisibleName, TypeArguments::Handle()); |
2134 } | 2117 } |
2135 | 2118 |
2136 // Build a string of the form '(A, {b: B, c: C}) => D' representing the | 2119 // Build a string of the form '(A, {b: B, c: C}) => D' representing the |
2137 // signature of the given function, where all generic types (e.g. '<T, R>' in | 2120 // signature of the given function, where all generic types (e.g. '<T, R>' in |
2138 // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given | 2121 // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given |
2139 // instantiator type argument vector of a C instance (e.g. '<A, D>'). | 2122 // instantiator type argument vector of a C instance (e.g. '<A, D>'). |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 bool HasBreakpoint() const; | 2195 bool HasBreakpoint() const; |
2213 | 2196 |
2214 RawContextScope* context_scope() const; | 2197 RawContextScope* context_scope() const; |
2215 void set_context_scope(const ContextScope& value) const; | 2198 void set_context_scope(const ContextScope& value) const; |
2216 | 2199 |
2217 RawField* LookupImplicitGetterSetterField() const; | 2200 RawField* LookupImplicitGetterSetterField() const; |
2218 | 2201 |
2219 // Enclosing function of this local function. | 2202 // Enclosing function of this local function. |
2220 RawFunction* parent_function() const; | 2203 RawFunction* parent_function() const; |
2221 | 2204 |
2222 // Signature class of this closure function or signature function. | |
2223 RawClass* signature_class() const; | |
2224 void set_signature_class(const Class& value) const; | |
2225 | |
2226 void set_extracted_method_closure(const Function& function) const; | 2205 void set_extracted_method_closure(const Function& function) const; |
2227 RawFunction* extracted_method_closure() const; | 2206 RawFunction* extracted_method_closure() const; |
2228 | 2207 |
2229 void set_saved_args_desc(const Array& array) const; | 2208 void set_saved_args_desc(const Array& array) const; |
2230 RawArray* saved_args_desc() const; | 2209 RawArray* saved_args_desc() const; |
2231 | 2210 |
2232 bool IsMethodExtractor() const { | 2211 bool IsMethodExtractor() const { |
2233 return kind() == RawFunction::kMethodExtractor; | 2212 return kind() == RawFunction::kMethodExtractor; |
2234 } | 2213 } |
2235 | 2214 |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2487 Error* bound_error, | 2466 Error* bound_error, |
2488 Heap::Space space = Heap::kNew) const { | 2467 Heap::Space space = Heap::kNew) const { |
2489 return TypeTest(kIsMoreSpecificThan, | 2468 return TypeTest(kIsMoreSpecificThan, |
2490 type_arguments, | 2469 type_arguments, |
2491 other, | 2470 other, |
2492 other_type_arguments, | 2471 other_type_arguments, |
2493 bound_error, | 2472 bound_error, |
2494 space); | 2473 space); |
2495 } | 2474 } |
2496 | 2475 |
| 2476 // Check the subtype or 'more specific' relationship. |
| 2477 bool TypeTest(TypeTestKind test_kind, |
| 2478 const TypeArguments& type_arguments, |
| 2479 const Function& other, |
| 2480 const TypeArguments& other_type_arguments, |
| 2481 Error* bound_error, |
| 2482 Heap::Space space) const; |
| 2483 |
2497 // Returns true if this function represents an explicit getter function. | 2484 // Returns true if this function represents an explicit getter function. |
2498 bool IsGetterFunction() const { | 2485 bool IsGetterFunction() const { |
2499 return kind() == RawFunction::kGetterFunction; | 2486 return kind() == RawFunction::kGetterFunction; |
2500 } | 2487 } |
2501 | 2488 |
2502 // Returns true if this function represents an implicit getter function. | 2489 // Returns true if this function represents an implicit getter function. |
2503 bool IsImplicitGetterFunction() const { | 2490 bool IsImplicitGetterFunction() const { |
2504 return kind() == RawFunction::kImplicitGetter; | 2491 return kind() == RawFunction::kImplicitGetter; |
2505 } | 2492 } |
2506 | 2493 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2550 | 2537 |
2551 // Returns true if this function represents a local function. | 2538 // Returns true if this function represents a local function. |
2552 bool IsLocalFunction() const { | 2539 bool IsLocalFunction() const { |
2553 return parent_function() != Function::null(); | 2540 return parent_function() != Function::null(); |
2554 } | 2541 } |
2555 | 2542 |
2556 // Returns true if this function represents a signature function without code. | 2543 // Returns true if this function represents a signature function without code. |
2557 bool IsSignatureFunction() const { | 2544 bool IsSignatureFunction() const { |
2558 return kind() == RawFunction::kSignatureFunction; | 2545 return kind() == RawFunction::kSignatureFunction; |
2559 } | 2546 } |
| 2547 static bool IsSignatureFunction(RawFunction* function) { |
| 2548 NoSafepointScope no_safepoint; |
| 2549 return KindBits::decode(function->ptr()->kind_tag_) == |
| 2550 RawFunction::kSignatureFunction; |
| 2551 } |
2560 | 2552 |
2561 bool IsAsyncFunction() const { | 2553 bool IsAsyncFunction() const { |
2562 return modifier() == RawFunction::kAsync; | 2554 return modifier() == RawFunction::kAsync; |
2563 } | 2555 } |
2564 | 2556 |
2565 bool IsAsyncClosure() const { | 2557 bool IsAsyncClosure() const { |
2566 return is_generated_body() && | 2558 return is_generated_body() && |
2567 Function::Handle(parent_function()).IsAsyncFunction(); | 2559 Function::Handle(parent_function()).IsAsyncFunction(); |
2568 } | 2560 } |
2569 | 2561 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2605 static RawFunction* New(const String& name, | 2597 static RawFunction* New(const String& name, |
2606 RawFunction::Kind kind, | 2598 RawFunction::Kind kind, |
2607 bool is_static, | 2599 bool is_static, |
2608 bool is_const, | 2600 bool is_const, |
2609 bool is_abstract, | 2601 bool is_abstract, |
2610 bool is_external, | 2602 bool is_external, |
2611 bool is_native, | 2603 bool is_native, |
2612 const Object& owner, | 2604 const Object& owner, |
2613 intptr_t token_pos); | 2605 intptr_t token_pos); |
2614 | 2606 |
2615 // Allocates a new Function object representing a closure function, as well as | 2607 // Allocates a new Function object representing a closure function. |
2616 // a new associated Class object representing the signature class of the | |
2617 // function. | |
2618 // The function and the class share the same given name. | |
2619 static RawFunction* NewClosureFunction(const String& name, | 2608 static RawFunction* NewClosureFunction(const String& name, |
2620 const Function& parent, | 2609 const Function& parent, |
2621 intptr_t token_pos); | 2610 intptr_t token_pos); |
2622 | 2611 |
| 2612 // Allocates a new Function object representing a signature function. |
| 2613 // The owner is the scope class of the function type. |
| 2614 static RawFunction* NewSignatureFunction(const Class& owner, |
| 2615 intptr_t token_pos); |
| 2616 |
2623 static RawFunction* NewEvalFunction(const Class& owner, | 2617 static RawFunction* NewEvalFunction(const Class& owner, |
2624 const Script& script, | 2618 const Script& script, |
2625 bool is_static); | 2619 bool is_static); |
2626 | 2620 |
2627 RawFunction* CreateMethodExtractor(const String& getter_name) const; | 2621 RawFunction* CreateMethodExtractor(const String& getter_name) const; |
2628 RawFunction* GetMethodExtractor(const String& getter_name) const; | 2622 RawFunction* GetMethodExtractor(const String& getter_name) const; |
2629 | 2623 |
2630 // Allocate new function object, clone values from this function. The | 2624 // Allocate new function object, clone values from this function. The |
2631 // owner of the clone is new_owner. | 2625 // owner of the clone is new_owner. |
2632 RawFunction* Clone(const Class& new_owner) const; | 2626 RawFunction* Clone(const Class& new_owner) const; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2768 | 2762 |
2769 void BuildSignatureParameters( | 2763 void BuildSignatureParameters( |
2770 bool instantiate, | 2764 bool instantiate, |
2771 NameVisibility name_visibility, | 2765 NameVisibility name_visibility, |
2772 const TypeArguments& instantiator, | 2766 const TypeArguments& instantiator, |
2773 GrowableHandlePtrArray<const String>* pieces) const; | 2767 GrowableHandlePtrArray<const String>* pieces) const; |
2774 RawString* BuildSignature(bool instantiate, | 2768 RawString* BuildSignature(bool instantiate, |
2775 NameVisibility name_visibility, | 2769 NameVisibility name_visibility, |
2776 const TypeArguments& instantiator) const; | 2770 const TypeArguments& instantiator) const; |
2777 | 2771 |
2778 // Check the subtype or 'more specific' relationship. | |
2779 bool TypeTest(TypeTestKind test_kind, | |
2780 const TypeArguments& type_arguments, | |
2781 const Function& other, | |
2782 const TypeArguments& other_type_arguments, | |
2783 Error* bound_error, | |
2784 Heap::Space space) const; | |
2785 | |
2786 // Checks the type of the formal parameter at the given position for | 2772 // Checks the type of the formal parameter at the given position for |
2787 // subtyping or 'more specific' relationship between the type of this function | 2773 // subtyping or 'more specific' relationship between the type of this function |
2788 // and the type of the other function. | 2774 // and the type of the other function. |
2789 bool TestParameterType(TypeTestKind test_kind, | 2775 bool TestParameterType(TypeTestKind test_kind, |
2790 intptr_t parameter_position, | 2776 intptr_t parameter_position, |
2791 intptr_t other_parameter_position, | 2777 intptr_t other_parameter_position, |
2792 const TypeArguments& type_arguments, | 2778 const TypeArguments& type_arguments, |
2793 const Function& other, | 2779 const Function& other, |
2794 const TypeArguments& other_type_arguments, | 2780 const TypeArguments& other_type_arguments, |
2795 Error* bound_error, | 2781 Error* bound_error, |
(...skipping 16 matching lines...) Expand all Loading... |
2812 } | 2798 } |
2813 | 2799 |
2814 private: | 2800 private: |
2815 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } | 2801 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } |
2816 void set_context_scope(const ContextScope& value) const; | 2802 void set_context_scope(const ContextScope& value) const; |
2817 | 2803 |
2818 // Enclosing function of this local function. | 2804 // Enclosing function of this local function. |
2819 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } | 2805 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } |
2820 void set_parent_function(const Function& value) const; | 2806 void set_parent_function(const Function& value) const; |
2821 | 2807 |
2822 // Signature class of this closure function or signature function. | 2808 // Signature type of this closure function. |
2823 RawClass* signature_class() const { return raw_ptr()->signature_class_; } | 2809 RawFunctionType* signature_type() const { return raw_ptr()->signature_type_; } |
2824 void set_signature_class(const Class& value) const; | 2810 void set_signature_type(const FunctionType& value) const; |
2825 | 2811 |
2826 RawInstance* implicit_static_closure() const { | 2812 RawInstance* implicit_static_closure() const { |
2827 return raw_ptr()->closure_; | 2813 return raw_ptr()->closure_; |
2828 } | 2814 } |
2829 void set_implicit_static_closure(const Instance& closure) const; | 2815 void set_implicit_static_closure(const Instance& closure) const; |
2830 | 2816 |
2831 static RawClosureData* New(); | 2817 static RawClosureData* New(); |
2832 | 2818 |
2833 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); | 2819 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); |
2834 friend class Class; | 2820 friend class Class; |
(...skipping 1885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4720 static inline RawObject* GetTargetFunction(const Array& array, | 4706 static inline RawObject* GetTargetFunction(const Array& array, |
4721 intptr_t index); | 4707 intptr_t index); |
4722 | 4708 |
4723 FINAL_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache, Object); | 4709 FINAL_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache, Object); |
4724 }; | 4710 }; |
4725 | 4711 |
4726 | 4712 |
4727 class SubtypeTestCache : public Object { | 4713 class SubtypeTestCache : public Object { |
4728 public: | 4714 public: |
4729 enum Entries { | 4715 enum Entries { |
4730 kInstanceClassId = 0, | 4716 kInstanceClassIdOrFunction = 0, |
4731 kInstanceTypeArguments = 1, | 4717 kInstanceTypeArguments = 1, |
4732 kInstantiatorTypeArguments = 2, | 4718 kInstantiatorTypeArguments = 2, |
4733 kTestResult = 3, | 4719 kTestResult = 3, |
4734 kTestEntryLength = 4, | 4720 kTestEntryLength = 4, |
4735 }; | 4721 }; |
4736 | 4722 |
4737 intptr_t NumberOfChecks() const; | 4723 intptr_t NumberOfChecks() const; |
4738 void AddCheck(intptr_t class_id, | 4724 void AddCheck(const Object& instance_class_id_or_function, |
4739 const TypeArguments& instance_type_arguments, | 4725 const TypeArguments& instance_type_arguments, |
4740 const TypeArguments& instantiator_type_arguments, | 4726 const TypeArguments& instantiator_type_arguments, |
4741 const Bool& test_result) const; | 4727 const Bool& test_result) const; |
4742 void GetCheck(intptr_t ix, | 4728 void GetCheck(intptr_t ix, |
4743 intptr_t* class_id, | 4729 Object* instance_class_id_or_function, |
4744 TypeArguments* instance_type_arguments, | 4730 TypeArguments* instance_type_arguments, |
4745 TypeArguments* instantiator_type_arguments, | 4731 TypeArguments* instantiator_type_arguments, |
4746 Bool* test_result) const; | 4732 Bool* test_result) const; |
4747 | 4733 |
4748 static RawSubtypeTestCache* New(); | 4734 static RawSubtypeTestCache* New(); |
4749 | 4735 |
4750 static intptr_t InstanceSize() { | 4736 static intptr_t InstanceSize() { |
4751 return RoundedAllocationSize(sizeof(RawSubtypeTestCache)); | 4737 return RoundedAllocationSize(sizeof(RawSubtypeTestCache)); |
4752 } | 4738 } |
4753 | 4739 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4956 | 4942 |
4957 RawObject* GetField(const Field& field) const { | 4943 RawObject* GetField(const Field& field) const { |
4958 return *FieldAddr(field); | 4944 return *FieldAddr(field); |
4959 } | 4945 } |
4960 | 4946 |
4961 void SetField(const Field& field, const Object& value) const { | 4947 void SetField(const Field& field, const Object& value) const { |
4962 field.RecordStore(value); | 4948 field.RecordStore(value); |
4963 StorePointer(FieldAddr(field), value.raw()); | 4949 StorePointer(FieldAddr(field), value.raw()); |
4964 } | 4950 } |
4965 | 4951 |
4966 RawType* GetType() const; | 4952 RawAbstractType* GetType() const; |
4967 | 4953 |
4968 virtual RawTypeArguments* GetTypeArguments() const; | 4954 virtual RawTypeArguments* GetTypeArguments() const; |
4969 virtual void SetTypeArguments(const TypeArguments& value) const; | 4955 virtual void SetTypeArguments(const TypeArguments& value) const; |
4970 | 4956 |
4971 // Check if the type of this instance is a subtype of the given type. | 4957 // Check if the type of this instance is a subtype of the given type. |
4972 bool IsInstanceOf(const AbstractType& type, | 4958 bool IsInstanceOf(const AbstractType& type, |
4973 const TypeArguments& type_instantiator, | 4959 const TypeArguments& type_instantiator, |
4974 Error* bound_error) const; | 4960 Error* bound_error) const; |
4975 | 4961 |
4976 bool IsValidNativeIndex(int index) const { | 4962 bool IsValidNativeIndex(int index) const { |
4977 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); | 4963 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); |
4978 } | 4964 } |
4979 | 4965 |
4980 intptr_t* NativeFieldsDataAddr() const; | 4966 intptr_t* NativeFieldsDataAddr() const; |
4981 inline intptr_t GetNativeField(int index) const; | 4967 inline intptr_t GetNativeField(int index) const; |
4982 inline void GetNativeFields(uint16_t num_fields, | 4968 inline void GetNativeFields(uint16_t num_fields, |
4983 intptr_t* field_values) const; | 4969 intptr_t* field_values) const; |
4984 void SetNativeFields(uint16_t num_fields, | 4970 void SetNativeFields(uint16_t num_fields, |
4985 const intptr_t* field_values) const; | 4971 const intptr_t* field_values) const; |
4986 | 4972 |
4987 uint16_t NumNativeFields() const { | 4973 uint16_t NumNativeFields() const { |
4988 return clazz()->ptr()->num_native_fields_; | 4974 return clazz()->ptr()->num_native_fields_; |
4989 } | 4975 } |
4990 | 4976 |
4991 void SetNativeField(int index, intptr_t value) const; | 4977 void SetNativeField(int index, intptr_t value) const; |
4992 | 4978 |
4993 // Returns true if the instance is a closure object. | |
4994 bool IsClosure() const; | |
4995 | |
4996 // If the instance is a callable object, i.e. a closure or the instance of a | 4979 // If the instance is a callable object, i.e. a closure or the instance of a |
4997 // class implementing a 'call' method, return true and set the function | 4980 // class implementing a 'call' method, return true and set the function |
4998 // (if not NULL) to call. | 4981 // (if not NULL) to call. |
4999 bool IsCallable(Function* function) const; | 4982 bool IsCallable(Function* function) const; |
5000 | 4983 |
5001 // Evaluate the given expression as if it appeared in an instance | 4984 // Evaluate the given expression as if it appeared in an instance |
5002 // method of this instance and return the resulting value, or an | 4985 // method of this instance and return the resulting value, or an |
5003 // error object if evaluating the expression fails. The method has | 4986 // error object if evaluating the expression fails. The method has |
5004 // the formal parameters given in param_names, and is invoked with | 4987 // the formal parameters given in param_names, and is invoked with |
5005 // the argument values given in param_values. | 4988 // the argument values given in param_values. |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5112 FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Instance); | 5095 FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Instance); |
5113 friend class Class; | 5096 friend class Class; |
5114 }; | 5097 }; |
5115 | 5098 |
5116 | 5099 |
5117 // AbstractType is an abstract superclass. | 5100 // AbstractType is an abstract superclass. |
5118 // Subclasses of AbstractType are Type and TypeParameter. | 5101 // Subclasses of AbstractType are Type and TypeParameter. |
5119 class AbstractType : public Instance { | 5102 class AbstractType : public Instance { |
5120 public: | 5103 public: |
5121 virtual bool IsFinalized() const; | 5104 virtual bool IsFinalized() const; |
| 5105 virtual void SetIsFinalized() const; |
5122 virtual bool IsBeingFinalized() const; | 5106 virtual bool IsBeingFinalized() const; |
| 5107 virtual void SetIsBeingFinalized() const; |
5123 virtual bool IsMalformed() const; | 5108 virtual bool IsMalformed() const; |
5124 virtual bool IsMalbounded() const; | 5109 virtual bool IsMalbounded() const; |
5125 virtual bool IsMalformedOrMalbounded() const; | 5110 virtual bool IsMalformedOrMalbounded() const; |
5126 virtual RawLanguageError* error() const; | 5111 virtual RawLanguageError* error() const; |
5127 virtual void set_error(const LanguageError& value) const; | 5112 virtual void set_error(const LanguageError& value) const; |
5128 virtual bool IsResolved() const; | 5113 virtual bool IsResolved() const; |
| 5114 virtual void SetIsResolved() const; |
5129 virtual bool HasResolvedTypeClass() const; | 5115 virtual bool HasResolvedTypeClass() const; |
5130 virtual RawClass* type_class() const; | 5116 virtual RawClass* type_class() const; |
5131 virtual RawUnresolvedClass* unresolved_class() const; | 5117 virtual RawUnresolvedClass* unresolved_class() const; |
5132 virtual RawTypeArguments* arguments() const; | 5118 virtual RawTypeArguments* arguments() const; |
| 5119 virtual void set_arguments(const TypeArguments& value) const; |
5133 virtual intptr_t token_pos() const; | 5120 virtual intptr_t token_pos() const; |
5134 virtual bool IsInstantiated(TrailPtr trail = NULL) const; | 5121 virtual bool IsInstantiated(TrailPtr trail = NULL) const; |
5135 virtual bool CanonicalizeEquals(const Instance& other) const { | 5122 virtual bool CanonicalizeEquals(const Instance& other) const { |
5136 return Equals(other); | 5123 return Equals(other); |
5137 } | 5124 } |
5138 virtual bool Equals(const Instance& other) const { | 5125 virtual bool Equals(const Instance& other) const { |
5139 return IsEquivalent(other); | 5126 return IsEquivalent(other); |
5140 } | 5127 } |
5141 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; | 5128 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; |
5142 virtual bool IsRecursive() const; | 5129 virtual bool IsRecursive() const; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5237 | 5224 |
5238 // Check if this type represents the 'num' type. | 5225 // Check if this type represents the 'num' type. |
5239 bool IsNumberType() const; | 5226 bool IsNumberType() const; |
5240 | 5227 |
5241 // Check if this type represents the '_Smi' type. | 5228 // Check if this type represents the '_Smi' type. |
5242 bool IsSmiType() const; | 5229 bool IsSmiType() const; |
5243 | 5230 |
5244 // Check if this type represents the 'String' type. | 5231 // Check if this type represents the 'String' type. |
5245 bool IsStringType() const; | 5232 bool IsStringType() const; |
5246 | 5233 |
5247 // Check if this type represents the 'Function' type. | 5234 // Check if this type represents the Dart 'Function' type. |
5248 bool IsFunctionType() const; | 5235 bool IsDartFunctionType() const; |
5249 | 5236 |
5250 // Check the subtype relationship. | 5237 // Check the subtype relationship. |
5251 bool IsSubtypeOf(const AbstractType& other, | 5238 bool IsSubtypeOf(const AbstractType& other, |
5252 Error* bound_error, | 5239 Error* bound_error, |
5253 Heap::Space space = Heap::kNew) const { | 5240 Heap::Space space = Heap::kNew) const { |
5254 return TypeTest(kIsSubtypeOf, other, bound_error, space); | 5241 return TypeTest(kIsSubtypeOf, other, bound_error, space); |
5255 } | 5242 } |
5256 | 5243 |
5257 // Check the 'more specific' relationship. | 5244 // Check the 'more specific' relationship. |
5258 bool IsMoreSpecificThan(const AbstractType& other, | 5245 bool IsMoreSpecificThan(const AbstractType& other, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5290 class Type : public AbstractType { | 5277 class Type : public AbstractType { |
5291 public: | 5278 public: |
5292 static intptr_t type_class_offset() { | 5279 static intptr_t type_class_offset() { |
5293 return OFFSET_OF(RawType, type_class_); | 5280 return OFFSET_OF(RawType, type_class_); |
5294 } | 5281 } |
5295 virtual bool IsFinalized() const { | 5282 virtual bool IsFinalized() const { |
5296 return | 5283 return |
5297 (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) || | 5284 (raw_ptr()->type_state_ == RawType::kFinalizedInstantiated) || |
5298 (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated); | 5285 (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated); |
5299 } | 5286 } |
5300 void SetIsFinalized() const; | 5287 virtual void SetIsFinalized() const; |
5301 void ResetIsFinalized() const; // Ignore current state and set again. | |
5302 virtual bool IsBeingFinalized() const { | 5288 virtual bool IsBeingFinalized() const { |
5303 return raw_ptr()->type_state_ == RawType::kBeingFinalized; | 5289 return raw_ptr()->type_state_ == RawType::kBeingFinalized; |
5304 } | 5290 } |
5305 void set_is_being_finalized() const; | 5291 virtual void SetIsBeingFinalized() const; |
5306 virtual bool IsMalformed() const; | 5292 virtual bool IsMalformed() const; |
5307 virtual bool IsMalbounded() const; | 5293 virtual bool IsMalbounded() const; |
5308 virtual bool IsMalformedOrMalbounded() const; | 5294 virtual bool IsMalformedOrMalbounded() const; |
5309 virtual RawLanguageError* error() const { return raw_ptr()->error_; } | 5295 virtual RawLanguageError* error() const { return raw_ptr()->error_; } |
5310 virtual void set_error(const LanguageError& value) const; | 5296 virtual void set_error(const LanguageError& value) const; |
5311 virtual bool IsResolved() const { | 5297 virtual bool IsResolved() const { |
5312 return raw_ptr()->type_state_ >= RawType::kResolved; | 5298 return raw_ptr()->type_state_ >= RawType::kResolved; |
5313 } | 5299 } |
5314 void set_is_resolved() const; | 5300 virtual void SetIsResolved() const; |
5315 virtual bool HasResolvedTypeClass() const; // Own type class resolved. | 5301 virtual bool HasResolvedTypeClass() const; // Own type class resolved. |
5316 virtual RawClass* type_class() const; | 5302 virtual RawClass* type_class() const; |
5317 void set_type_class(const Object& value) const; | 5303 void set_type_class(const Object& value) const; |
5318 virtual RawUnresolvedClass* unresolved_class() const; | 5304 virtual RawUnresolvedClass* unresolved_class() const; |
5319 virtual RawTypeArguments* arguments() const; | 5305 virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; } |
5320 void set_arguments(const TypeArguments& value) const; | 5306 virtual void set_arguments(const TypeArguments& value) const; |
5321 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } | 5307 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } |
5322 virtual bool IsInstantiated(TrailPtr trail = NULL) const; | 5308 virtual bool IsInstantiated(TrailPtr trail = NULL) const; |
5323 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; | 5309 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; |
5324 virtual bool IsRecursive() const; | 5310 virtual bool IsRecursive() const; |
5325 virtual RawAbstractType* InstantiateFrom( | 5311 virtual RawAbstractType* InstantiateFrom( |
5326 const TypeArguments& instantiator_type_arguments, | 5312 const TypeArguments& instantiator_type_arguments, |
5327 Error* bound_error, | 5313 Error* bound_error, |
5328 TrailPtr trail = NULL, | 5314 TrailPtr trail = NULL, |
5329 Heap::Space space = Heap::kNew) const; | 5315 Heap::Space space = Heap::kNew) const; |
5330 virtual RawAbstractType* CloneUnfinalized() const; | 5316 virtual RawAbstractType* CloneUnfinalized() const; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5400 void set_type_state(int8_t state) const; | 5386 void set_type_state(int8_t state) const; |
5401 | 5387 |
5402 static RawType* New(Heap::Space space = Heap::kOld); | 5388 static RawType* New(Heap::Space space = Heap::kOld); |
5403 | 5389 |
5404 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); | 5390 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); |
5405 friend class Class; | 5391 friend class Class; |
5406 friend class TypeArguments; | 5392 friend class TypeArguments; |
5407 }; | 5393 }; |
5408 | 5394 |
5409 | 5395 |
| 5396 // TODO(regis): FunctionType is very similar to Type. Instead of a separate |
| 5397 // class FunctionType, we could consider an object of class Type as representing |
| 5398 // a function type if it has a non-null function (signature) field. |
| 5399 // In order to save space, we could reuse the error_ field? A malformed or |
| 5400 // malbounded function type would lose its function reference, but the error |
| 5401 // string would contain relevant info. |
| 5402 |
| 5403 // A FunctionType describes the signature of a function, i.e. the result type |
| 5404 // and formal parameter types of the function, as well as the names of optional |
| 5405 // named formal parameters. |
| 5406 // If these types refer to type parameters of a class in scope, the function |
| 5407 // type is generic. A generic function type may be instantiated by a type |
| 5408 // argument vector. |
| 5409 // Therefore, a FunctionType consists of a scope class, a type argument vector, |
| 5410 // and a signature. |
| 5411 // The scope class is either a generic class (or generic typedef) declaring the |
| 5412 // type parameters referred to by the signature, or class _Closure in the |
| 5413 // non-generic case (including the non-generic typedef case). |
| 5414 // The type arguments specify an instantiation of the generic signature (null in |
| 5415 // the non-generic case). |
| 5416 // The signature is a reference to an actual closure function (kClosureFunction) |
| 5417 // or to a signature function (kSignatureFunction). |
| 5418 // Since typedefs cannot refer to themselves, directly or indirectly, a |
| 5419 // FunctionType cannot be recursive. Only individual formal parameter types can. |
| 5420 class FunctionType : public AbstractType { |
| 5421 public: |
| 5422 virtual bool IsFinalized() const { |
| 5423 return |
| 5424 (raw_ptr()->type_state_ == RawFunctionType::kFinalizedInstantiated) || |
| 5425 (raw_ptr()->type_state_ == RawFunctionType::kFinalizedUninstantiated); |
| 5426 } |
| 5427 virtual void SetIsFinalized() const; |
| 5428 void ResetIsFinalized() const; // Ignore current state and set again. |
| 5429 virtual bool IsBeingFinalized() const { |
| 5430 return raw_ptr()->type_state_ == RawFunctionType::kBeingFinalized; |
| 5431 } |
| 5432 virtual void SetIsBeingFinalized() const; |
| 5433 virtual bool IsMalformed() const; |
| 5434 virtual bool IsMalbounded() const; |
| 5435 virtual bool IsMalformedOrMalbounded() const; |
| 5436 virtual RawLanguageError* error() const { return raw_ptr()->error_; } |
| 5437 virtual void set_error(const LanguageError& value) const; |
| 5438 virtual bool IsResolved() const { |
| 5439 return raw_ptr()->type_state_ >= RawFunctionType::kResolved; |
| 5440 } |
| 5441 virtual void SetIsResolved() const; |
| 5442 // The scope class of a FunctionType is always resolved. It has no actual |
| 5443 // type class. Returning false is important for the type testers to work, e.g. |
| 5444 // IsDynamicType(), IsBoolType(), etc... |
| 5445 virtual bool HasResolvedTypeClass() const { return false; } |
| 5446 // Return scope_class from virtual type_class() to factorize finalization |
| 5447 // with Type, also a parameterized type. |
| 5448 virtual RawClass* type_class() const { return scope_class(); } |
| 5449 RawClass* scope_class() const { return raw_ptr()->scope_class_; } |
| 5450 void set_scope_class(const Class& value) const; |
| 5451 virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; } |
| 5452 virtual void set_arguments(const TypeArguments& value) const; |
| 5453 RawFunction* signature() const { return raw_ptr()->signature_; } |
| 5454 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } |
| 5455 virtual bool IsInstantiated(TrailPtr trail = NULL) const; |
| 5456 virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const; |
| 5457 virtual bool IsRecursive() const; |
| 5458 virtual RawAbstractType* InstantiateFrom( |
| 5459 const TypeArguments& instantiator_type_arguments, |
| 5460 Error* malformed_error, |
| 5461 TrailPtr trail = NULL, |
| 5462 Heap::Space space = Heap::kNew) const; |
| 5463 virtual RawAbstractType* CloneUnfinalized() const; |
| 5464 virtual RawAbstractType* CloneUninstantiated( |
| 5465 const Class& new_owner, |
| 5466 TrailPtr trail = NULL) const; |
| 5467 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; |
| 5468 |
| 5469 virtual intptr_t Hash() const; |
| 5470 |
| 5471 static intptr_t InstanceSize() { |
| 5472 return RoundedAllocationSize(sizeof(RawFunctionType)); |
| 5473 } |
| 5474 |
| 5475 static RawFunctionType* New(const Class& scope_class, |
| 5476 const TypeArguments& arguments, |
| 5477 const Function& signature, |
| 5478 intptr_t token_pos, |
| 5479 Heap::Space space = Heap::kOld); |
| 5480 |
| 5481 private: |
| 5482 void set_signature(const Function& value) const; |
| 5483 void set_token_pos(intptr_t token_pos) const; |
| 5484 void set_type_state(int8_t state) const; |
| 5485 |
| 5486 static RawFunctionType* New(Heap::Space space = Heap::kOld); |
| 5487 |
| 5488 FINAL_HEAP_OBJECT_IMPLEMENTATION(FunctionType, AbstractType); |
| 5489 friend class Class; |
| 5490 friend class TypeArguments; |
| 5491 }; |
| 5492 |
| 5493 |
5410 // A TypeRef is used to break cycles in the representation of recursive types. | 5494 // A TypeRef is used to break cycles in the representation of recursive types. |
5411 // Its only field is the recursive AbstractType it refers to. | 5495 // Its only field is the recursive AbstractType it refers to. |
5412 // Note that the cycle always involves type arguments. | 5496 // Note that the cycle always involves type arguments. |
5413 class TypeRef : public AbstractType { | 5497 class TypeRef : public AbstractType { |
5414 public: | 5498 public: |
5415 virtual bool IsFinalized() const { | 5499 virtual bool IsFinalized() const { |
5416 return AbstractType::Handle(type()).IsFinalized(); | 5500 return AbstractType::Handle(type()).IsFinalized(); |
5417 } | 5501 } |
5418 virtual bool IsBeingFinalized() const { | 5502 virtual bool IsBeingFinalized() const { |
5419 return AbstractType::Handle(type()).IsBeingFinalized(); | 5503 return AbstractType::Handle(type()).IsBeingFinalized(); |
5420 } | 5504 } |
5421 virtual bool IsMalformed() const { | 5505 virtual bool IsMalformed() const { |
5422 return AbstractType::Handle(type()).IsMalformed(); | 5506 return AbstractType::Handle(type()).IsMalformed(); |
5423 } | 5507 } |
5424 virtual bool IsMalbounded() const { | 5508 virtual bool IsMalbounded() const { |
5425 return AbstractType::Handle(type()).IsMalbounded(); | 5509 return AbstractType::Handle(type()).IsMalbounded(); |
5426 } | 5510 } |
5427 virtual bool IsMalformedOrMalbounded() const { | 5511 virtual bool IsMalformedOrMalbounded() const { |
5428 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); | 5512 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); |
5429 } | 5513 } |
5430 virtual bool IsResolved() const { return true; } | 5514 virtual bool IsResolved() const { return true; } |
5431 virtual bool HasResolvedTypeClass() const { return true; } | 5515 virtual bool HasResolvedTypeClass() const { |
| 5516 // Returns false if the ref type is a function type. |
| 5517 return AbstractType::Handle(type()).HasResolvedTypeClass(); |
| 5518 } |
5432 RawAbstractType* type() const { return raw_ptr()->type_; } | 5519 RawAbstractType* type() const { return raw_ptr()->type_; } |
5433 void set_type(const AbstractType& value) const; | 5520 void set_type(const AbstractType& value) const; |
5434 virtual RawClass* type_class() const { | 5521 virtual RawClass* type_class() const { |
5435 return AbstractType::Handle(type()).type_class(); | 5522 return AbstractType::Handle(type()).type_class(); |
5436 } | 5523 } |
5437 virtual RawTypeArguments* arguments() const { | 5524 virtual RawTypeArguments* arguments() const { |
5438 return AbstractType::Handle(type()).arguments(); | 5525 return AbstractType::Handle(type()).arguments(); |
5439 } | 5526 } |
5440 virtual intptr_t token_pos() const { | 5527 virtual intptr_t token_pos() const { |
5441 return AbstractType::Handle(type()).token_pos(); | 5528 return AbstractType::Handle(type()).token_pos(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5490 // Upon finalization, the TypeParameter index is changed to reflect its position | 5577 // Upon finalization, the TypeParameter index is changed to reflect its position |
5491 // as type argument (rather than type parameter) of the parameterized class. | 5578 // as type argument (rather than type parameter) of the parameterized class. |
5492 // If the type parameter is declared without an extends clause, its bound is set | 5579 // If the type parameter is declared without an extends clause, its bound is set |
5493 // to the ObjectType. | 5580 // to the ObjectType. |
5494 class TypeParameter : public AbstractType { | 5581 class TypeParameter : public AbstractType { |
5495 public: | 5582 public: |
5496 virtual bool IsFinalized() const { | 5583 virtual bool IsFinalized() const { |
5497 ASSERT(raw_ptr()->type_state_ != RawTypeParameter::kFinalizedInstantiated); | 5584 ASSERT(raw_ptr()->type_state_ != RawTypeParameter::kFinalizedInstantiated); |
5498 return raw_ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated; | 5585 return raw_ptr()->type_state_ == RawTypeParameter::kFinalizedUninstantiated; |
5499 } | 5586 } |
5500 void set_is_finalized() const; | 5587 virtual void SetIsFinalized() const; |
5501 virtual bool IsBeingFinalized() const { return false; } | 5588 virtual bool IsBeingFinalized() const { return false; } |
5502 virtual bool IsMalformed() const { return false; } | 5589 virtual bool IsMalformed() const { return false; } |
5503 virtual bool IsMalbounded() const { return false; } | 5590 virtual bool IsMalbounded() const { return false; } |
5504 virtual bool IsMalformedOrMalbounded() const { return false; } | 5591 virtual bool IsMalformedOrMalbounded() const { return false; } |
5505 virtual bool IsResolved() const { return true; } | 5592 virtual bool IsResolved() const { return true; } |
5506 virtual bool HasResolvedTypeClass() const { return false; } | 5593 virtual bool HasResolvedTypeClass() const { return false; } |
5507 RawClass* parameterized_class() const { | 5594 RawClass* parameterized_class() const { |
5508 return raw_ptr()->parameterized_class_; | 5595 return raw_ptr()->parameterized_class_; |
5509 } | 5596 } |
5510 RawString* name() const { return raw_ptr()->name_; } | 5597 RawString* name() const { return raw_ptr()->name_; } |
(...skipping 2155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7666 static const intptr_t kInitialIndexSize = 1 << (kInitialIndexBits + 1); | 7753 static const intptr_t kInitialIndexSize = 1 << (kInitialIndexBits + 1); |
7667 | 7754 |
7668 // Allocate a map, but leave all fields set to null. | 7755 // Allocate a map, but leave all fields set to null. |
7669 // Used during deserialization (since map might contain itself as key/value). | 7756 // Used during deserialization (since map might contain itself as key/value). |
7670 static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew); | 7757 static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew); |
7671 | 7758 |
7672 friend class Class; | 7759 friend class Class; |
7673 }; | 7760 }; |
7674 | 7761 |
7675 | 7762 |
7676 class Closure : public AllStatic { | 7763 class Closure : public Instance { |
7677 public: | 7764 public: |
7678 static RawFunction* function(const Instance& closure) { | 7765 RawFunction* function() const { return raw_ptr()->function_; } |
7679 return *FunctionAddr(closure); | 7766 void set_function(const Function& function) const { |
| 7767 // TODO(regis): Only used from deferred_objects.cc. Remove once fixed. |
| 7768 StorePointer(&raw_ptr()->function_, function.raw()); |
7680 } | 7769 } |
7681 static intptr_t function_offset() { | 7770 static intptr_t function_offset() { return OFFSET_OF(RawClosure, function_); } |
7682 return static_cast<intptr_t>(kFunctionOffset * kWordSize); | 7771 |
| 7772 RawContext* context() const { return raw_ptr()->context_; } |
| 7773 void set_context(const Context& context) const { |
| 7774 // TODO(regis): Only used from deferred_objects.cc. Remove once fixed. |
| 7775 StorePointer(&raw_ptr()->context_, context.raw()); |
| 7776 } |
| 7777 static intptr_t context_offset() { return OFFSET_OF(RawClosure, context_); } |
| 7778 |
| 7779 static intptr_t type_arguments_offset() { |
| 7780 return OFFSET_OF(RawClosure, type_arguments_); |
7683 } | 7781 } |
7684 | 7782 |
7685 static RawContext* context(const Instance& closure) { | 7783 static intptr_t InstanceSize() { |
7686 return *ContextAddr(closure); | 7784 return RoundedAllocationSize(sizeof(RawClosure)); |
7687 } | |
7688 static intptr_t context_offset() { | |
7689 return static_cast<intptr_t>(kContextOffset * kWordSize); | |
7690 } | 7785 } |
7691 | 7786 |
7692 static RawTypeArguments* GetTypeArguments(const Instance& closure) { | 7787 // Returns true if all elements are OK for canonicalization. |
7693 return *TypeArgumentsAddr(closure); | 7788 virtual bool CheckAndCanonicalizeFields(const char** error_str) const { |
7694 } | 7789 // None of the fields of a closure are instances. |
7695 static void SetTypeArguments(const Instance& closure, | 7790 return true; |
7696 const TypeArguments& value) { | |
7697 ASSERT(value.IsNull() || value.IsCanonical()); | |
7698 closure.StorePointer(TypeArgumentsAddr(closure), value.raw()); | |
7699 } | |
7700 static intptr_t type_arguments_offset() { | |
7701 return static_cast<intptr_t>(kTypeArgumentsOffset * kWordSize); | |
7702 } | 7791 } |
7703 | 7792 |
7704 static const char* ToCString(const Instance& closure); | 7793 static RawClosure* New(const Function& function, |
7705 | 7794 const Context& context, |
7706 static intptr_t InstanceSize() { | 7795 Heap::Space space = Heap::kNew); |
7707 intptr_t size = sizeof(RawInstance) + (kNumFields * kWordSize); | |
7708 ASSERT(size == Object::RoundedAllocationSize(size)); | |
7709 return size; | |
7710 } | |
7711 | |
7712 static RawInstance* New(const Function& function, | |
7713 const Context& context, | |
7714 Heap::Space space = Heap::kNew); | |
7715 | 7796 |
7716 private: | 7797 private: |
7717 static const int kTypeArgumentsOffset = 1; | 7798 static RawClosure* New(); |
7718 static const int kFunctionOffset = 2; | |
7719 static const int kContextOffset = 3; | |
7720 static const int kNumFields = 3; | |
7721 | 7799 |
7722 static RawTypeArguments** TypeArgumentsAddr(const Instance& obj) { | 7800 FINAL_HEAP_OBJECT_IMPLEMENTATION(Closure, Instance); |
7723 ASSERT(obj.IsClosure()); | |
7724 return reinterpret_cast<RawTypeArguments**>( | |
7725 reinterpret_cast<intptr_t>(obj.raw_ptr()) + type_arguments_offset()); | |
7726 } | |
7727 static RawFunction** FunctionAddr(const Instance& obj) { | |
7728 ASSERT(obj.IsClosure()); | |
7729 return reinterpret_cast<RawFunction**>( | |
7730 reinterpret_cast<intptr_t>(obj.raw_ptr()) + function_offset()); | |
7731 } | |
7732 static RawContext** ContextAddr(const Instance& obj) { | |
7733 ASSERT(obj.IsClosure()); | |
7734 return reinterpret_cast<RawContext**>( | |
7735 reinterpret_cast<intptr_t>(obj.raw_ptr()) + context_offset()); | |
7736 } | |
7737 static void set_function(const Instance& closure, | |
7738 const Function& value) { | |
7739 closure.StorePointer(FunctionAddr(closure), value.raw()); | |
7740 } | |
7741 static void set_context(const Instance& closure, | |
7742 const Context& value) { | |
7743 closure.StorePointer(ContextAddr(closure), value.raw()); | |
7744 } | |
7745 static intptr_t NextFieldOffset() { | |
7746 // Indicates this class cannot be extended by dart code. | |
7747 return -kWordSize; | |
7748 } | |
7749 static RawFunction* GetFunction(RawObject* obj) { | |
7750 return *(reinterpret_cast<RawFunction**>( | |
7751 reinterpret_cast<intptr_t>(obj->ptr()) + function_offset())); | |
7752 } | |
7753 | |
7754 friend class Class; | 7801 friend class Class; |
7755 friend class SnapshotWriter; | |
7756 }; | 7802 }; |
7757 | 7803 |
7758 | 7804 |
7759 class Capability : public Instance { | 7805 class Capability : public Instance { |
7760 public: | 7806 public: |
7761 uint64_t Id() const { return raw_ptr()->id_; } | 7807 uint64_t Id() const { return raw_ptr()->id_; } |
7762 | 7808 |
7763 static intptr_t InstanceSize() { | 7809 static intptr_t InstanceSize() { |
7764 return RoundedAllocationSize(sizeof(RawCapability)); | 7810 return RoundedAllocationSize(sizeof(RawCapability)); |
7765 } | 7811 } |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8249 | 8295 |
8250 | 8296 |
8251 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 8297 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
8252 intptr_t index) { | 8298 intptr_t index) { |
8253 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 8299 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
8254 } | 8300 } |
8255 | 8301 |
8256 } // namespace dart | 8302 } // namespace dart |
8257 | 8303 |
8258 #endif // VM_OBJECT_H_ | 8304 #endif // VM_OBJECT_H_ |
OLD | NEW |