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 1698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 | 1709 |
1710 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); | 1710 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); |
1711 friend class AbstractType; | 1711 friend class AbstractType; |
1712 friend class Class; | 1712 friend class Class; |
1713 }; | 1713 }; |
1714 | 1714 |
1715 | 1715 |
1716 class PatchClass : public Object { | 1716 class PatchClass : public Object { |
1717 public: | 1717 public: |
1718 RawClass* patched_class() const { return raw_ptr()->patched_class_; } | 1718 RawClass* patched_class() const { return raw_ptr()->patched_class_; } |
1719 RawClass* source_class() const { return raw_ptr()->source_class_; } | 1719 RawClass* origin_class() const { return raw_ptr()->origin_class_; } |
1720 RawScript* Script() const; | 1720 RawScript* script() const { return raw_ptr()->script_; } |
1721 | 1721 |
1722 static intptr_t InstanceSize() { | 1722 static intptr_t InstanceSize() { |
1723 return RoundedAllocationSize(sizeof(RawPatchClass)); | 1723 return RoundedAllocationSize(sizeof(RawPatchClass)); |
1724 } | 1724 } |
1725 static bool IsInFullSnapshot(RawPatchClass* cls) { | 1725 static bool IsInFullSnapshot(RawPatchClass* cls) { |
1726 NoSafepointScope no_safepoint; | 1726 NoSafepointScope no_safepoint; |
1727 return Class::IsInFullSnapshot(cls->ptr()->patched_class_); | 1727 return Class::IsInFullSnapshot(cls->ptr()->patched_class_); |
1728 } | 1728 } |
1729 | 1729 |
1730 static RawPatchClass* New(const Class& patched_class, | 1730 static RawPatchClass* New(const Class& patched_class, |
1731 const Class& source_class); | 1731 const Class& origin_class); |
| 1732 |
| 1733 static RawPatchClass* New(const Class& patched_class, |
| 1734 const Script& source); |
1732 | 1735 |
1733 private: | 1736 private: |
1734 void set_patched_class(const Class& value) const; | 1737 void set_patched_class(const Class& value) const; |
1735 void set_source_class(const Class& value) const; | 1738 void set_origin_class(const Class& value) const; |
| 1739 void set_script(const Script& value) const; |
1736 | 1740 |
1737 static RawPatchClass* New(); | 1741 static RawPatchClass* New(); |
1738 | 1742 |
1739 FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object); | 1743 FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object); |
1740 friend class Class; | 1744 friend class Class; |
1741 }; | 1745 }; |
1742 | 1746 |
1743 | 1747 |
1744 // Object holding information about an IC: test classes and their | 1748 // Object holding information about an IC: test classes and their |
1745 // corresponding targets. | 1749 // corresponding targets. |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2129 // does not involve generic parameter types or generic result type. | 2133 // does not involve generic parameter types or generic result type. |
2130 bool HasInstantiatedSignature() const; | 2134 bool HasInstantiatedSignature() const; |
2131 | 2135 |
2132 // Build a string of the form 'T, {b: B, c: C} representing the user | 2136 // Build a string of the form 'T, {b: B, c: C} representing the user |
2133 // visible formal parameters of the function. | 2137 // visible formal parameters of the function. |
2134 RawString* UserVisibleFormalParameters() const; | 2138 RawString* UserVisibleFormalParameters() const; |
2135 | 2139 |
2136 RawClass* Owner() const; | 2140 RawClass* Owner() const; |
2137 RawClass* origin() const; | 2141 RawClass* origin() const; |
2138 RawScript* script() const; | 2142 RawScript* script() const; |
| 2143 RawObject* RawOwner() const { return raw_ptr()->owner_; } |
2139 | 2144 |
2140 RawJSRegExp* regexp() const; | 2145 RawJSRegExp* regexp() const; |
2141 intptr_t string_specialization_cid() const; | 2146 intptr_t string_specialization_cid() const; |
2142 void SetRegExpData(const JSRegExp& regexp, | 2147 void SetRegExpData(const JSRegExp& regexp, |
2143 intptr_t string_specialization_cid) const; | 2148 intptr_t string_specialization_cid) const; |
2144 | 2149 |
2145 RawString* native_name() const; | 2150 RawString* native_name() const; |
2146 void set_native_name(const String& name) const; | 2151 void set_native_name(const String& name) const; |
2147 | 2152 |
2148 RawAbstractType* result_type() const { return raw_ptr()->result_type_; } | 2153 RawAbstractType* result_type() const { return raw_ptr()->result_type_; } |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2856 RawString* PrettyName() const; | 2861 RawString* PrettyName() const; |
2857 RawString* UserVisibleName() const; | 2862 RawString* UserVisibleName() const; |
2858 virtual RawString* DictionaryName() const { return name(); } | 2863 virtual RawString* DictionaryName() const { return name(); } |
2859 | 2864 |
2860 bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); } | 2865 bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); } |
2861 bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); } | 2866 bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); } |
2862 bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); } | 2867 bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); } |
2863 bool is_reflectable() const { | 2868 bool is_reflectable() const { |
2864 return ReflectableBit::decode(raw_ptr()->kind_bits_); | 2869 return ReflectableBit::decode(raw_ptr()->kind_bits_); |
2865 } | 2870 } |
| 2871 void set_is_reflectable(bool value) const { |
| 2872 set_kind_bits(ReflectableBit::update(value, raw_ptr()->kind_bits_)); |
| 2873 } |
2866 bool is_double_initialized() const { | 2874 bool is_double_initialized() const { |
2867 return DoubleInitializedBit::decode(raw_ptr()->kind_bits_); | 2875 return DoubleInitializedBit::decode(raw_ptr()->kind_bits_); |
2868 } | 2876 } |
2869 // Called in parser after allocating field, immutable property otherwise. | 2877 // Called in parser after allocating field, immutable property otherwise. |
2870 // Marks fields that are initialized with a simple double constant. | 2878 // Marks fields that are initialized with a simple double constant. |
2871 void set_is_double_initialized(bool value) const { | 2879 void set_is_double_initialized(bool value) const { |
2872 ASSERT(Thread::Current()->IsMutatorThread()); | 2880 ASSERT(Thread::Current()->IsMutatorThread()); |
2873 set_kind_bits(DoubleInitializedBit::update(value, raw_ptr()->kind_bits_)); | 2881 set_kind_bits(DoubleInitializedBit::update(value, raw_ptr()->kind_bits_)); |
2874 } | 2882 } |
2875 | 2883 |
2876 inline intptr_t Offset() const; | 2884 inline intptr_t Offset() const; |
2877 // Called during class finalization. | 2885 // Called during class finalization. |
2878 inline void SetOffset(intptr_t offset_in_bytes) const; | 2886 inline void SetOffset(intptr_t offset_in_bytes) const; |
2879 | 2887 |
2880 inline RawInstance* StaticValue() const; | 2888 inline RawInstance* StaticValue() const; |
2881 inline void SetStaticValue(const Instance& value, | 2889 inline void SetStaticValue(const Instance& value, |
2882 bool save_initial_value = false) const; | 2890 bool save_initial_value = false) const; |
2883 | 2891 |
2884 RawClass* owner() const; | 2892 RawClass* owner() const; |
2885 RawClass* origin() const; // Either mixin class, or same as owner(). | 2893 RawClass* origin() const; // Either mixin class, or same as owner(). |
| 2894 RawScript* script() const; |
| 2895 RawObject* RawOwner() const { return raw_ptr()->owner_; } |
2886 | 2896 |
2887 RawAbstractType* type() const { return raw_ptr()->type_; } | 2897 RawAbstractType* type() const { return raw_ptr()->type_; } |
2888 // Used by class finalizer, otherwise initialized in constructor. | 2898 // Used by class finalizer, otherwise initialized in constructor. |
2889 void SetFieldType(const AbstractType& value) const; | 2899 void SetFieldType(const AbstractType& value) const; |
2890 | 2900 |
2891 static intptr_t InstanceSize() { | 2901 static intptr_t InstanceSize() { |
2892 return RoundedAllocationSize(sizeof(RawField)); | 2902 return RoundedAllocationSize(sizeof(RawField)); |
2893 } | 2903 } |
2894 | 2904 |
2895 static RawField* New(const String& name, | 2905 static RawField* New(const String& name, |
2896 bool is_static, | 2906 bool is_static, |
2897 bool is_final, | 2907 bool is_final, |
2898 bool is_const, | 2908 bool is_const, |
2899 bool is_reflectable, | 2909 bool is_reflectable, |
2900 const Class& owner, | 2910 const Class& owner, |
2901 const AbstractType& type, | 2911 const AbstractType& type, |
2902 intptr_t token_pos); | 2912 intptr_t token_pos); |
2903 | 2913 |
| 2914 static RawField* NewTopLevel(const String& name, |
| 2915 bool is_final, |
| 2916 bool is_const, |
| 2917 const Object& owner, |
| 2918 intptr_t token_pos); |
| 2919 |
2904 // Allocate new field object, clone values from this field. The | 2920 // Allocate new field object, clone values from this field. The |
2905 // owner of the clone is new_owner. | 2921 // owner of the clone is new_owner. |
2906 RawField* Clone(const Class& new_owner) const; | 2922 RawField* Clone(const Class& new_owner) const; |
2907 | 2923 |
2908 static intptr_t instance_field_offset() { | 2924 static intptr_t instance_field_offset() { |
2909 return OFFSET_OF(RawField, value_.offset_); | 2925 return OFFSET_OF(RawField, value_.offset_); |
2910 } | 2926 } |
2911 static intptr_t static_value_offset() { | 2927 static intptr_t static_value_offset() { |
2912 return OFFSET_OF(RawField, value_.static_value_); | 2928 return OFFSET_OF(RawField, value_.static_value_); |
2913 } | 2929 } |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3082 void set_name(const String& value) const; | 3098 void set_name(const String& value) const; |
3083 void set_is_static(bool is_static) const { | 3099 void set_is_static(bool is_static) const { |
3084 set_kind_bits(StaticBit::update(is_static, raw_ptr()->kind_bits_)); | 3100 set_kind_bits(StaticBit::update(is_static, raw_ptr()->kind_bits_)); |
3085 } | 3101 } |
3086 void set_is_final(bool is_final) const { | 3102 void set_is_final(bool is_final) const { |
3087 set_kind_bits(FinalBit::update(is_final, raw_ptr()->kind_bits_)); | 3103 set_kind_bits(FinalBit::update(is_final, raw_ptr()->kind_bits_)); |
3088 } | 3104 } |
3089 void set_is_const(bool value) const { | 3105 void set_is_const(bool value) const { |
3090 set_kind_bits(ConstBit::update(value, raw_ptr()->kind_bits_)); | 3106 set_kind_bits(ConstBit::update(value, raw_ptr()->kind_bits_)); |
3091 } | 3107 } |
3092 void set_is_reflectable(bool value) const { | |
3093 set_kind_bits(ReflectableBit::update(value, raw_ptr()->kind_bits_)); | |
3094 } | |
3095 void set_owner(const Object& value) const { | 3108 void set_owner(const Object& value) const { |
3096 StorePointer(&raw_ptr()->owner_, value.raw()); | 3109 StorePointer(&raw_ptr()->owner_, value.raw()); |
3097 } | 3110 } |
3098 void set_token_pos(intptr_t token_pos) const { | 3111 void set_token_pos(intptr_t token_pos) const { |
3099 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); | 3112 StoreNonPointer(&raw_ptr()->token_pos_, token_pos); |
3100 } | 3113 } |
3101 void set_kind_bits(intptr_t value) const { | 3114 void set_kind_bits(intptr_t value) const { |
3102 StoreNonPointer(&raw_ptr()->kind_bits_, static_cast<uint8_t>(value)); | 3115 StoreNonPointer(&raw_ptr()->kind_bits_, static_cast<uint8_t>(value)); |
3103 } | 3116 } |
3104 | 3117 |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3310 | 3323 |
3311 friend class ClassDictionaryIterator; | 3324 friend class ClassDictionaryIterator; |
3312 friend class LibraryPrefixIterator; | 3325 friend class LibraryPrefixIterator; |
3313 DISALLOW_COPY_AND_ASSIGN(DictionaryIterator); | 3326 DISALLOW_COPY_AND_ASSIGN(DictionaryIterator); |
3314 }; | 3327 }; |
3315 | 3328 |
3316 | 3329 |
3317 class ClassDictionaryIterator : public DictionaryIterator { | 3330 class ClassDictionaryIterator : public DictionaryIterator { |
3318 public: | 3331 public: |
3319 enum IterationKind { | 3332 enum IterationKind { |
| 3333 // TODO(hausner): fix call sites that use kIteratePrivate. There is only |
| 3334 // one top-level class per library left, not an array to iterate over. |
3320 kIteratePrivate, | 3335 kIteratePrivate, |
3321 kNoIteratePrivate | 3336 kNoIteratePrivate |
3322 }; | 3337 }; |
3323 | 3338 |
3324 ClassDictionaryIterator(const Library& library, | 3339 ClassDictionaryIterator(const Library& library, |
3325 IterationKind kind = kNoIteratePrivate); | 3340 IterationKind kind = kNoIteratePrivate); |
3326 | 3341 |
3327 bool HasNext() const { return (next_ix_ < size_) || (anon_ix_ < anon_size_); } | 3342 bool HasNext() const { |
| 3343 return (next_ix_ < size_) || !toplevel_class_.IsNull(); |
| 3344 } |
3328 | 3345 |
3329 // Returns a non-null raw class. | 3346 // Returns a non-null raw class. |
3330 RawClass* GetNextClass(); | 3347 RawClass* GetNextClass(); |
3331 | 3348 |
3332 private: | 3349 private: |
3333 void MoveToNextClass(); | 3350 void MoveToNextClass(); |
3334 | 3351 |
3335 const Array& anon_array_; | 3352 Class& toplevel_class_; |
3336 const int anon_size_; // Number of anonymous classes to iterate over. | |
3337 int anon_ix_; // Index of next anonymous class. | |
3338 | 3353 |
3339 DISALLOW_COPY_AND_ASSIGN(ClassDictionaryIterator); | 3354 DISALLOW_COPY_AND_ASSIGN(ClassDictionaryIterator); |
3340 }; | 3355 }; |
3341 | 3356 |
3342 | 3357 |
3343 class LibraryPrefixIterator : public DictionaryIterator { | 3358 class LibraryPrefixIterator : public DictionaryIterator { |
3344 public: | 3359 public: |
3345 explicit LibraryPrefixIterator(const Library& library); | 3360 explicit LibraryPrefixIterator(const Library& library); |
3346 RawLibraryPrefix* GetNext(); | 3361 RawLibraryPrefix* GetNext(); |
3347 private: | 3362 private: |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3423 // If the local dictionary contains no entry for these names, | 3438 // If the local dictionary contains no entry for these names, |
3424 // look in the scopes of all libraries that are imported | 3439 // look in the scopes of all libraries that are imported |
3425 // without a library prefix. | 3440 // without a library prefix. |
3426 RawObject* ResolveName(const String& name) const; | 3441 RawObject* ResolveName(const String& name) const; |
3427 | 3442 |
3428 void AddAnonymousClass(const Class& cls) const; | 3443 void AddAnonymousClass(const Class& cls) const; |
3429 | 3444 |
3430 void AddExport(const Namespace& ns) const; | 3445 void AddExport(const Namespace& ns) const; |
3431 | 3446 |
3432 void AddClassMetadata(const Class& cls, | 3447 void AddClassMetadata(const Class& cls, |
3433 const Class& toplevel_class, | 3448 const Object& tl_owner, |
3434 intptr_t token_pos) const; | 3449 intptr_t token_pos) const; |
3435 void AddFieldMetadata(const Field& field, intptr_t token_pos) const; | 3450 void AddFieldMetadata(const Field& field, intptr_t token_pos) const; |
3436 void AddFunctionMetadata(const Function& func, intptr_t token_pos) const; | 3451 void AddFunctionMetadata(const Function& func, intptr_t token_pos) const; |
3437 void AddLibraryMetadata(const Class& cls, intptr_t token_pos) const; | 3452 void AddLibraryMetadata(const Object& tl_owner, intptr_t token_pos) const; |
3438 void AddTypeParameterMetadata(const TypeParameter& param, | 3453 void AddTypeParameterMetadata(const TypeParameter& param, |
3439 intptr_t token_pos) const; | 3454 intptr_t token_pos) const; |
3440 RawObject* GetMetadata(const Object& obj) const; | 3455 RawObject* GetMetadata(const Object& obj) const; |
3441 | 3456 |
3442 intptr_t num_anonymous_classes() const { return raw_ptr()->num_anonymous_; } | 3457 RawClass* toplevel_class() const { |
3443 RawArray* anonymous_classes() const { return raw_ptr()->anonymous_classes_; } | 3458 return raw_ptr()->toplevel_class_; |
| 3459 } |
| 3460 void set_toplevel_class(const Class& value) const; |
3444 | 3461 |
3445 RawGrowableObjectArray* patch_classes() const { | 3462 RawGrowableObjectArray* patch_classes() const { |
3446 return raw_ptr()->patch_classes_; | 3463 return raw_ptr()->patch_classes_; |
3447 } | 3464 } |
3448 | 3465 |
3449 // Library imports. | 3466 // Library imports. |
3450 RawArray* imports() const { return raw_ptr()->imports_; } | 3467 RawArray* imports() const { return raw_ptr()->imports_; } |
3451 RawArray* exports() const { return raw_ptr()->exports_; } | 3468 RawArray* exports() const { return raw_ptr()->exports_; } |
3452 void AddImport(const Namespace& ns) const; | 3469 void AddImport(const Namespace& ns) const; |
3453 intptr_t num_imports() const { return raw_ptr()->num_imports_; } | 3470 intptr_t num_imports() const { return raw_ptr()->num_imports_; } |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3581 void GrowDictionary(const Array& dict, intptr_t dict_size) const; | 3598 void GrowDictionary(const Array& dict, intptr_t dict_size) const; |
3582 static RawLibrary* NewLibraryHelper(const String& url, | 3599 static RawLibrary* NewLibraryHelper(const String& url, |
3583 bool import_core_lib); | 3600 bool import_core_lib); |
3584 RawObject* LookupEntry(const String& name, intptr_t *index) const; | 3601 RawObject* LookupEntry(const String& name, intptr_t *index) const; |
3585 | 3602 |
3586 static bool IsKeyUsed(intptr_t key); | 3603 static bool IsKeyUsed(intptr_t key); |
3587 void AllocatePrivateKey() const; | 3604 void AllocatePrivateKey() const; |
3588 | 3605 |
3589 RawString* MakeMetadataName(const Object& obj) const; | 3606 RawString* MakeMetadataName(const Object& obj) const; |
3590 RawField* GetMetadataField(const String& metaname) const; | 3607 RawField* GetMetadataField(const String& metaname) const; |
3591 void AddMetadata(const Class& cls, | 3608 void AddMetadata(const Object& owner, |
3592 const String& name, | 3609 const String& name, |
3593 intptr_t token_pos) const; | 3610 intptr_t token_pos) const; |
3594 | 3611 |
3595 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); | 3612 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); |
3596 | 3613 |
3597 friend class Bootstrap; | 3614 friend class Bootstrap; |
3598 friend class Class; | 3615 friend class Class; |
3599 friend class Debugger; | 3616 friend class Debugger; |
3600 friend class DictionaryIterator; | 3617 friend class DictionaryIterator; |
3601 friend class Namespace; | 3618 friend class Namespace; |
3602 friend class Object; | 3619 friend class Object; |
3603 }; | 3620 }; |
3604 | 3621 |
3605 | 3622 |
3606 // A Namespace contains the names in a library dictionary, filtered by | 3623 // A Namespace contains the names in a library dictionary, filtered by |
3607 // the show/hide combinators. | 3624 // the show/hide combinators. |
3608 class Namespace : public Object { | 3625 class Namespace : public Object { |
3609 public: | 3626 public: |
3610 RawLibrary* library() const { return raw_ptr()->library_; } | 3627 RawLibrary* library() const { return raw_ptr()->library_; } |
3611 RawArray* show_names() const { return raw_ptr()->show_names_; } | 3628 RawArray* show_names() const { return raw_ptr()->show_names_; } |
3612 RawArray* hide_names() const { return raw_ptr()->hide_names_; } | 3629 RawArray* hide_names() const { return raw_ptr()->hide_names_; } |
3613 | 3630 |
3614 void AddMetadata(intptr_t token_pos, const Class& owner_class); | 3631 void AddMetadata(const Object& owner, intptr_t token_pos); |
3615 RawObject* GetMetadata() const; | 3632 RawObject* GetMetadata() const; |
3616 | 3633 |
3617 static intptr_t InstanceSize() { | 3634 static intptr_t InstanceSize() { |
3618 return RoundedAllocationSize(sizeof(RawNamespace)); | 3635 return RoundedAllocationSize(sizeof(RawNamespace)); |
3619 } | 3636 } |
3620 | 3637 |
3621 bool HidesName(const String& name) const; | 3638 bool HidesName(const String& name) const; |
3622 RawObject* Lookup(const String& name) const; | 3639 RawObject* Lookup(const String& name) const; |
3623 | 3640 |
3624 static RawNamespace* New(const Library& library, | 3641 static RawNamespace* New(const Library& library, |
(...skipping 4575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8200 | 8217 |
8201 | 8218 |
8202 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 8219 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
8203 intptr_t index) { | 8220 intptr_t index) { |
8204 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 8221 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
8205 } | 8222 } |
8206 | 8223 |
8207 } // namespace dart | 8224 } // namespace dart |
8208 | 8225 |
8209 #endif // VM_OBJECT_H_ | 8226 #endif // VM_OBJECT_H_ |
OLD | NEW |