| 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 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 return *null_array_; | 351 return *null_array_; |
| 352 } | 352 } |
| 353 static const String& null_string() { | 353 static const String& null_string() { |
| 354 ASSERT(null_string_ != NULL); | 354 ASSERT(null_string_ != NULL); |
| 355 return *null_string_; | 355 return *null_string_; |
| 356 } | 356 } |
| 357 static const Instance& null_instance() { | 357 static const Instance& null_instance() { |
| 358 ASSERT(null_instance_ != NULL); | 358 ASSERT(null_instance_ != NULL); |
| 359 return *null_instance_; | 359 return *null_instance_; |
| 360 } | 360 } |
| 361 static const AbstractTypeArguments& null_abstract_type_arguments() { | 361 static const TypeArguments& null_type_arguments() { |
| 362 ASSERT(null_abstract_type_arguments_ != NULL); | 362 ASSERT(null_type_arguments_ != NULL); |
| 363 return *null_abstract_type_arguments_; | 363 return *null_type_arguments_; |
| 364 } | 364 } |
| 365 | 365 |
| 366 static const Array& empty_array() { | 366 static const Array& empty_array() { |
| 367 ASSERT(empty_array_ != NULL); | 367 ASSERT(empty_array_ != NULL); |
| 368 return *empty_array_; | 368 return *empty_array_; |
| 369 } | 369 } |
| 370 | 370 |
| 371 static const PcDescriptors& empty_descriptors() { | 371 static const PcDescriptors& empty_descriptors() { |
| 372 ASSERT(empty_descriptors_ != NULL); | 372 ASSERT(empty_descriptors_ != NULL); |
| 373 return *empty_descriptors_; | 373 return *empty_descriptors_; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 return *branch_offset_error_; | 420 return *branch_offset_error_; |
| 421 } | 421 } |
| 422 | 422 |
| 423 static RawClass* class_class() { return class_class_; } | 423 static RawClass* class_class() { return class_class_; } |
| 424 static RawClass* dynamic_class() { return dynamic_class_; } | 424 static RawClass* dynamic_class() { return dynamic_class_; } |
| 425 static RawClass* void_class() { return void_class_; } | 425 static RawClass* void_class() { return void_class_; } |
| 426 static RawType* dynamic_type() { return dynamic_type_; } | 426 static RawType* dynamic_type() { return dynamic_type_; } |
| 427 static RawType* void_type() { return void_type_; } | 427 static RawType* void_type() { return void_type_; } |
| 428 static RawClass* unresolved_class_class() { return unresolved_class_class_; } | 428 static RawClass* unresolved_class_class() { return unresolved_class_class_; } |
| 429 static RawClass* type_arguments_class() { return type_arguments_class_; } | 429 static RawClass* type_arguments_class() { return type_arguments_class_; } |
| 430 static RawClass* instantiated_type_arguments_class() { | |
| 431 return instantiated_type_arguments_class_; | |
| 432 } | |
| 433 static RawClass* patch_class_class() { return patch_class_class_; } | 430 static RawClass* patch_class_class() { return patch_class_class_; } |
| 434 static RawClass* function_class() { return function_class_; } | 431 static RawClass* function_class() { return function_class_; } |
| 435 static RawClass* closure_data_class() { return closure_data_class_; } | 432 static RawClass* closure_data_class() { return closure_data_class_; } |
| 436 static RawClass* redirection_data_class() { return redirection_data_class_; } | 433 static RawClass* redirection_data_class() { return redirection_data_class_; } |
| 437 static RawClass* field_class() { return field_class_; } | 434 static RawClass* field_class() { return field_class_; } |
| 438 static RawClass* literal_token_class() { return literal_token_class_; } | 435 static RawClass* literal_token_class() { return literal_token_class_; } |
| 439 static RawClass* token_stream_class() { return token_stream_class_; } | 436 static RawClass* token_stream_class() { return token_stream_class_; } |
| 440 static RawClass* script_class() { return script_class_; } | 437 static RawClass* script_class() { return script_class_; } |
| 441 static RawClass* library_class() { return library_class_; } | 438 static RawClass* library_class() { return library_class_; } |
| 442 static RawClass* library_prefix_class() { return library_prefix_class_; } | 439 static RawClass* library_prefix_class() { return library_prefix_class_; } |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 // The static values below are singletons shared between the different | 570 // The static values below are singletons shared between the different |
| 574 // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_. | 571 // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_. |
| 575 static RawObject* null_; | 572 static RawObject* null_; |
| 576 | 573 |
| 577 static RawClass* class_class_; // Class of the Class vm object. | 574 static RawClass* class_class_; // Class of the Class vm object. |
| 578 static RawClass* dynamic_class_; // Class of the 'dynamic' type. | 575 static RawClass* dynamic_class_; // Class of the 'dynamic' type. |
| 579 static RawClass* void_class_; // Class of the 'void' type. | 576 static RawClass* void_class_; // Class of the 'void' type. |
| 580 static RawType* dynamic_type_; // Class of the 'dynamic' type. | 577 static RawType* dynamic_type_; // Class of the 'dynamic' type. |
| 581 static RawType* void_type_; // Class of the 'void' type. | 578 static RawType* void_type_; // Class of the 'void' type. |
| 582 static RawClass* unresolved_class_class_; // Class of UnresolvedClass. | 579 static RawClass* unresolved_class_class_; // Class of UnresolvedClass. |
| 583 // Class of the TypeArguments vm object. | 580 static RawClass* type_arguments_class_; // Class of TypeArguments vm object. |
| 584 static RawClass* type_arguments_class_; | |
| 585 static RawClass* instantiated_type_arguments_class_; // Class of Inst..ments. | |
| 586 static RawClass* patch_class_class_; // Class of the PatchClass vm object. | 581 static RawClass* patch_class_class_; // Class of the PatchClass vm object. |
| 587 static RawClass* function_class_; // Class of the Function vm object. | 582 static RawClass* function_class_; // Class of the Function vm object. |
| 588 static RawClass* closure_data_class_; // Class of ClosureData vm obj. | 583 static RawClass* closure_data_class_; // Class of ClosureData vm obj. |
| 589 static RawClass* redirection_data_class_; // Class of RedirectionData vm obj. | 584 static RawClass* redirection_data_class_; // Class of RedirectionData vm obj. |
| 590 static RawClass* field_class_; // Class of the Field vm object. | 585 static RawClass* field_class_; // Class of the Field vm object. |
| 591 static RawClass* literal_token_class_; // Class of LiteralToken vm object. | 586 static RawClass* literal_token_class_; // Class of LiteralToken vm object. |
| 592 static RawClass* token_stream_class_; // Class of the TokenStream vm object. | 587 static RawClass* token_stream_class_; // Class of the TokenStream vm object. |
| 593 static RawClass* script_class_; // Class of the Script vm object. | 588 static RawClass* script_class_; // Class of the Script vm object. |
| 594 static RawClass* library_class_; // Class of the Library vm object. | 589 static RawClass* library_class_; // Class of the Library vm object. |
| 595 static RawClass* library_prefix_class_; // Class of Library prefix vm object. | 590 static RawClass* library_prefix_class_; // Class of Library prefix vm object. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 610 static RawClass* language_error_class_; // Class of LanguageError. | 605 static RawClass* language_error_class_; // Class of LanguageError. |
| 611 static RawClass* unhandled_exception_class_; // Class of UnhandledException. | 606 static RawClass* unhandled_exception_class_; // Class of UnhandledException. |
| 612 static RawClass* unwind_error_class_; // Class of UnwindError. | 607 static RawClass* unwind_error_class_; // Class of UnwindError. |
| 613 | 608 |
| 614 // The static values below are read-only handle pointers for singleton | 609 // The static values below are read-only handle pointers for singleton |
| 615 // objects that are shared between the different isolates. | 610 // objects that are shared between the different isolates. |
| 616 static Object* null_object_; | 611 static Object* null_object_; |
| 617 static Array* null_array_; | 612 static Array* null_array_; |
| 618 static String* null_string_; | 613 static String* null_string_; |
| 619 static Instance* null_instance_; | 614 static Instance* null_instance_; |
| 620 static AbstractTypeArguments* null_abstract_type_arguments_; | 615 static TypeArguments* null_type_arguments_; |
| 621 static Array* empty_array_; | 616 static Array* empty_array_; |
| 622 static PcDescriptors* empty_descriptors_; | 617 static PcDescriptors* empty_descriptors_; |
| 623 static Instance* sentinel_; | 618 static Instance* sentinel_; |
| 624 static Instance* transition_sentinel_; | 619 static Instance* transition_sentinel_; |
| 625 static Instance* unknown_constant_; | 620 static Instance* unknown_constant_; |
| 626 static Instance* non_constant_; | 621 static Instance* non_constant_; |
| 627 static Bool* bool_true_; | 622 static Bool* bool_true_; |
| 628 static Bool* bool_false_; | 623 static Bool* bool_false_; |
| 629 static Smi* smi_illegal_cid_; | 624 static Smi* smi_illegal_cid_; |
| 630 static LanguageError* snapshot_writer_error_; | 625 static LanguageError* snapshot_writer_error_; |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 850 } | 845 } |
| 851 static bool IsSignatureClass(RawClass* cls) { | 846 static bool IsSignatureClass(RawClass* cls) { |
| 852 return cls->ptr()->signature_function_ != Object::null(); | 847 return cls->ptr()->signature_function_ != Object::null(); |
| 853 } | 848 } |
| 854 | 849 |
| 855 // Check if this class represents a canonical signature class, i.e. not an | 850 // Check if this class represents a canonical signature class, i.e. not an |
| 856 // alias as defined in a typedef. | 851 // alias as defined in a typedef. |
| 857 bool IsCanonicalSignatureClass() const; | 852 bool IsCanonicalSignatureClass() const; |
| 858 | 853 |
| 859 // Check the subtype relationship. | 854 // Check the subtype relationship. |
| 860 bool IsSubtypeOf(const AbstractTypeArguments& type_arguments, | 855 bool IsSubtypeOf(const TypeArguments& type_arguments, |
| 861 const Class& other, | 856 const Class& other, |
| 862 const AbstractTypeArguments& other_type_arguments, | 857 const TypeArguments& other_type_arguments, |
| 863 Error* bound_error) const { | 858 Error* bound_error) const { |
| 864 return TypeTest(kIsSubtypeOf, | 859 return TypeTest(kIsSubtypeOf, |
| 865 type_arguments, | 860 type_arguments, |
| 866 other, | 861 other, |
| 867 other_type_arguments, | 862 other_type_arguments, |
| 868 bound_error); | 863 bound_error); |
| 869 } | 864 } |
| 870 | 865 |
| 871 // Check the 'more specific' relationship. | 866 // Check the 'more specific' relationship. |
| 872 bool IsMoreSpecificThan(const AbstractTypeArguments& type_arguments, | 867 bool IsMoreSpecificThan(const TypeArguments& type_arguments, |
| 873 const Class& other, | 868 const Class& other, |
| 874 const AbstractTypeArguments& other_type_arguments, | 869 const TypeArguments& other_type_arguments, |
| 875 Error* bound_error) const { | 870 Error* bound_error) const { |
| 876 return TypeTest(kIsMoreSpecificThan, | 871 return TypeTest(kIsMoreSpecificThan, |
| 877 type_arguments, | 872 type_arguments, |
| 878 other, | 873 other, |
| 879 other_type_arguments, | 874 other_type_arguments, |
| 880 bound_error); | 875 bound_error); |
| 881 } | 876 } |
| 882 | 877 |
| 883 // Check if this is the top level class. | 878 // Check if this is the top level class. |
| 884 bool IsTopLevel() const; | 879 bool IsTopLevel() const; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 | 1159 |
| 1165 RawFunction* LookupAccessorFunction(const char* prefix, | 1160 RawFunction* LookupAccessorFunction(const char* prefix, |
| 1166 intptr_t prefix_length, | 1161 intptr_t prefix_length, |
| 1167 const String& name) const; | 1162 const String& name) const; |
| 1168 | 1163 |
| 1169 // Allocate an instance class which has a VM implementation. | 1164 // Allocate an instance class which has a VM implementation. |
| 1170 template <class FakeInstance> static RawClass* New(intptr_t id); | 1165 template <class FakeInstance> static RawClass* New(intptr_t id); |
| 1171 | 1166 |
| 1172 // Check the subtype or 'more specific' relationship. | 1167 // Check the subtype or 'more specific' relationship. |
| 1173 bool TypeTest(TypeTestKind test_kind, | 1168 bool TypeTest(TypeTestKind test_kind, |
| 1174 const AbstractTypeArguments& type_arguments, | 1169 const TypeArguments& type_arguments, |
| 1175 const Class& other, | 1170 const Class& other, |
| 1176 const AbstractTypeArguments& other_type_arguments, | 1171 const TypeArguments& other_type_arguments, |
| 1177 Error* bound_error) const; | 1172 Error* bound_error) const; |
| 1178 | 1173 |
| 1179 static bool TypeTestNonRecursive( | 1174 static bool TypeTestNonRecursive( |
| 1180 const Class& cls, | 1175 const Class& cls, |
| 1181 TypeTestKind test_kind, | 1176 TypeTestKind test_kind, |
| 1182 const AbstractTypeArguments& type_arguments, | 1177 const TypeArguments& type_arguments, |
| 1183 const Class& other, | 1178 const Class& other, |
| 1184 const AbstractTypeArguments& other_type_arguments, | 1179 const TypeArguments& other_type_arguments, |
| 1185 Error* bound_error); | 1180 Error* bound_error); |
| 1186 | 1181 |
| 1187 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); | 1182 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); |
| 1188 friend class AbstractType; | 1183 friend class AbstractType; |
| 1189 friend class Instance; | 1184 friend class Instance; |
| 1190 friend class Object; | 1185 friend class Object; |
| 1191 friend class Type; | 1186 friend class Type; |
| 1192 }; | 1187 }; |
| 1193 | 1188 |
| 1194 | 1189 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1217 void set_ident(const String& ident) const; | 1212 void set_ident(const String& ident) const; |
| 1218 void set_token_pos(intptr_t token_pos) const; | 1213 void set_token_pos(intptr_t token_pos) const; |
| 1219 | 1214 |
| 1220 static RawUnresolvedClass* New(); | 1215 static RawUnresolvedClass* New(); |
| 1221 | 1216 |
| 1222 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object); | 1217 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object); |
| 1223 friend class Class; | 1218 friend class Class; |
| 1224 }; | 1219 }; |
| 1225 | 1220 |
| 1226 | 1221 |
| 1227 // AbstractTypeArguments is an abstract superclass. | 1222 // A TypeArguments is an array of AbstractType. |
| 1228 // Subclasses of AbstractTypeArguments are TypeArguments and | 1223 class TypeArguments : public Object { |
| 1229 // InstantiatedTypeArguments. | |
| 1230 class AbstractTypeArguments : public Object { | |
| 1231 public: | 1224 public: |
| 1232 // Returns true if all types of this vector are finalized. | 1225 intptr_t Length() const; |
| 1233 virtual bool IsFinalized() const { return true; } | 1226 RawAbstractType* TypeAt(intptr_t index) const; |
| 1234 | 1227 static intptr_t type_at_offset(intptr_t index) { |
| 1235 // Return 'this' if this type argument vector is instantiated, i.e. if it does | 1228 return OFFSET_OF(RawTypeArguments, types_) + index * kWordSize; |
| 1236 // not refer to type parameters. Otherwise, return a new type argument vector | |
| 1237 // where each reference to a type parameter is replaced with the corresponding | |
| 1238 // type of the instantiator type argument vector. | |
| 1239 // If bound_error is not NULL, it may be set to reflect a bound error. | |
| 1240 virtual RawAbstractTypeArguments* InstantiateFrom( | |
| 1241 const AbstractTypeArguments& instantiator_type_arguments, | |
| 1242 Error* bound_error, | |
| 1243 GrowableObjectArray* trail = NULL) const; | |
| 1244 | |
| 1245 // Do not clone InstantiatedTypeArguments or null vectors, since they are | |
| 1246 // considered finalized. | |
| 1247 virtual RawAbstractTypeArguments* CloneUnfinalized() const { | |
| 1248 return this->raw(); | |
| 1249 } | 1229 } |
| 1250 | 1230 void SetTypeAt(intptr_t index, const AbstractType& value) const; |
| 1251 // Null vectors are canonical. | |
| 1252 virtual RawAbstractTypeArguments* Canonicalize( | |
| 1253 GrowableObjectArray* trail = NULL) const { | |
| 1254 return this->raw(); | |
| 1255 } | |
| 1256 | 1231 |
| 1257 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>". | 1232 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>". |
| 1258 virtual RawString* Name() const { | 1233 RawString* Name() const { |
| 1259 return SubvectorName(0, Length(), kInternalName); | 1234 return SubvectorName(0, Length(), kInternalName); |
| 1260 } | 1235 } |
| 1261 | 1236 |
| 1262 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>". | 1237 // The name of this type argument vector, e.g. "<T, dynamic, List<T>, int>". |
| 1263 // Names of internal classes are mapped to their public interfaces. | 1238 // Names of internal classes are mapped to their public interfaces. |
| 1264 virtual RawString* UserVisibleName() const { | 1239 RawString* UserVisibleName() const { |
| 1265 return SubvectorName(0, Length(), kUserVisibleName); | 1240 return SubvectorName(0, Length(), kUserVisibleName); |
| 1266 } | 1241 } |
| 1267 | 1242 |
| 1268 // Check if the subvector of length 'len' starting at 'from_index' of this | 1243 // Check if the subvector of length 'len' starting at 'from_index' of this |
| 1269 // type argument vector consists solely of DynamicType. | 1244 // type argument vector consists solely of DynamicType. |
| 1270 bool IsRaw(intptr_t from_index, intptr_t len) const { | 1245 bool IsRaw(intptr_t from_index, intptr_t len) const { |
| 1271 return IsDynamicTypes(false, from_index, len); | 1246 return IsDynamicTypes(false, from_index, len); |
| 1272 } | 1247 } |
| 1273 | 1248 |
| 1274 // Check if this type argument vector would consist solely of DynamicType if | 1249 // Check if this type argument vector would consist solely of DynamicType if |
| 1275 // it was instantiated from a raw (null) instantiator, i.e. consider each type | 1250 // it was instantiated from a raw (null) instantiator, i.e. consider each type |
| 1276 // parameter as it would be first instantiated from a vector of dynamic types. | 1251 // parameter as it would be first instantiated from a vector of dynamic types. |
| 1277 // Consider only a prefix of length 'len'. | 1252 // Consider only a prefix of length 'len'. |
| 1278 bool IsRawInstantiatedRaw(intptr_t len) const { | 1253 bool IsRawInstantiatedRaw(intptr_t len) const { |
| 1279 return IsDynamicTypes(true, 0, len); | 1254 return IsDynamicTypes(true, 0, len); |
| 1280 } | 1255 } |
| 1281 | 1256 |
| 1282 // Check the subtype relationship, considering only a subvector of length | 1257 // Check the subtype relationship, considering only a subvector of length |
| 1283 // 'len' starting at 'from_index'. | 1258 // 'len' starting at 'from_index'. |
| 1284 bool IsSubtypeOf(const AbstractTypeArguments& other, | 1259 bool IsSubtypeOf(const TypeArguments& other, |
| 1285 intptr_t from_index, | 1260 intptr_t from_index, |
| 1286 intptr_t len, | 1261 intptr_t len, |
| 1287 Error* bound_error) const { | 1262 Error* bound_error) const { |
| 1288 return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error); | 1263 return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error); |
| 1289 } | 1264 } |
| 1290 | 1265 |
| 1291 // Check the 'more specific' relationship, considering only a subvector of | 1266 // Check the 'more specific' relationship, considering only a subvector of |
| 1292 // length 'len' starting at 'from_index'. | 1267 // length 'len' starting at 'from_index'. |
| 1293 bool IsMoreSpecificThan(const AbstractTypeArguments& other, | 1268 bool IsMoreSpecificThan(const TypeArguments& other, |
| 1294 intptr_t from_index, | 1269 intptr_t from_index, |
| 1295 intptr_t len, | 1270 intptr_t len, |
| 1296 Error* bound_error) const { | 1271 Error* bound_error) const { |
| 1297 return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error); | 1272 return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error); |
| 1298 } | 1273 } |
| 1299 | 1274 |
| 1300 // Check if the vectors are equal. | 1275 // Check if the vectors are equal. |
| 1301 bool Equals(const AbstractTypeArguments& other) const { | 1276 bool Equals(const TypeArguments& other) const { |
| 1302 return IsEquivalent(other); | 1277 return IsEquivalent(other); |
| 1303 } | 1278 } |
| 1304 | 1279 |
| 1305 bool IsEquivalent(const AbstractTypeArguments& other, | 1280 bool IsEquivalent(const TypeArguments& other, |
| 1306 GrowableObjectArray* trail = NULL) const; | 1281 GrowableObjectArray* trail = NULL) const; |
| 1307 | 1282 |
| 1308 // UNREACHABLEs as AbstractTypeArguments is an abstract class. | 1283 bool IsResolved() const; |
| 1309 virtual intptr_t Length() const; | 1284 bool IsInstantiated(GrowableObjectArray* trail = NULL) const; |
| 1310 virtual RawAbstractType* TypeAt(intptr_t index) const; | 1285 bool IsUninstantiatedIdentity() const; |
| 1311 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const; | 1286 bool CanShareInstantiatorTypeArguments(const Class& instantiator_class) const; |
| 1312 virtual bool IsResolved() const; | |
| 1313 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; | |
| 1314 virtual bool IsUninstantiatedIdentity() const; | |
| 1315 virtual bool CanShareInstantiatorTypeArguments( | |
| 1316 const Class& instantiator_class) const; | |
| 1317 virtual bool IsBounded() const; | |
| 1318 | 1287 |
| 1319 virtual intptr_t Hash() const; | 1288 // Returns true if all types of this vector are finalized. |
| 1289 bool IsFinalized() const; |
| 1290 bool IsBounded() const; |
| 1320 | 1291 |
| 1321 private: | 1292 // Clone this type argument vector and clone all unfinalized type arguments. |
| 1322 // Check if the subvector of length 'len' starting at 'from_index' of this | 1293 // Finalized type arguments are shared. |
| 1323 // type argument vector consists solely of DynamicType. | 1294 RawTypeArguments* CloneUnfinalized() const; |
| 1324 // If raw_instantiated is true, consider each type parameter to be first | |
| 1325 // instantiated from a vector of dynamic types. | |
| 1326 bool IsDynamicTypes(bool raw_instantiated, | |
| 1327 intptr_t from_index, | |
| 1328 intptr_t len) const; | |
| 1329 | 1295 |
| 1330 // Check the subtype or 'more specific' relationship, considering only a | 1296 // Canonicalize only if instantiated, otherwise returns 'this'. |
| 1331 // subvector of length 'len' starting at 'from_index'. | 1297 RawTypeArguments* Canonicalize(GrowableObjectArray* trail = NULL) const; |
| 1332 bool TypeTest(TypeTestKind test_kind, | |
| 1333 const AbstractTypeArguments& other, | |
| 1334 intptr_t from_index, | |
| 1335 intptr_t len, | |
| 1336 Error* bound_error) const; | |
| 1337 | 1298 |
| 1338 // Return the internal or public name of a subvector of this type argument | 1299 // Return 'this' if this type argument vector is instantiated, i.e. if it does |
| 1339 // vector, e.g. "<T, dynamic, List<T>, int>". | 1300 // not refer to type parameters. Otherwise, return a new type argument vector |
| 1340 RawString* SubvectorName(intptr_t from_index, | 1301 // where each reference to a type parameter is replaced with the corresponding |
| 1341 intptr_t len, | 1302 // type of the instantiator type argument vector. |
| 1342 NameVisibility name_visibility) const; | 1303 // If bound_error is not NULL, it may be set to reflect a bound error. |
| 1343 | 1304 RawTypeArguments* InstantiateFrom( |
| 1344 protected: | 1305 const TypeArguments& instantiator_type_arguments, |
| 1345 HEAP_OBJECT_IMPLEMENTATION(AbstractTypeArguments, Object); | 1306 Error* bound_error, |
| 1346 friend class AbstractType; | |
| 1347 friend class Class; | |
| 1348 }; | |
| 1349 | |
| 1350 | |
| 1351 // A TypeArguments is an array of AbstractType. | |
| 1352 class TypeArguments : public AbstractTypeArguments { | |
| 1353 public: | |
| 1354 virtual intptr_t Length() const; | |
| 1355 virtual RawAbstractType* TypeAt(intptr_t index) const; | |
| 1356 static intptr_t type_at_offset(intptr_t index) { | |
| 1357 return OFFSET_OF(RawTypeArguments, types_) + index * kWordSize; | |
| 1358 } | |
| 1359 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const; | |
| 1360 virtual bool IsResolved() const; | |
| 1361 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; | |
| 1362 virtual bool IsUninstantiatedIdentity() const; | |
| 1363 virtual bool CanShareInstantiatorTypeArguments( | |
| 1364 const Class& instantiator_class) const; | |
| 1365 virtual bool IsFinalized() const; | |
| 1366 virtual bool IsBounded() const; | |
| 1367 virtual RawAbstractTypeArguments* CloneUnfinalized() const; | |
| 1368 // Canonicalize only if instantiated, otherwise returns 'this'. | |
| 1369 virtual RawAbstractTypeArguments* Canonicalize( | |
| 1370 GrowableObjectArray* trail = NULL) const; | 1307 GrowableObjectArray* trail = NULL) const; |
| 1371 | 1308 |
| 1372 virtual RawAbstractTypeArguments* InstantiateFrom( | 1309 // Runtime instantiation with canonicalization. Not to be used during type |
| 1373 const AbstractTypeArguments& instantiator_type_arguments, | 1310 // finalization at compile time. |
| 1374 Error* bound_error, | 1311 RawTypeArguments* InstantiateAndCanonicalizeFrom( |
| 1375 GrowableObjectArray* trail = NULL) const; | 1312 const TypeArguments& instantiator_type_arguments, |
| 1313 Error* bound_error) const; |
| 1314 |
| 1315 static intptr_t instantiations_offset() { |
| 1316 return OFFSET_OF(RawTypeArguments, instantiations_); |
| 1317 } |
| 1376 | 1318 |
| 1377 static const intptr_t kBytesPerElement = kWordSize; | 1319 static const intptr_t kBytesPerElement = kWordSize; |
| 1378 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | 1320 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; |
| 1379 | 1321 |
| 1380 static intptr_t length_offset() { | 1322 static intptr_t length_offset() { |
| 1381 return OFFSET_OF(RawTypeArguments, length_); | 1323 return OFFSET_OF(RawTypeArguments, length_); |
| 1382 } | 1324 } |
| 1383 | 1325 |
| 1384 static intptr_t InstanceSize() { | 1326 static intptr_t InstanceSize() { |
| 1385 ASSERT(sizeof(RawTypeArguments) == OFFSET_OF(RawTypeArguments, types_)); | 1327 ASSERT(sizeof(RawTypeArguments) == OFFSET_OF(RawTypeArguments, types_)); |
| 1386 return 0; | 1328 return 0; |
| 1387 } | 1329 } |
| 1388 | 1330 |
| 1389 static intptr_t InstanceSize(intptr_t len) { | 1331 static intptr_t InstanceSize(intptr_t len) { |
| 1390 // Ensure that the types_ is not adding to the object length. | 1332 // Ensure that the types_ is not adding to the object size, which includes |
| 1391 ASSERT(sizeof(RawTypeArguments) == (sizeof(RawObject) + (1 * kWordSize))); | 1333 // 2 fields: instantiations_ and length_. |
| 1334 ASSERT(sizeof(RawTypeArguments) == (sizeof(RawObject) + (2 * kWordSize))); |
| 1392 ASSERT(0 <= len && len <= kMaxElements); | 1335 ASSERT(0 <= len && len <= kMaxElements); |
| 1393 return RoundedAllocationSize( | 1336 return RoundedAllocationSize( |
| 1394 sizeof(RawTypeArguments) + (len * kBytesPerElement)); | 1337 sizeof(RawTypeArguments) + (len * kBytesPerElement)); |
| 1395 } | 1338 } |
| 1396 | 1339 |
| 1340 intptr_t Hash() const; |
| 1341 |
| 1397 static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld); | 1342 static RawTypeArguments* New(intptr_t len, Heap::Space space = Heap::kOld); |
| 1398 | 1343 |
| 1399 private: | 1344 private: |
| 1345 // Check if the subvector of length 'len' starting at 'from_index' of this |
| 1346 // type argument vector consists solely of DynamicType. |
| 1347 // If raw_instantiated is true, consider each type parameter to be first |
| 1348 // instantiated from a vector of dynamic types. |
| 1349 bool IsDynamicTypes(bool raw_instantiated, |
| 1350 intptr_t from_index, |
| 1351 intptr_t len) const; |
| 1352 |
| 1353 // Check the subtype or 'more specific' relationship, considering only a |
| 1354 // subvector of length 'len' starting at 'from_index'. |
| 1355 bool TypeTest(TypeTestKind test_kind, |
| 1356 const TypeArguments& other, |
| 1357 intptr_t from_index, |
| 1358 intptr_t len, |
| 1359 Error* bound_error) const; |
| 1360 |
| 1361 // Return the internal or public name of a subvector of this type argument |
| 1362 // vector, e.g. "<T, dynamic, List<T>, int>". |
| 1363 RawString* SubvectorName(intptr_t from_index, |
| 1364 intptr_t len, |
| 1365 NameVisibility name_visibility) const; |
| 1366 |
| 1367 RawArray* instantiations() const; |
| 1368 void set_instantiations(const Array& value) const; |
| 1400 RawAbstractType** TypeAddr(intptr_t index) const; | 1369 RawAbstractType** TypeAddr(intptr_t index) const; |
| 1401 void SetLength(intptr_t value) const; | 1370 void SetLength(intptr_t value) const; |
| 1402 | 1371 |
| 1403 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, AbstractTypeArguments); | 1372 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); |
| 1373 friend class AbstractType; |
| 1404 friend class Class; | 1374 friend class Class; |
| 1405 }; | 1375 }; |
| 1406 | 1376 |
| 1407 | |
| 1408 // An instance of InstantiatedTypeArguments is never encountered at compile | |
| 1409 // time, but only at run time, when type parameters can be matched to actual | |
| 1410 // types. | |
| 1411 // An instance of InstantiatedTypeArguments consists of a pair of | |
| 1412 // AbstractTypeArguments objects. The first type argument vector is | |
| 1413 // uninstantiated, because it contains type expressions referring to at least | |
| 1414 // one TypeParameter object, i.e. to a type that is not known at compile time. | |
| 1415 // The second type argument vector is the instantiator, because each type | |
| 1416 // parameter with index i in the first vector can be substituted (or | |
| 1417 // "instantiated") with the type at index i in the second type argument vector. | |
| 1418 class InstantiatedTypeArguments : public AbstractTypeArguments { | |
| 1419 public: | |
| 1420 virtual intptr_t Length() const; | |
| 1421 virtual RawAbstractType* TypeAt(intptr_t index) const; | |
| 1422 virtual void SetTypeAt(intptr_t index, const AbstractType& value) const; | |
| 1423 virtual bool IsResolved() const { return true; } | |
| 1424 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const { | |
| 1425 return true; | |
| 1426 } | |
| 1427 virtual bool IsUninstantiatedIdentity() const { | |
| 1428 UNREACHABLE(); | |
| 1429 return false; | |
| 1430 } | |
| 1431 virtual bool CanShareInstantiatorTypeArguments( | |
| 1432 const Class& instantiator_class) const { | |
| 1433 UNREACHABLE(); | |
| 1434 return false; | |
| 1435 } | |
| 1436 virtual bool IsBounded() const { return false; } // Bounds were checked. | |
| 1437 virtual RawAbstractTypeArguments* Canonicalize( | |
| 1438 GrowableObjectArray* trail = NULL) const; | |
| 1439 | |
| 1440 RawAbstractTypeArguments* uninstantiated_type_arguments() const { | |
| 1441 return raw_ptr()->uninstantiated_type_arguments_; | |
| 1442 } | |
| 1443 static intptr_t uninstantiated_type_arguments_offset() { | |
| 1444 return OFFSET_OF(RawInstantiatedTypeArguments, | |
| 1445 uninstantiated_type_arguments_); | |
| 1446 } | |
| 1447 | |
| 1448 RawAbstractTypeArguments* instantiator_type_arguments() const { | |
| 1449 return raw_ptr()->instantiator_type_arguments_; | |
| 1450 } | |
| 1451 static intptr_t instantiator_type_arguments_offset() { | |
| 1452 return OFFSET_OF(RawInstantiatedTypeArguments, | |
| 1453 instantiator_type_arguments_); | |
| 1454 } | |
| 1455 | |
| 1456 static intptr_t InstanceSize() { | |
| 1457 return RoundedAllocationSize(sizeof(RawInstantiatedTypeArguments)); | |
| 1458 } | |
| 1459 | |
| 1460 static RawInstantiatedTypeArguments* New( | |
| 1461 const AbstractTypeArguments& uninstantiated_type_arguments, | |
| 1462 const AbstractTypeArguments& instantiator_type_arguments); | |
| 1463 | |
| 1464 private: | |
| 1465 void set_uninstantiated_type_arguments( | |
| 1466 const AbstractTypeArguments& value) const; | |
| 1467 void set_instantiator_type_arguments( | |
| 1468 const AbstractTypeArguments& value) const; | |
| 1469 | |
| 1470 static RawInstantiatedTypeArguments* New(); | |
| 1471 | |
| 1472 FINAL_HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments, | |
| 1473 AbstractTypeArguments); | |
| 1474 friend class Class; | |
| 1475 }; | |
| 1476 | |
| 1477 | 1377 |
| 1478 class PatchClass : public Object { | 1378 class PatchClass : public Object { |
| 1479 public: | 1379 public: |
| 1480 RawClass* patched_class() const { return raw_ptr()->patched_class_; } | 1380 RawClass* patched_class() const { return raw_ptr()->patched_class_; } |
| 1481 RawClass* source_class() const { return raw_ptr()->source_class_; } | 1381 RawClass* source_class() const { return raw_ptr()->source_class_; } |
| 1482 RawScript* Script() const; | 1382 RawScript* Script() const; |
| 1483 | 1383 |
| 1484 static intptr_t InstanceSize() { | 1384 static intptr_t InstanceSize() { |
| 1485 return RoundedAllocationSize(sizeof(RawPatchClass)); | 1385 return RoundedAllocationSize(sizeof(RawPatchClass)); |
| 1486 } | 1386 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1524 RawString* UserVisibleSignature() const { | 1424 RawString* UserVisibleSignature() const { |
| 1525 const bool instantiate = false; | 1425 const bool instantiate = false; |
| 1526 return BuildSignature( | 1426 return BuildSignature( |
| 1527 instantiate, kUserVisibleName, TypeArguments::Handle()); | 1427 instantiate, kUserVisibleName, TypeArguments::Handle()); |
| 1528 } | 1428 } |
| 1529 | 1429 |
| 1530 // Build a string of the form '(A, {b: B, c: C}) => D' representing the | 1430 // Build a string of the form '(A, {b: B, c: C}) => D' representing the |
| 1531 // signature of the given function, where all generic types (e.g. '<T, R>' in | 1431 // signature of the given function, where all generic types (e.g. '<T, R>' in |
| 1532 // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given | 1432 // 'C<T, R>(T, {b: B, c: C}) => R') are instantiated using the given |
| 1533 // instantiator type argument vector of a C instance (e.g. '<A, D>'). | 1433 // instantiator type argument vector of a C instance (e.g. '<A, D>'). |
| 1534 RawString* InstantiatedSignatureFrom( | 1434 RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator, |
| 1535 const AbstractTypeArguments& instantiator, | 1435 NameVisibility name_visibility) const { |
| 1536 NameVisibility name_visibility) const { | |
| 1537 const bool instantiate = true; | 1436 const bool instantiate = true; |
| 1538 return BuildSignature(instantiate, name_visibility, instantiator); | 1437 return BuildSignature(instantiate, name_visibility, instantiator); |
| 1539 } | 1438 } |
| 1540 | 1439 |
| 1541 // Returns true if the signature of this function is instantiated, i.e. if it | 1440 // Returns true if the signature of this function is instantiated, i.e. if it |
| 1542 // does not involve generic parameter types or generic result type. | 1441 // does not involve generic parameter types or generic result type. |
| 1543 bool HasInstantiatedSignature() const; | 1442 bool HasInstantiatedSignature() const; |
| 1544 | 1443 |
| 1545 // Build a string of the form 'T, {b: B, c: C} representing the user | 1444 // Build a string of the form 'T, {b: B, c: C} representing the user |
| 1546 // visible formal parameters of the function. | 1445 // visible formal parameters of the function. |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1845 const char* ToFullyQualifiedCString() const; | 1744 const char* ToFullyQualifiedCString() const; |
| 1846 | 1745 |
| 1847 // Returns true if this function has parameters that are compatible with the | 1746 // Returns true if this function has parameters that are compatible with the |
| 1848 // parameters of the other function in order for this function to override the | 1747 // parameters of the other function in order for this function to override the |
| 1849 // other function. | 1748 // other function. |
| 1850 bool HasCompatibleParametersWith(const Function& other, | 1749 bool HasCompatibleParametersWith(const Function& other, |
| 1851 Error* bound_error) const; | 1750 Error* bound_error) const; |
| 1852 | 1751 |
| 1853 // Returns true if the type of this function is a subtype of the type of | 1752 // Returns true if the type of this function is a subtype of the type of |
| 1854 // the other function. | 1753 // the other function. |
| 1855 bool IsSubtypeOf(const AbstractTypeArguments& type_arguments, | 1754 bool IsSubtypeOf(const TypeArguments& type_arguments, |
| 1856 const Function& other, | 1755 const Function& other, |
| 1857 const AbstractTypeArguments& other_type_arguments, | 1756 const TypeArguments& other_type_arguments, |
| 1858 Error* bound_error) const { | 1757 Error* bound_error) const { |
| 1859 return TypeTest(kIsSubtypeOf, | 1758 return TypeTest(kIsSubtypeOf, |
| 1860 type_arguments, | 1759 type_arguments, |
| 1861 other, | 1760 other, |
| 1862 other_type_arguments, | 1761 other_type_arguments, |
| 1863 bound_error); | 1762 bound_error); |
| 1864 } | 1763 } |
| 1865 | 1764 |
| 1866 // Returns true if the type of this function is more specific than the type of | 1765 // Returns true if the type of this function is more specific than the type of |
| 1867 // the other function. | 1766 // the other function. |
| 1868 bool IsMoreSpecificThan(const AbstractTypeArguments& type_arguments, | 1767 bool IsMoreSpecificThan(const TypeArguments& type_arguments, |
| 1869 const Function& other, | 1768 const Function& other, |
| 1870 const AbstractTypeArguments& other_type_arguments, | 1769 const TypeArguments& other_type_arguments, |
| 1871 Error* bound_error) const { | 1770 Error* bound_error) const { |
| 1872 return TypeTest(kIsMoreSpecificThan, | 1771 return TypeTest(kIsMoreSpecificThan, |
| 1873 type_arguments, | 1772 type_arguments, |
| 1874 other, | 1773 other, |
| 1875 other_type_arguments, | 1774 other_type_arguments, |
| 1876 bound_error); | 1775 bound_error); |
| 1877 } | 1776 } |
| 1878 | 1777 |
| 1879 // Returns true if this function represents an explicit getter function. | 1778 // Returns true if this function represents an explicit getter function. |
| 1880 bool IsGetterFunction() const { | 1779 bool IsGetterFunction() const { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2024 void set_data(const Object& value) const; | 1923 void set_data(const Object& value) const; |
| 2025 bool is_optimizable() const { | 1924 bool is_optimizable() const { |
| 2026 return OptimizableBit::decode(raw_ptr()->kind_tag_); | 1925 return OptimizableBit::decode(raw_ptr()->kind_tag_); |
| 2027 } | 1926 } |
| 2028 void set_is_optimizable(bool value) const; | 1927 void set_is_optimizable(bool value) const; |
| 2029 | 1928 |
| 2030 static RawFunction* New(); | 1929 static RawFunction* New(); |
| 2031 | 1930 |
| 2032 void BuildSignatureParameters(bool instantiate, | 1931 void BuildSignatureParameters(bool instantiate, |
| 2033 NameVisibility name_visibility, | 1932 NameVisibility name_visibility, |
| 2034 const AbstractTypeArguments& instantiator, | 1933 const TypeArguments& instantiator, |
| 2035 const GrowableObjectArray& pieces) const; | 1934 const GrowableObjectArray& pieces) const; |
| 2036 RawString* BuildSignature(bool instantiate, | 1935 RawString* BuildSignature(bool instantiate, |
| 2037 NameVisibility name_visibility, | 1936 NameVisibility name_visibility, |
| 2038 const AbstractTypeArguments& instantiator) const; | 1937 const TypeArguments& instantiator) const; |
| 2039 | 1938 |
| 2040 // Check the subtype or 'more specific' relationship. | 1939 // Check the subtype or 'more specific' relationship. |
| 2041 bool TypeTest(TypeTestKind test_kind, | 1940 bool TypeTest(TypeTestKind test_kind, |
| 2042 const AbstractTypeArguments& type_arguments, | 1941 const TypeArguments& type_arguments, |
| 2043 const Function& other, | 1942 const Function& other, |
| 2044 const AbstractTypeArguments& other_type_arguments, | 1943 const TypeArguments& other_type_arguments, |
| 2045 Error* bound_error) const; | 1944 Error* bound_error) const; |
| 2046 | 1945 |
| 2047 // Checks the type of the formal parameter at the given position for | 1946 // Checks the type of the formal parameter at the given position for |
| 2048 // subtyping or 'more specific' relationship between the type of this function | 1947 // subtyping or 'more specific' relationship between the type of this function |
| 2049 // and the type of the other function. | 1948 // and the type of the other function. |
| 2050 bool TestParameterType(TypeTestKind test_kind, | 1949 bool TestParameterType(TypeTestKind test_kind, |
| 2051 intptr_t parameter_position, | 1950 intptr_t parameter_position, |
| 2052 intptr_t other_parameter_position, | 1951 intptr_t other_parameter_position, |
| 2053 const AbstractTypeArguments& type_arguments, | 1952 const TypeArguments& type_arguments, |
| 2054 const Function& other, | 1953 const Function& other, |
| 2055 const AbstractTypeArguments& other_type_arguments, | 1954 const TypeArguments& other_type_arguments, |
| 2056 Error* bound_error) const; | 1955 Error* bound_error) const; |
| 2057 | 1956 |
| 2058 FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object); | 1957 FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object); |
| 2059 friend class Class; | 1958 friend class Class; |
| 2060 // RawFunction::VisitFunctionPointers accesses the private constructor of | 1959 // RawFunction::VisitFunctionPointers accesses the private constructor of |
| 2061 // Function. | 1960 // Function. |
| 2062 friend class RawFunction; | 1961 friend class RawFunction; |
| 2063 }; | 1962 }; |
| 2064 | 1963 |
| 2065 | 1964 |
| (...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3827 enum Entries { | 3726 enum Entries { |
| 3828 kInstanceClassId = 0, | 3727 kInstanceClassId = 0, |
| 3829 kInstanceTypeArguments = 1, | 3728 kInstanceTypeArguments = 1, |
| 3830 kInstantiatorTypeArguments = 2, | 3729 kInstantiatorTypeArguments = 2, |
| 3831 kTestResult = 3, | 3730 kTestResult = 3, |
| 3832 kTestEntryLength = 4, | 3731 kTestEntryLength = 4, |
| 3833 }; | 3732 }; |
| 3834 | 3733 |
| 3835 intptr_t NumberOfChecks() const; | 3734 intptr_t NumberOfChecks() const; |
| 3836 void AddCheck(intptr_t class_id, | 3735 void AddCheck(intptr_t class_id, |
| 3837 const AbstractTypeArguments& instance_type_arguments, | 3736 const TypeArguments& instance_type_arguments, |
| 3838 const AbstractTypeArguments& instantiator_type_arguments, | 3737 const TypeArguments& instantiator_type_arguments, |
| 3839 const Bool& test_result) const; | 3738 const Bool& test_result) const; |
| 3840 void GetCheck(intptr_t ix, | 3739 void GetCheck(intptr_t ix, |
| 3841 intptr_t* class_id, | 3740 intptr_t* class_id, |
| 3842 AbstractTypeArguments* instance_type_arguments, | 3741 TypeArguments* instance_type_arguments, |
| 3843 AbstractTypeArguments* instantiator_type_arguments, | 3742 TypeArguments* instantiator_type_arguments, |
| 3844 Bool* test_result) const; | 3743 Bool* test_result) const; |
| 3845 | 3744 |
| 3846 static RawSubtypeTestCache* New(); | 3745 static RawSubtypeTestCache* New(); |
| 3847 | 3746 |
| 3848 static intptr_t InstanceSize() { | 3747 static intptr_t InstanceSize() { |
| 3849 return RoundedAllocationSize(sizeof(RawSubtypeTestCache)); | 3748 return RoundedAllocationSize(sizeof(RawSubtypeTestCache)); |
| 3850 } | 3749 } |
| 3851 | 3750 |
| 3852 static intptr_t cache_offset() { | 3751 static intptr_t cache_offset() { |
| 3853 return OFFSET_OF(RawSubtypeTestCache, cache_); | 3752 return OFFSET_OF(RawSubtypeTestCache, cache_); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4036 return *FieldAddr(field); | 3935 return *FieldAddr(field); |
| 4037 } | 3936 } |
| 4038 | 3937 |
| 4039 void SetField(const Field& field, const Object& value) const { | 3938 void SetField(const Field& field, const Object& value) const { |
| 4040 field.UpdateGuardedCidAndLength(value); | 3939 field.UpdateGuardedCidAndLength(value); |
| 4041 StorePointer(FieldAddr(field), value.raw()); | 3940 StorePointer(FieldAddr(field), value.raw()); |
| 4042 } | 3941 } |
| 4043 | 3942 |
| 4044 RawType* GetType() const; | 3943 RawType* GetType() const; |
| 4045 | 3944 |
| 4046 virtual RawAbstractTypeArguments* GetTypeArguments() const; | 3945 virtual RawTypeArguments* GetTypeArguments() const; |
| 4047 virtual void SetTypeArguments(const AbstractTypeArguments& value) const; | 3946 virtual void SetTypeArguments(const TypeArguments& value) const; |
| 4048 | 3947 |
| 4049 // Check if the type of this instance is a subtype of the given type. | 3948 // Check if the type of this instance is a subtype of the given type. |
| 4050 bool IsInstanceOf(const AbstractType& type, | 3949 bool IsInstanceOf(const AbstractType& type, |
| 4051 const AbstractTypeArguments& type_instantiator, | 3950 const TypeArguments& type_instantiator, |
| 4052 Error* bound_error) const; | 3951 Error* bound_error) const; |
| 4053 | 3952 |
| 4054 // Check whether this instance is identical to the argument according to the | 3953 // Check whether this instance is identical to the argument according to the |
| 4055 // specification of dare:core's identical(). | 3954 // specification of dare:core's identical(). |
| 4056 bool IsIdenticalTo(const Instance& other) const; | 3955 bool IsIdenticalTo(const Instance& other) const; |
| 4057 | 3956 |
| 4058 bool IsValidNativeIndex(int index) const { | 3957 bool IsValidNativeIndex(int index) const { |
| 4059 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); | 3958 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); |
| 4060 } | 3959 } |
| 4061 | 3960 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4128 virtual bool IsBeingFinalized() const; | 4027 virtual bool IsBeingFinalized() const; |
| 4129 virtual bool IsMalformed() const; | 4028 virtual bool IsMalformed() const; |
| 4130 virtual bool IsMalbounded() const; | 4029 virtual bool IsMalbounded() const; |
| 4131 virtual bool IsMalformedOrMalbounded() const; | 4030 virtual bool IsMalformedOrMalbounded() const; |
| 4132 virtual RawLanguageError* error() const; | 4031 virtual RawLanguageError* error() const; |
| 4133 virtual void set_error(const LanguageError& value) const; | 4032 virtual void set_error(const LanguageError& value) const; |
| 4134 virtual bool IsResolved() const; | 4033 virtual bool IsResolved() const; |
| 4135 virtual bool HasResolvedTypeClass() const; | 4034 virtual bool HasResolvedTypeClass() const; |
| 4136 virtual RawClass* type_class() const; | 4035 virtual RawClass* type_class() const; |
| 4137 virtual RawUnresolvedClass* unresolved_class() const; | 4036 virtual RawUnresolvedClass* unresolved_class() const; |
| 4138 virtual RawAbstractTypeArguments* arguments() const; | 4037 virtual RawTypeArguments* arguments() const; |
| 4139 virtual intptr_t token_pos() const; | 4038 virtual intptr_t token_pos() const; |
| 4140 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; | 4039 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; |
| 4141 virtual bool Equals(const Instance& other) const { | 4040 virtual bool Equals(const Instance& other) const { |
| 4142 return IsEquivalent(other); | 4041 return IsEquivalent(other); |
| 4143 } | 4042 } |
| 4144 virtual bool IsEquivalent(const Instance& other, | 4043 virtual bool IsEquivalent(const Instance& other, |
| 4145 GrowableObjectArray* trail = NULL) const; | 4044 GrowableObjectArray* trail = NULL) const; |
| 4146 | 4045 |
| 4147 // Instantiate this type using the given type argument vector. | 4046 // Instantiate this type using the given type argument vector. |
| 4148 // Return a new type, or return 'this' if it is already instantiated. | 4047 // Return a new type, or return 'this' if it is already instantiated. |
| 4149 // If bound_error is not NULL, it may be set to reflect a bound error. | 4048 // If bound_error is not NULL, it may be set to reflect a bound error. |
| 4150 virtual RawAbstractType* InstantiateFrom( | 4049 virtual RawAbstractType* InstantiateFrom( |
| 4151 const AbstractTypeArguments& instantiator_type_arguments, | 4050 const TypeArguments& instantiator_type_arguments, |
| 4152 Error* bound_error, | 4051 Error* bound_error, |
| 4153 GrowableObjectArray* trail = NULL) const; | 4052 GrowableObjectArray* trail = NULL) const; |
| 4154 | 4053 |
| 4155 // Return a clone of this unfinalized type or the type itself if it is | 4054 // Return a clone of this unfinalized type or the type itself if it is |
| 4156 // already finalized. Apply recursively to type arguments, i.e. finalized | 4055 // already finalized. Apply recursively to type arguments, i.e. finalized |
| 4157 // type arguments of an unfinalized type are not cloned, but shared. | 4056 // type arguments of an unfinalized type are not cloned, but shared. |
| 4158 virtual RawAbstractType* CloneUnfinalized() const; | 4057 virtual RawAbstractType* CloneUnfinalized() const; |
| 4159 | 4058 |
| 4160 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { | 4059 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { |
| 4161 return Canonicalize(); | 4060 return Canonicalize(); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4240 bool TypeTest(TypeTestKind test_kind, | 4139 bool TypeTest(TypeTestKind test_kind, |
| 4241 const AbstractType& other, | 4140 const AbstractType& other, |
| 4242 Error* bound_error) const; | 4141 Error* bound_error) const; |
| 4243 | 4142 |
| 4244 // Return the internal or public name of this type, including the names of its | 4143 // Return the internal or public name of this type, including the names of its |
| 4245 // type arguments, if any. | 4144 // type arguments, if any. |
| 4246 RawString* BuildName(NameVisibility visibility) const; | 4145 RawString* BuildName(NameVisibility visibility) const; |
| 4247 | 4146 |
| 4248 protected: | 4147 protected: |
| 4249 HEAP_OBJECT_IMPLEMENTATION(AbstractType, Instance); | 4148 HEAP_OBJECT_IMPLEMENTATION(AbstractType, Instance); |
| 4250 friend class AbstractTypeArguments; | |
| 4251 friend class Class; | 4149 friend class Class; |
| 4252 friend class Function; | 4150 friend class Function; |
| 4151 friend class TypeArguments; |
| 4253 }; | 4152 }; |
| 4254 | 4153 |
| 4255 | 4154 |
| 4256 // A Type consists of a class, possibly parameterized with type | 4155 // A Type consists of a class, possibly parameterized with type |
| 4257 // arguments. Example: C<T1, T2>. | 4156 // arguments. Example: C<T1, T2>. |
| 4258 // An unresolved class is a String specifying the class name. | 4157 // An unresolved class is a String specifying the class name. |
| 4259 // | 4158 // |
| 4260 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as | 4159 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as |
| 4261 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not | 4160 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not |
| 4262 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'. | 4161 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 4279 virtual bool IsMalformed() const; | 4178 virtual bool IsMalformed() const; |
| 4280 virtual bool IsMalbounded() const; | 4179 virtual bool IsMalbounded() const; |
| 4281 virtual bool IsMalformedOrMalbounded() const; | 4180 virtual bool IsMalformedOrMalbounded() const; |
| 4282 virtual RawLanguageError* error() const { return raw_ptr()->error_; } | 4181 virtual RawLanguageError* error() const { return raw_ptr()->error_; } |
| 4283 virtual void set_error(const LanguageError& value) const; | 4182 virtual void set_error(const LanguageError& value) const; |
| 4284 virtual bool IsResolved() const; // Class and all arguments classes resolved. | 4183 virtual bool IsResolved() const; // Class and all arguments classes resolved. |
| 4285 virtual bool HasResolvedTypeClass() const; // Own type class resolved. | 4184 virtual bool HasResolvedTypeClass() const; // Own type class resolved. |
| 4286 virtual RawClass* type_class() const; | 4185 virtual RawClass* type_class() const; |
| 4287 void set_type_class(const Object& value) const; | 4186 void set_type_class(const Object& value) const; |
| 4288 virtual RawUnresolvedClass* unresolved_class() const; | 4187 virtual RawUnresolvedClass* unresolved_class() const; |
| 4289 virtual RawAbstractTypeArguments* arguments() const; | 4188 virtual RawTypeArguments* arguments() const; |
| 4290 void set_arguments(const AbstractTypeArguments& value) const; | 4189 void set_arguments(const TypeArguments& value) const; |
| 4291 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } | 4190 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } |
| 4292 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; | 4191 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; |
| 4293 virtual bool IsEquivalent(const Instance& other, | 4192 virtual bool IsEquivalent(const Instance& other, |
| 4294 GrowableObjectArray* trail = NULL) const; | 4193 GrowableObjectArray* trail = NULL) const; |
| 4295 virtual RawAbstractType* InstantiateFrom( | 4194 virtual RawAbstractType* InstantiateFrom( |
| 4296 const AbstractTypeArguments& instantiator_type_arguments, | 4195 const TypeArguments& instantiator_type_arguments, |
| 4297 Error* malformed_error, | 4196 Error* malformed_error, |
| 4298 GrowableObjectArray* trail = NULL) const; | 4197 GrowableObjectArray* trail = NULL) const; |
| 4299 virtual RawAbstractType* CloneUnfinalized() const; | 4198 virtual RawAbstractType* CloneUnfinalized() const; |
| 4300 virtual RawAbstractType* Canonicalize( | 4199 virtual RawAbstractType* Canonicalize( |
| 4301 GrowableObjectArray* trail = NULL) const; | 4200 GrowableObjectArray* trail = NULL) const; |
| 4302 | 4201 |
| 4303 virtual intptr_t Hash() const; | 4202 virtual intptr_t Hash() const; |
| 4304 | 4203 |
| 4305 static intptr_t InstanceSize() { | 4204 static intptr_t InstanceSize() { |
| 4306 return RoundedAllocationSize(sizeof(RawType)); | 4205 return RoundedAllocationSize(sizeof(RawType)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4348 // The 'Array' type. | 4247 // The 'Array' type. |
| 4349 static RawType* ArrayType(); | 4248 static RawType* ArrayType(); |
| 4350 | 4249 |
| 4351 // The 'Function' type. | 4250 // The 'Function' type. |
| 4352 static RawType* Function(); | 4251 static RawType* Function(); |
| 4353 | 4252 |
| 4354 // The finalized type of the given non-parameterized class. | 4253 // The finalized type of the given non-parameterized class. |
| 4355 static RawType* NewNonParameterizedType(const Class& type_class); | 4254 static RawType* NewNonParameterizedType(const Class& type_class); |
| 4356 | 4255 |
| 4357 static RawType* New(const Object& clazz, | 4256 static RawType* New(const Object& clazz, |
| 4358 const AbstractTypeArguments& arguments, | 4257 const TypeArguments& arguments, |
| 4359 intptr_t token_pos, | 4258 intptr_t token_pos, |
| 4360 Heap::Space space = Heap::kOld); | 4259 Heap::Space space = Heap::kOld); |
| 4361 | 4260 |
| 4362 private: | 4261 private: |
| 4363 void set_token_pos(intptr_t token_pos) const; | 4262 void set_token_pos(intptr_t token_pos) const; |
| 4364 void set_type_state(int8_t state) const; | 4263 void set_type_state(int8_t state) const; |
| 4365 | 4264 |
| 4366 static RawType* New(Heap::Space space = Heap::kOld); | 4265 static RawType* New(Heap::Space space = Heap::kOld); |
| 4367 | 4266 |
| 4368 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); | 4267 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); |
| 4369 friend class Class; | 4268 friend class Class; |
| 4269 friend class TypeArguments; |
| 4370 }; | 4270 }; |
| 4371 | 4271 |
| 4372 | 4272 |
| 4373 // A TypeRef is used to break cycles in the representation of recursive types. | 4273 // A TypeRef is used to break cycles in the representation of recursive types. |
| 4374 // Its only field is the recursive AbstractType it refers to. | 4274 // Its only field is the recursive AbstractType it refers to. |
| 4375 // Note that the cycle always involves type arguments. | 4275 // Note that the cycle always involves type arguments. |
| 4376 class TypeRef : public AbstractType { | 4276 class TypeRef : public AbstractType { |
| 4377 public: | 4277 public: |
| 4378 virtual bool IsFinalized() const { | 4278 virtual bool IsFinalized() const { |
| 4379 return AbstractType::Handle(type()).IsFinalized(); | 4279 return AbstractType::Handle(type()).IsFinalized(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4390 virtual bool IsMalformedOrMalbounded() const { | 4290 virtual bool IsMalformedOrMalbounded() const { |
| 4391 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); | 4291 return AbstractType::Handle(type()).IsMalformedOrMalbounded(); |
| 4392 } | 4292 } |
| 4393 virtual bool IsResolved() const { return true; } | 4293 virtual bool IsResolved() const { return true; } |
| 4394 virtual bool HasResolvedTypeClass() const { return true; } | 4294 virtual bool HasResolvedTypeClass() const { return true; } |
| 4395 RawAbstractType* type() const { return raw_ptr()->type_; } | 4295 RawAbstractType* type() const { return raw_ptr()->type_; } |
| 4396 void set_type(const AbstractType& value) const; | 4296 void set_type(const AbstractType& value) const; |
| 4397 virtual RawClass* type_class() const { | 4297 virtual RawClass* type_class() const { |
| 4398 return AbstractType::Handle(type()).type_class(); | 4298 return AbstractType::Handle(type()).type_class(); |
| 4399 } | 4299 } |
| 4400 virtual RawAbstractTypeArguments* arguments() const { | 4300 virtual RawTypeArguments* arguments() const { |
| 4401 return AbstractType::Handle(type()).arguments(); | 4301 return AbstractType::Handle(type()).arguments(); |
| 4402 } | 4302 } |
| 4403 virtual intptr_t token_pos() const { | 4303 virtual intptr_t token_pos() const { |
| 4404 return AbstractType::Handle(type()).token_pos(); | 4304 return AbstractType::Handle(type()).token_pos(); |
| 4405 } | 4305 } |
| 4406 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; | 4306 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; |
| 4407 virtual bool IsEquivalent(const Instance& other, | 4307 virtual bool IsEquivalent(const Instance& other, |
| 4408 GrowableObjectArray* trail = NULL) const; | 4308 GrowableObjectArray* trail = NULL) const; |
| 4409 virtual RawAbstractType* InstantiateFrom( | 4309 virtual RawAbstractType* InstantiateFrom( |
| 4410 const AbstractTypeArguments& instantiator_type_arguments, | 4310 const TypeArguments& instantiator_type_arguments, |
| 4411 Error* bound_error, | 4311 Error* bound_error, |
| 4412 GrowableObjectArray* trail = NULL) const; | 4312 GrowableObjectArray* trail = NULL) const; |
| 4413 virtual RawAbstractType* Canonicalize( | 4313 virtual RawAbstractType* Canonicalize( |
| 4414 GrowableObjectArray* trail = NULL) const; | 4314 GrowableObjectArray* trail = NULL) const; |
| 4415 | 4315 |
| 4416 virtual intptr_t Hash() const; | 4316 virtual intptr_t Hash() const; |
| 4417 | 4317 |
| 4418 // Return true if the receiver is contained in the trail. | 4318 // Return true if the receiver is contained in the trail. |
| 4419 // Otherwise, if the trail is null, allocate a trail, then add the receiver to | 4319 // Otherwise, if the trail is null, allocate a trail, then add the receiver to |
| 4420 // the trail and return false. | 4320 // the trail and return false. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4488 bool CheckBound(const AbstractType& bounded_type, | 4388 bool CheckBound(const AbstractType& bounded_type, |
| 4489 const AbstractType& upper_bound, | 4389 const AbstractType& upper_bound, |
| 4490 Error* bound_error) const; | 4390 Error* bound_error) const; |
| 4491 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } | 4391 virtual intptr_t token_pos() const { return raw_ptr()->token_pos_; } |
| 4492 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const { | 4392 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const { |
| 4493 return false; | 4393 return false; |
| 4494 } | 4394 } |
| 4495 virtual bool IsEquivalent(const Instance& other, | 4395 virtual bool IsEquivalent(const Instance& other, |
| 4496 GrowableObjectArray* trail = NULL) const; | 4396 GrowableObjectArray* trail = NULL) const; |
| 4497 virtual RawAbstractType* InstantiateFrom( | 4397 virtual RawAbstractType* InstantiateFrom( |
| 4498 const AbstractTypeArguments& instantiator_type_arguments, | 4398 const TypeArguments& instantiator_type_arguments, |
| 4499 Error* bound_error, | 4399 Error* bound_error, |
| 4500 GrowableObjectArray* trail = NULL) const; | 4400 GrowableObjectArray* trail = NULL) const; |
| 4501 virtual RawAbstractType* CloneUnfinalized() const; | 4401 virtual RawAbstractType* CloneUnfinalized() const; |
| 4502 virtual RawAbstractType* Canonicalize( | 4402 virtual RawAbstractType* Canonicalize( |
| 4503 GrowableObjectArray* trail = NULL) const { | 4403 GrowableObjectArray* trail = NULL) const { |
| 4504 return raw(); | 4404 return raw(); |
| 4505 } | 4405 } |
| 4506 | 4406 |
| 4507 virtual intptr_t Hash() const; | 4407 virtual intptr_t Hash() const; |
| 4508 | 4408 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4550 virtual bool IsResolved() const { return true; } | 4450 virtual bool IsResolved() const { return true; } |
| 4551 virtual bool HasResolvedTypeClass() const { | 4451 virtual bool HasResolvedTypeClass() const { |
| 4552 return AbstractType::Handle(type()).HasResolvedTypeClass(); | 4452 return AbstractType::Handle(type()).HasResolvedTypeClass(); |
| 4553 } | 4453 } |
| 4554 virtual RawClass* type_class() const { | 4454 virtual RawClass* type_class() const { |
| 4555 return AbstractType::Handle(type()).type_class(); | 4455 return AbstractType::Handle(type()).type_class(); |
| 4556 } | 4456 } |
| 4557 virtual RawUnresolvedClass* unresolved_class() const { | 4457 virtual RawUnresolvedClass* unresolved_class() const { |
| 4558 return AbstractType::Handle(type()).unresolved_class(); | 4458 return AbstractType::Handle(type()).unresolved_class(); |
| 4559 } | 4459 } |
| 4560 virtual RawAbstractTypeArguments* arguments() const { | 4460 virtual RawTypeArguments* arguments() const { |
| 4561 return AbstractType::Handle(type()).arguments(); | 4461 return AbstractType::Handle(type()).arguments(); |
| 4562 } | 4462 } |
| 4563 RawAbstractType* type() const { return raw_ptr()->type_; } | 4463 RawAbstractType* type() const { return raw_ptr()->type_; } |
| 4564 RawAbstractType* bound() const { return raw_ptr()->bound_; } | 4464 RawAbstractType* bound() const { return raw_ptr()->bound_; } |
| 4565 RawTypeParameter* type_parameter() const { | 4465 RawTypeParameter* type_parameter() const { |
| 4566 return raw_ptr()->type_parameter_; | 4466 return raw_ptr()->type_parameter_; |
| 4567 } | 4467 } |
| 4568 virtual intptr_t token_pos() const { | 4468 virtual intptr_t token_pos() const { |
| 4569 return AbstractType::Handle(type()).token_pos(); | 4469 return AbstractType::Handle(type()).token_pos(); |
| 4570 } | 4470 } |
| 4571 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const { | 4471 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const { |
| 4572 // It is not possible to encounter an instantiated bounded type with an | 4472 // It is not possible to encounter an instantiated bounded type with an |
| 4573 // uninstantiated upper bound. Therefore, we do not need to check if the | 4473 // uninstantiated upper bound. Therefore, we do not need to check if the |
| 4574 // bound is instantiated. Moreover, doing so could lead into cycles, as in | 4474 // bound is instantiated. Moreover, doing so could lead into cycles, as in |
| 4575 // class C<T extends C<C>> { }. | 4475 // class C<T extends C<C>> { }. |
| 4576 return AbstractType::Handle(type()).IsInstantiated(); | 4476 return AbstractType::Handle(type()).IsInstantiated(); |
| 4577 } | 4477 } |
| 4578 virtual bool IsEquivalent(const Instance& other, | 4478 virtual bool IsEquivalent(const Instance& other, |
| 4579 GrowableObjectArray* trail = NULL) const; | 4479 GrowableObjectArray* trail = NULL) const; |
| 4580 virtual RawAbstractType* InstantiateFrom( | 4480 virtual RawAbstractType* InstantiateFrom( |
| 4581 const AbstractTypeArguments& instantiator_type_arguments, | 4481 const TypeArguments& instantiator_type_arguments, |
| 4582 Error* bound_error, | 4482 Error* bound_error, |
| 4583 GrowableObjectArray* trail = NULL) const; | 4483 GrowableObjectArray* trail = NULL) const; |
| 4584 virtual RawAbstractType* CloneUnfinalized() const; | 4484 virtual RawAbstractType* CloneUnfinalized() const; |
| 4585 virtual RawAbstractType* Canonicalize( | 4485 virtual RawAbstractType* Canonicalize( |
| 4586 GrowableObjectArray* trail = NULL) const { | 4486 GrowableObjectArray* trail = NULL) const { |
| 4587 return raw(); | 4487 return raw(); |
| 4588 } | 4488 } |
| 4589 | 4489 |
| 4590 virtual intptr_t Hash() const; | 4490 virtual intptr_t Hash() const; |
| 4591 | 4491 |
| (...skipping 1066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5658 } | 5558 } |
| 5659 void SetAt(intptr_t index, const Object& value) const { | 5559 void SetAt(intptr_t index, const Object& value) const { |
| 5660 // TODO(iposva): Add storing NoGCScope. | 5560 // TODO(iposva): Add storing NoGCScope. |
| 5661 StorePointer(ObjectAddr(index), value.raw()); | 5561 StorePointer(ObjectAddr(index), value.raw()); |
| 5662 } | 5562 } |
| 5663 | 5563 |
| 5664 bool IsImmutable() const { | 5564 bool IsImmutable() const { |
| 5665 return raw()->GetClassId() == kImmutableArrayCid; | 5565 return raw()->GetClassId() == kImmutableArrayCid; |
| 5666 } | 5566 } |
| 5667 | 5567 |
| 5668 virtual RawAbstractTypeArguments* GetTypeArguments() const { | 5568 virtual RawTypeArguments* GetTypeArguments() const { |
| 5669 return raw_ptr()->type_arguments_; | 5569 return raw_ptr()->type_arguments_; |
| 5670 } | 5570 } |
| 5671 virtual void SetTypeArguments(const AbstractTypeArguments& value) const { | 5571 virtual void SetTypeArguments(const TypeArguments& value) const { |
| 5672 // An Array is raw or takes one type argument. However, its type argument | 5572 // An Array is raw or takes one type argument. However, its type argument |
| 5673 // vector may be longer than 1 due to a type optimization reusing the type | 5573 // vector may be longer than 1 due to a type optimization reusing the type |
| 5674 // argument vector of the instantiator. | 5574 // argument vector of the instantiator. |
| 5675 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); | 5575 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); |
| 5676 StorePointer(&raw_ptr()->type_arguments_, value.raw()); | 5576 StorePointer(&raw_ptr()->type_arguments_, value.raw()); |
| 5677 } | 5577 } |
| 5678 | 5578 |
| 5679 virtual bool Equals(const Instance& other) const; | 5579 virtual bool Equals(const Instance& other) const; |
| 5680 | 5580 |
| 5681 static const intptr_t kBytesPerElement = kWordSize; | 5581 static const intptr_t kBytesPerElement = kWordSize; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5816 | 5716 |
| 5817 // TODO(iposva): Add storing NoGCScope. | 5717 // TODO(iposva): Add storing NoGCScope. |
| 5818 DataStorePointer(ObjectAddr(index), value.raw()); | 5718 DataStorePointer(ObjectAddr(index), value.raw()); |
| 5819 } | 5719 } |
| 5820 | 5720 |
| 5821 void Add(const Object& value, Heap::Space space = Heap::kNew) const; | 5721 void Add(const Object& value, Heap::Space space = Heap::kNew) const; |
| 5822 | 5722 |
| 5823 void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const; | 5723 void Grow(intptr_t new_capacity, Heap::Space space = Heap::kNew) const; |
| 5824 RawObject* RemoveLast() const; | 5724 RawObject* RemoveLast() const; |
| 5825 | 5725 |
| 5826 virtual RawAbstractTypeArguments* GetTypeArguments() const { | 5726 virtual RawTypeArguments* GetTypeArguments() const { |
| 5827 return raw_ptr()->type_arguments_; | 5727 return raw_ptr()->type_arguments_; |
| 5828 } | 5728 } |
| 5829 virtual void SetTypeArguments(const AbstractTypeArguments& value) const { | 5729 virtual void SetTypeArguments(const TypeArguments& value) const { |
| 5830 // A GrowableObjectArray is raw or takes one type argument. However, its | 5730 // A GrowableObjectArray is raw or takes one type argument. However, its |
| 5831 // type argument vector may be longer than 1 due to a type optimization | 5731 // type argument vector may be longer than 1 due to a type optimization |
| 5832 // reusing the type argument vector of the instantiator. | 5732 // reusing the type argument vector of the instantiator. |
| 5833 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); | 5733 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); |
| 5834 const Array& contents = Array::Handle(data()); | 5734 const Array& contents = Array::Handle(data()); |
| 5835 contents.SetTypeArguments(value); | 5735 contents.SetTypeArguments(value); |
| 5836 StorePointer(&raw_ptr()->type_arguments_, value.raw()); | 5736 StorePointer(&raw_ptr()->type_arguments_, value.raw()); |
| 5837 } | 5737 } |
| 5838 | 5738 |
| 5839 virtual bool Equals(const Instance& other) const; | 5739 virtual bool Equals(const Instance& other) const; |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6314 return static_cast<intptr_t>(kFunctionOffset * kWordSize); | 6214 return static_cast<intptr_t>(kFunctionOffset * kWordSize); |
| 6315 } | 6215 } |
| 6316 | 6216 |
| 6317 static RawContext* context(const Instance& closure) { | 6217 static RawContext* context(const Instance& closure) { |
| 6318 return *ContextAddr(closure); | 6218 return *ContextAddr(closure); |
| 6319 } | 6219 } |
| 6320 static intptr_t context_offset() { | 6220 static intptr_t context_offset() { |
| 6321 return static_cast<intptr_t>(kContextOffset * kWordSize); | 6221 return static_cast<intptr_t>(kContextOffset * kWordSize); |
| 6322 } | 6222 } |
| 6323 | 6223 |
| 6324 static RawAbstractTypeArguments* GetTypeArguments(const Instance& closure) { | 6224 static RawTypeArguments* GetTypeArguments(const Instance& closure) { |
| 6325 return *TypeArgumentsAddr(closure); | 6225 return *TypeArgumentsAddr(closure); |
| 6326 } | 6226 } |
| 6327 static void SetTypeArguments(const Instance& closure, | 6227 static void SetTypeArguments(const Instance& closure, |
| 6328 const AbstractTypeArguments& value) { | 6228 const TypeArguments& value) { |
| 6329 closure.StorePointer(TypeArgumentsAddr(closure), value.raw()); | 6229 closure.StorePointer(TypeArgumentsAddr(closure), value.raw()); |
| 6330 } | 6230 } |
| 6331 static intptr_t type_arguments_offset() { | 6231 static intptr_t type_arguments_offset() { |
| 6332 return static_cast<intptr_t>(kTypeArgumentsOffset * kWordSize); | 6232 return static_cast<intptr_t>(kTypeArgumentsOffset * kWordSize); |
| 6333 } | 6233 } |
| 6334 | 6234 |
| 6335 static const char* ToCString(const Instance& closure); | 6235 static const char* ToCString(const Instance& closure); |
| 6336 | 6236 |
| 6337 static intptr_t InstanceSize() { | 6237 static intptr_t InstanceSize() { |
| 6338 intptr_t size = sizeof(RawInstance) + (kNumFields * kWordSize); | 6238 intptr_t size = sizeof(RawInstance) + (kNumFields * kWordSize); |
| 6339 ASSERT(size == Object::RoundedAllocationSize(size)); | 6239 ASSERT(size == Object::RoundedAllocationSize(size)); |
| 6340 return size; | 6240 return size; |
| 6341 } | 6241 } |
| 6342 | 6242 |
| 6343 static RawInstance* New(const Function& function, | 6243 static RawInstance* New(const Function& function, |
| 6344 const Context& context, | 6244 const Context& context, |
| 6345 Heap::Space space = Heap::kNew); | 6245 Heap::Space space = Heap::kNew); |
| 6346 | 6246 |
| 6347 private: | 6247 private: |
| 6348 static const int kTypeArgumentsOffset = 1; | 6248 static const int kTypeArgumentsOffset = 1; |
| 6349 static const int kFunctionOffset = 2; | 6249 static const int kFunctionOffset = 2; |
| 6350 static const int kContextOffset = 3; | 6250 static const int kContextOffset = 3; |
| 6351 static const int kNumFields = 3; | 6251 static const int kNumFields = 3; |
| 6352 | 6252 |
| 6353 static RawAbstractTypeArguments** TypeArgumentsAddr(const Instance& obj) { | 6253 static RawTypeArguments** TypeArgumentsAddr(const Instance& obj) { |
| 6354 ASSERT(obj.IsClosure()); | 6254 ASSERT(obj.IsClosure()); |
| 6355 return reinterpret_cast<RawAbstractTypeArguments**>( | 6255 return reinterpret_cast<RawTypeArguments**>( |
| 6356 reinterpret_cast<intptr_t>(obj.raw_ptr()) + type_arguments_offset()); | 6256 reinterpret_cast<intptr_t>(obj.raw_ptr()) + type_arguments_offset()); |
| 6357 } | 6257 } |
| 6358 static RawFunction** FunctionAddr(const Instance& obj) { | 6258 static RawFunction** FunctionAddr(const Instance& obj) { |
| 6359 ASSERT(obj.IsClosure()); | 6259 ASSERT(obj.IsClosure()); |
| 6360 return reinterpret_cast<RawFunction**>( | 6260 return reinterpret_cast<RawFunction**>( |
| 6361 reinterpret_cast<intptr_t>(obj.raw_ptr()) + function_offset()); | 6261 reinterpret_cast<intptr_t>(obj.raw_ptr()) + function_offset()); |
| 6362 } | 6262 } |
| 6363 static RawContext** ContextAddr(const Instance& obj) { | 6263 static RawContext** ContextAddr(const Instance& obj) { |
| 6364 ASSERT(obj.IsClosure()); | 6264 ASSERT(obj.IsClosure()); |
| 6365 return reinterpret_cast<RawContext**>( | 6265 return reinterpret_cast<RawContext**>( |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6692 | 6592 |
| 6693 | 6593 |
| 6694 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 6594 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
| 6695 intptr_t index) { | 6595 intptr_t index) { |
| 6696 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 6596 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
| 6697 } | 6597 } |
| 6698 | 6598 |
| 6699 } // namespace dart | 6599 } // namespace dart |
| 6700 | 6600 |
| 6701 #endif // VM_OBJECT_H_ | 6601 #endif // VM_OBJECT_H_ |
| OLD | NEW |