| 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 RUNTIME_VM_OBJECT_H_ | 5 #ifndef RUNTIME_VM_OBJECT_H_ |
| 6 #define RUNTIME_VM_OBJECT_H_ | 6 #define RUNTIME_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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 return *null_string_; | 357 return *null_string_; |
| 358 } | 358 } |
| 359 static const Instance& null_instance() { | 359 static const Instance& null_instance() { |
| 360 ASSERT(null_instance_ != NULL); | 360 ASSERT(null_instance_ != NULL); |
| 361 return *null_instance_; | 361 return *null_instance_; |
| 362 } | 362 } |
| 363 static const TypeArguments& null_type_arguments() { | 363 static const TypeArguments& null_type_arguments() { |
| 364 ASSERT(null_type_arguments_ != NULL); | 364 ASSERT(null_type_arguments_ != NULL); |
| 365 return *null_type_arguments_; | 365 return *null_type_arguments_; |
| 366 } | 366 } |
| 367 static const TypeArguments& empty_type_arguments() { |
| 368 ASSERT(empty_type_arguments_ != NULL); |
| 369 return *empty_type_arguments_; |
| 370 } |
| 367 | 371 |
| 368 static const Array& empty_array() { | 372 static const Array& empty_array() { |
| 369 ASSERT(empty_array_ != NULL); | 373 ASSERT(empty_array_ != NULL); |
| 370 return *empty_array_; | 374 return *empty_array_; |
| 371 } | 375 } |
| 372 static const Array& zero_array() { | 376 static const Array& zero_array() { |
| 373 ASSERT(zero_array_ != NULL); | 377 ASSERT(zero_array_ != NULL); |
| 374 return *zero_array_; | 378 return *zero_array_; |
| 375 } | 379 } |
| 376 | 380 |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 static RawClass* unhandled_exception_class_; // Class of UnhandledException. | 785 static RawClass* unhandled_exception_class_; // Class of UnhandledException. |
| 782 static RawClass* unwind_error_class_; // Class of UnwindError. | 786 static RawClass* unwind_error_class_; // Class of UnwindError. |
| 783 | 787 |
| 784 // The static values below are read-only handle pointers for singleton | 788 // The static values below are read-only handle pointers for singleton |
| 785 // objects that are shared between the different isolates. | 789 // objects that are shared between the different isolates. |
| 786 static Object* null_object_; | 790 static Object* null_object_; |
| 787 static Array* null_array_; | 791 static Array* null_array_; |
| 788 static String* null_string_; | 792 static String* null_string_; |
| 789 static Instance* null_instance_; | 793 static Instance* null_instance_; |
| 790 static TypeArguments* null_type_arguments_; | 794 static TypeArguments* null_type_arguments_; |
| 795 static TypeArguments* empty_type_arguments_; |
| 791 static Array* empty_array_; | 796 static Array* empty_array_; |
| 792 static Array* zero_array_; | 797 static Array* zero_array_; |
| 793 static Context* empty_context_; | 798 static Context* empty_context_; |
| 794 static ContextScope* empty_context_scope_; | 799 static ContextScope* empty_context_scope_; |
| 795 static ObjectPool* empty_object_pool_; | 800 static ObjectPool* empty_object_pool_; |
| 796 static PcDescriptors* empty_descriptors_; | 801 static PcDescriptors* empty_descriptors_; |
| 797 static LocalVarDescriptors* empty_var_descriptors_; | 802 static LocalVarDescriptors* empty_var_descriptors_; |
| 798 static ExceptionHandlers* empty_exception_handlers_; | 803 static ExceptionHandlers* empty_exception_handlers_; |
| 799 static Array* extractor_parameter_types_; | 804 static Array* extractor_parameter_types_; |
| 800 static Array* extractor_parameter_names_; | 805 static Array* extractor_parameter_names_; |
| (...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object); | 1557 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object); |
| 1553 friend class Class; | 1558 friend class Class; |
| 1554 }; | 1559 }; |
| 1555 | 1560 |
| 1556 | 1561 |
| 1557 // Classification of type genericity according to type parameter owners. | 1562 // Classification of type genericity according to type parameter owners. |
| 1558 enum Genericity { | 1563 enum Genericity { |
| 1559 kAny, // Consider type params of current class and functions. | 1564 kAny, // Consider type params of current class and functions. |
| 1560 kCurrentClass, // Consider type params of current class only. | 1565 kCurrentClass, // Consider type params of current class only. |
| 1561 kFunctions, // Consider type params of current and parent functions. | 1566 kFunctions, // Consider type params of current and parent functions. |
| 1562 kCurrentFunction, // Consider type params of current function only. | |
| 1563 kParentFunctions // Consider type params of parent functions only. | |
| 1564 }; | 1567 }; |
| 1565 | 1568 |
| 1566 | 1569 |
| 1567 // A TypeArguments is an array of AbstractType. | 1570 // A TypeArguments is an array of AbstractType. |
| 1568 class TypeArguments : public Object { | 1571 class TypeArguments : public Object { |
| 1569 public: | 1572 public: |
| 1570 // We use 30 bits for the hash code so hashes in a snapshot taken on a | 1573 // We use 30 bits for the hash code so hashes in a snapshot taken on a |
| 1571 // 64-bit architecture stay in Smi range when loaded on a 32-bit | 1574 // 64-bit architecture stay in Smi range when loaded on a 32-bit |
| 1572 // architecture. | 1575 // architecture. |
| 1573 static const intptr_t kHashBits = 30; | 1576 static const intptr_t kHashBits = 30; |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1765 void set_instantiations(const Array& value) const; | 1768 void set_instantiations(const Array& value) const; |
| 1766 RawAbstractType* const* TypeAddr(intptr_t index) const; | 1769 RawAbstractType* const* TypeAddr(intptr_t index) const; |
| 1767 void SetLength(intptr_t value) const; | 1770 void SetLength(intptr_t value) const; |
| 1768 // Number of fields in the raw object=3 (instantiations_, length_ and hash_). | 1771 // Number of fields in the raw object=3 (instantiations_, length_ and hash_). |
| 1769 static const int kNumFields = 3; | 1772 static const int kNumFields = 3; |
| 1770 | 1773 |
| 1771 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); | 1774 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); |
| 1772 friend class AbstractType; | 1775 friend class AbstractType; |
| 1773 friend class Class; | 1776 friend class Class; |
| 1774 friend class ClearTypeHashVisitor; | 1777 friend class ClearTypeHashVisitor; |
| 1778 friend class Object; |
| 1775 }; | 1779 }; |
| 1776 | 1780 |
| 1777 | 1781 |
| 1778 class PatchClass : public Object { | 1782 class PatchClass : public Object { |
| 1779 public: | 1783 public: |
| 1780 RawClass* patched_class() const { return raw_ptr()->patched_class_; } | 1784 RawClass* patched_class() const { return raw_ptr()->patched_class_; } |
| 1781 RawClass* origin_class() const { return raw_ptr()->origin_class_; } | 1785 RawClass* origin_class() const { return raw_ptr()->origin_class_; } |
| 1782 RawScript* script() const { return raw_ptr()->script_; } | 1786 RawScript* script() const { return raw_ptr()->script_; } |
| 1783 | 1787 |
| 1784 static intptr_t InstanceSize() { | 1788 static intptr_t InstanceSize() { |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2271 // TypeParameter. | 2275 // TypeParameter. |
| 2272 RawTypeArguments* type_parameters() const { | 2276 RawTypeArguments* type_parameters() const { |
| 2273 return raw_ptr()->type_parameters_; | 2277 return raw_ptr()->type_parameters_; |
| 2274 } | 2278 } |
| 2275 void set_type_parameters(const TypeArguments& value) const; | 2279 void set_type_parameters(const TypeArguments& value) const; |
| 2276 intptr_t NumTypeParameters(Thread* thread) const; | 2280 intptr_t NumTypeParameters(Thread* thread) const; |
| 2277 intptr_t NumTypeParameters() const { | 2281 intptr_t NumTypeParameters() const { |
| 2278 return NumTypeParameters(Thread::Current()); | 2282 return NumTypeParameters(Thread::Current()); |
| 2279 } | 2283 } |
| 2280 | 2284 |
| 2285 // Return the number of type parameters declared in parent generic functions. |
| 2286 intptr_t NumParentTypeParameters() const; |
| 2287 |
| 2281 // Return a TypeParameter if the type_name is a type parameter of this | 2288 // Return a TypeParameter if the type_name is a type parameter of this |
| 2282 // function or of one of its parent functions. | 2289 // function or of one of its parent functions. |
| 2283 // Unless NULL, adjust function_level accordingly (in and out parameter). | 2290 // Unless NULL, adjust function_level accordingly (in and out parameter). |
| 2284 // Return null otherwise. | 2291 // Return null otherwise. |
| 2285 RawTypeParameter* LookupTypeParameter(const String& type_name, | 2292 RawTypeParameter* LookupTypeParameter(const String& type_name, |
| 2286 intptr_t* function_level) const; | 2293 intptr_t* function_level) const; |
| 2287 | 2294 |
| 2288 // Return true if this function declares type parameters. | 2295 // Return true if this function declares type parameters. |
| 2289 bool IsGeneric() const { return NumTypeParameters(Thread::Current()) > 0; } | 2296 bool IsGeneric() const { return NumTypeParameters(Thread::Current()) > 0; } |
| 2290 | 2297 |
| (...skipping 3840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6131 } | 6138 } |
| 6132 bool IsClassTypeParameter() const { | 6139 bool IsClassTypeParameter() const { |
| 6133 return parameterized_class_id() != kFunctionCid; | 6140 return parameterized_class_id() != kFunctionCid; |
| 6134 } | 6141 } |
| 6135 bool IsFunctionTypeParameter() const { | 6142 bool IsFunctionTypeParameter() const { |
| 6136 return parameterized_function() != Function::null(); | 6143 return parameterized_function() != Function::null(); |
| 6137 } | 6144 } |
| 6138 RawString* name() const { return raw_ptr()->name_; } | 6145 RawString* name() const { return raw_ptr()->name_; } |
| 6139 intptr_t index() const { return raw_ptr()->index_; } | 6146 intptr_t index() const { return raw_ptr()->index_; } |
| 6140 void set_index(intptr_t value) const; | 6147 void set_index(intptr_t value) const; |
| 6141 intptr_t parent_level() const { return raw_ptr()->parent_level_; } | |
| 6142 RawAbstractType* bound() const { return raw_ptr()->bound_; } | 6148 RawAbstractType* bound() const { return raw_ptr()->bound_; } |
| 6143 void set_bound(const AbstractType& value) const; | 6149 void set_bound(const AbstractType& value) const; |
| 6144 // Returns true if bounded_type is below upper_bound, otherwise return false | 6150 // Returns true if bounded_type is below upper_bound, otherwise return false |
| 6145 // and set bound_error if both bounded_type and upper_bound are instantiated. | 6151 // and set bound_error if both bounded_type and upper_bound are instantiated. |
| 6146 // If one or both are not instantiated, returning false only means that the | 6152 // If one or both are not instantiated, returning false only means that the |
| 6147 // bound cannot be checked yet and this is not an error. | 6153 // bound cannot be checked yet and this is not an error. |
| 6148 bool CheckBound(const AbstractType& bounded_type, | 6154 bool CheckBound(const AbstractType& bounded_type, |
| 6149 const AbstractType& upper_bound, | 6155 const AbstractType& upper_bound, |
| 6150 Error* bound_error, | 6156 Error* bound_error, |
| 6151 TrailPtr bound_trail, | 6157 TrailPtr bound_trail, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 6177 virtual intptr_t Hash() const; | 6183 virtual intptr_t Hash() const; |
| 6178 | 6184 |
| 6179 static intptr_t InstanceSize() { | 6185 static intptr_t InstanceSize() { |
| 6180 return RoundedAllocationSize(sizeof(RawTypeParameter)); | 6186 return RoundedAllocationSize(sizeof(RawTypeParameter)); |
| 6181 } | 6187 } |
| 6182 | 6188 |
| 6183 // Only one of parameterized_class and parameterized_function is non-null. | 6189 // Only one of parameterized_class and parameterized_function is non-null. |
| 6184 static RawTypeParameter* New(const Class& parameterized_class, | 6190 static RawTypeParameter* New(const Class& parameterized_class, |
| 6185 const Function& parameterized_function, | 6191 const Function& parameterized_function, |
| 6186 intptr_t index, | 6192 intptr_t index, |
| 6187 intptr_t parent_level, | |
| 6188 const String& name, | 6193 const String& name, |
| 6189 const AbstractType& bound, | 6194 const AbstractType& bound, |
| 6190 TokenPosition token_pos); | 6195 TokenPosition token_pos); |
| 6191 | 6196 |
| 6192 private: | 6197 private: |
| 6193 intptr_t ComputeHash() const; | 6198 intptr_t ComputeHash() const; |
| 6194 void SetHash(intptr_t value) const; | 6199 void SetHash(intptr_t value) const; |
| 6195 | 6200 |
| 6196 void set_parameterized_class(const Class& value) const; | 6201 void set_parameterized_class(const Class& value) const; |
| 6197 void set_parameterized_function(const Function& value) const; | 6202 void set_parameterized_function(const Function& value) const; |
| 6198 void set_name(const String& value) const; | 6203 void set_name(const String& value) const; |
| 6199 void set_token_pos(TokenPosition token_pos) const; | 6204 void set_token_pos(TokenPosition token_pos) const; |
| 6200 void set_parent_level(intptr_t value) const; | |
| 6201 void set_type_state(int8_t state) const; | 6205 void set_type_state(int8_t state) const; |
| 6202 | 6206 |
| 6203 static RawTypeParameter* New(); | 6207 static RawTypeParameter* New(); |
| 6204 | 6208 |
| 6205 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameter, AbstractType); | 6209 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameter, AbstractType); |
| 6206 friend class Class; | 6210 friend class Class; |
| 6207 friend class ClearTypeHashVisitor; | 6211 friend class ClearTypeHashVisitor; |
| 6208 }; | 6212 }; |
| 6209 | 6213 |
| 6210 | 6214 |
| (...skipping 2137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8348 // Used during deserialization (since map might contain itself as key/value). | 8352 // Used during deserialization (since map might contain itself as key/value). |
| 8349 static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew); | 8353 static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew); |
| 8350 | 8354 |
| 8351 friend class Class; | 8355 friend class Class; |
| 8352 friend class LinkedHashMapDeserializationCluster; | 8356 friend class LinkedHashMapDeserializationCluster; |
| 8353 }; | 8357 }; |
| 8354 | 8358 |
| 8355 | 8359 |
| 8356 class Closure : public Instance { | 8360 class Closure : public Instance { |
| 8357 public: | 8361 public: |
| 8358 RawTypeArguments* instantiator() const { return raw_ptr()->instantiator_; } | 8362 RawTypeArguments* instantiator_type_arguments() const { |
| 8359 static intptr_t instantiator_offset() { | 8363 return raw_ptr()->instantiator_type_arguments_; |
| 8360 return OFFSET_OF(RawClosure, instantiator_); | 8364 } |
| 8365 static intptr_t instantiator_type_arguments_offset() { |
| 8366 return OFFSET_OF(RawClosure, instantiator_type_arguments_); |
| 8367 } |
| 8368 |
| 8369 RawTypeArguments* function_type_arguments() const { |
| 8370 return raw_ptr()->function_type_arguments_; |
| 8371 } |
| 8372 static intptr_t function_type_arguments_offset() { |
| 8373 return OFFSET_OF(RawClosure, function_type_arguments_); |
| 8361 } | 8374 } |
| 8362 | 8375 |
| 8363 RawFunction* function() const { return raw_ptr()->function_; } | 8376 RawFunction* function() const { return raw_ptr()->function_; } |
| 8364 static intptr_t function_offset() { return OFFSET_OF(RawClosure, function_); } | 8377 static intptr_t function_offset() { return OFFSET_OF(RawClosure, function_); } |
| 8365 | 8378 |
| 8366 RawContext* context() const { return raw_ptr()->context_; } | 8379 RawContext* context() const { return raw_ptr()->context_; } |
| 8367 static intptr_t context_offset() { return OFFSET_OF(RawClosure, context_); } | 8380 static intptr_t context_offset() { return OFFSET_OF(RawClosure, context_); } |
| 8368 | 8381 |
| 8369 static intptr_t InstanceSize() { | 8382 static intptr_t InstanceSize() { |
| 8370 return RoundedAllocationSize(sizeof(RawClosure)); | 8383 return RoundedAllocationSize(sizeof(RawClosure)); |
| 8371 } | 8384 } |
| 8372 | 8385 |
| 8373 // Returns true if all elements are OK for canonicalization. | 8386 // Returns true if all elements are OK for canonicalization. |
| 8374 virtual bool CheckAndCanonicalizeFields(Thread* thread, | 8387 virtual bool CheckAndCanonicalizeFields(Thread* thread, |
| 8375 const char** error_str) const { | 8388 const char** error_str) const { |
| 8376 // None of the fields of a closure are instances. | 8389 // None of the fields of a closure are instances. |
| 8377 return true; | 8390 return true; |
| 8378 } | 8391 } |
| 8379 | 8392 |
| 8380 static RawClosure* New(const TypeArguments& instantiator, | 8393 static RawClosure* New(const TypeArguments& instantiator_type_arguments, |
| 8394 const TypeArguments& function_type_arguments, |
| 8381 const Function& function, | 8395 const Function& function, |
| 8382 const Context& context, | 8396 const Context& context, |
| 8383 Heap::Space space = Heap::kNew); | 8397 Heap::Space space = Heap::kNew); |
| 8384 | 8398 |
| 8385 private: | 8399 private: |
| 8386 static RawClosure* New(); | 8400 static RawClosure* New(); |
| 8387 | 8401 |
| 8388 FINAL_HEAP_OBJECT_IMPLEMENTATION(Closure, Instance); | 8402 FINAL_HEAP_OBJECT_IMPLEMENTATION(Closure, Instance); |
| 8389 friend class Class; | 8403 friend class Class; |
| 8390 }; | 8404 }; |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8969 | 8983 |
| 8970 inline void TypeArguments::SetHash(intptr_t value) const { | 8984 inline void TypeArguments::SetHash(intptr_t value) const { |
| 8971 // This is only safe because we create a new Smi, which does not cause | 8985 // This is only safe because we create a new Smi, which does not cause |
| 8972 // heap allocation. | 8986 // heap allocation. |
| 8973 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8987 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 8974 } | 8988 } |
| 8975 | 8989 |
| 8976 } // namespace dart | 8990 } // namespace dart |
| 8977 | 8991 |
| 8978 #endif // RUNTIME_VM_OBJECT_H_ | 8992 #endif // RUNTIME_VM_OBJECT_H_ |
| OLD | NEW |