| 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" |
| 11 #include "vm/json_stream.h" | |
| 12 #include "vm/bitmap.h" | 11 #include "vm/bitmap.h" |
| 13 #include "vm/dart.h" | 12 #include "vm/dart.h" |
| 14 #include "vm/flags.h" | 13 #include "vm/flags.h" |
| 15 #include "vm/globals.h" | 14 #include "vm/globals.h" |
| 16 #include "vm/growable_array.h" | 15 #include "vm/growable_array.h" |
| 17 #include "vm/handles.h" | 16 #include "vm/handles.h" |
| 18 #include "vm/heap.h" | 17 #include "vm/heap.h" |
| 19 #include "vm/isolate.h" | 18 #include "vm/isolate.h" |
| 19 #include "vm/json_stream.h" |
| 20 #include "vm/method_recognizer.h" | 20 #include "vm/method_recognizer.h" |
| 21 #include "vm/os.h" | 21 #include "vm/os.h" |
| 22 #include "vm/raw_object.h" | 22 #include "vm/raw_object.h" |
| 23 #include "vm/report.h" | 23 #include "vm/report.h" |
| 24 #include "vm/scanner.h" | 24 #include "vm/scanner.h" |
| 25 #include "vm/tags.h" | 25 #include "vm/tags.h" |
| 26 #include "vm/thread.h" | 26 #include "vm/thread.h" |
| 27 #include "vm/token_position.h" | 27 #include "vm/token_position.h" |
| 28 | 28 |
| 29 namespace dart { | 29 namespace dart { |
| 30 | 30 |
| 31 // Forward declarations. | 31 // Forward declarations. |
| 32 namespace kernel { | 32 namespace kernel { |
| 33 class Program; | 33 class Program; |
| 34 class TreeNode; | 34 class TreeNode; |
| 35 } | 35 } // namespace kernel |
| 36 | 36 |
| 37 #define DEFINE_FORWARD_DECLARATION(clazz) class clazz; | 37 #define DEFINE_FORWARD_DECLARATION(clazz) class clazz; |
| 38 CLASS_LIST(DEFINE_FORWARD_DECLARATION) | 38 CLASS_LIST(DEFINE_FORWARD_DECLARATION) |
| 39 #undef DEFINE_FORWARD_DECLARATION | 39 #undef DEFINE_FORWARD_DECLARATION |
| 40 class Api; | 40 class Api; |
| 41 class ArgumentsDescriptor; | 41 class ArgumentsDescriptor; |
| 42 class Assembler; | 42 class Assembler; |
| 43 class Closure; | 43 class Closure; |
| 44 class Code; | 44 class Code; |
| 45 class DisassemblyFormatter; | 45 class DisassemblyFormatter; |
| (...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 | 841 |
| 842 #define REUSABLE_FRIEND_DECLARATION(name) \ | 842 #define REUSABLE_FRIEND_DECLARATION(name) \ |
| 843 friend class Reusable##name##HandleScope; | 843 friend class Reusable##name##HandleScope; |
| 844 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) | 844 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) |
| 845 #undef REUSABLE_FRIEND_DECLARATION | 845 #undef REUSABLE_FRIEND_DECLARATION |
| 846 | 846 |
| 847 DISALLOW_ALLOCATION(); | 847 DISALLOW_ALLOCATION(); |
| 848 DISALLOW_COPY_AND_ASSIGN(Object); | 848 DISALLOW_COPY_AND_ASSIGN(Object); |
| 849 }; | 849 }; |
| 850 | 850 |
| 851 | |
| 852 class PassiveObject : public Object { | 851 class PassiveObject : public Object { |
| 853 public: | 852 public: |
| 854 void operator=(RawObject* value) { raw_ = value; } | 853 void operator=(RawObject* value) { raw_ = value; } |
| 855 void operator^=(RawObject* value) { raw_ = value; } | 854 void operator^=(RawObject* value) { raw_ = value; } |
| 856 | 855 |
| 857 static PassiveObject& Handle(Zone* zone, RawObject* raw_ptr) { | 856 static PassiveObject& Handle(Zone* zone, RawObject* raw_ptr) { |
| 858 PassiveObject* obj = | 857 PassiveObject* obj = |
| 859 reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(zone)); | 858 reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(zone)); |
| 860 obj->raw_ = raw_ptr; | 859 obj->raw_ = raw_ptr; |
| 861 obj->set_vtable(0); | 860 obj->set_vtable(0); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 886 static PassiveObject& ZoneHandle(Zone* zone) { | 885 static PassiveObject& ZoneHandle(Zone* zone) { |
| 887 return ZoneHandle(zone, Object::null()); | 886 return ZoneHandle(zone, Object::null()); |
| 888 } | 887 } |
| 889 | 888 |
| 890 private: | 889 private: |
| 891 PassiveObject() : Object() {} | 890 PassiveObject() : Object() {} |
| 892 DISALLOW_ALLOCATION(); | 891 DISALLOW_ALLOCATION(); |
| 893 DISALLOW_COPY_AND_ASSIGN(PassiveObject); | 892 DISALLOW_COPY_AND_ASSIGN(PassiveObject); |
| 894 }; | 893 }; |
| 895 | 894 |
| 896 | |
| 897 typedef ZoneGrowableHandlePtrArray<const AbstractType> Trail; | 895 typedef ZoneGrowableHandlePtrArray<const AbstractType> Trail; |
| 898 typedef ZoneGrowableHandlePtrArray<const AbstractType>* TrailPtr; | 896 typedef ZoneGrowableHandlePtrArray<const AbstractType>* TrailPtr; |
| 899 | 897 |
| 900 | |
| 901 class Class : public Object { | 898 class Class : public Object { |
| 902 public: | 899 public: |
| 903 intptr_t instance_size() const { | 900 intptr_t instance_size() const { |
| 904 ASSERT(is_finalized() || is_prefinalized()); | 901 ASSERT(is_finalized() || is_prefinalized()); |
| 905 return (raw_ptr()->instance_size_in_words_ * kWordSize); | 902 return (raw_ptr()->instance_size_in_words_ * kWordSize); |
| 906 } | 903 } |
| 907 void set_instance_size(intptr_t value_in_bytes) const { | 904 void set_instance_size(intptr_t value_in_bytes) const { |
| 908 ASSERT(kWordSize != 0); | 905 ASSERT(kWordSize != 0); |
| 909 set_instance_size_in_words(value_in_bytes / kWordSize); | 906 set_instance_size_in_words(value_in_bytes / kWordSize); |
| 910 } | 907 } |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1529 | 1526 |
| 1530 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); | 1527 FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object); |
| 1531 friend class AbstractType; | 1528 friend class AbstractType; |
| 1532 friend class Instance; | 1529 friend class Instance; |
| 1533 friend class Object; | 1530 friend class Object; |
| 1534 friend class Type; | 1531 friend class Type; |
| 1535 friend class Intrinsifier; | 1532 friend class Intrinsifier; |
| 1536 friend class ProgramVisitor; | 1533 friend class ProgramVisitor; |
| 1537 }; | 1534 }; |
| 1538 | 1535 |
| 1539 | |
| 1540 // Unresolved class is used for storing unresolved names which will be resolved | 1536 // Unresolved class is used for storing unresolved names which will be resolved |
| 1541 // to a class after all classes have been loaded and finalized. | 1537 // to a class after all classes have been loaded and finalized. |
| 1542 class UnresolvedClass : public Object { | 1538 class UnresolvedClass : public Object { |
| 1543 public: | 1539 public: |
| 1544 RawObject* library_or_library_prefix() const { | 1540 RawObject* library_or_library_prefix() const { |
| 1545 return raw_ptr()->library_or_library_prefix_; | 1541 return raw_ptr()->library_or_library_prefix_; |
| 1546 } | 1542 } |
| 1547 RawString* ident() const { return raw_ptr()->ident_; } | 1543 RawString* ident() const { return raw_ptr()->ident_; } |
| 1548 TokenPosition token_pos() const { return raw_ptr()->token_pos_; } | 1544 TokenPosition token_pos() const { return raw_ptr()->token_pos_; } |
| 1549 | 1545 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1561 void set_library_or_library_prefix(const Object& library_prefix) const; | 1557 void set_library_or_library_prefix(const Object& library_prefix) const; |
| 1562 void set_ident(const String& ident) const; | 1558 void set_ident(const String& ident) const; |
| 1563 void set_token_pos(TokenPosition token_pos) const; | 1559 void set_token_pos(TokenPosition token_pos) const; |
| 1564 | 1560 |
| 1565 static RawUnresolvedClass* New(); | 1561 static RawUnresolvedClass* New(); |
| 1566 | 1562 |
| 1567 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object); | 1563 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object); |
| 1568 friend class Class; | 1564 friend class Class; |
| 1569 }; | 1565 }; |
| 1570 | 1566 |
| 1571 | |
| 1572 // Classification of type genericity according to type parameter owners. | 1567 // Classification of type genericity according to type parameter owners. |
| 1573 enum Genericity { | 1568 enum Genericity { |
| 1574 kAny, // Consider type params of current class and functions. | 1569 kAny, // Consider type params of current class and functions. |
| 1575 kCurrentClass, // Consider type params of current class only. | 1570 kCurrentClass, // Consider type params of current class only. |
| 1576 kFunctions, // Consider type params of current and parent functions. | 1571 kFunctions, // Consider type params of current and parent functions. |
| 1577 }; | 1572 }; |
| 1578 | 1573 |
| 1579 | |
| 1580 // A TypeArguments is an array of AbstractType. | 1574 // A TypeArguments is an array of AbstractType. |
| 1581 class TypeArguments : public Object { | 1575 class TypeArguments : public Object { |
| 1582 public: | 1576 public: |
| 1583 // We use 30 bits for the hash code so hashes in a snapshot taken on a | 1577 // We use 30 bits for the hash code so hashes in a snapshot taken on a |
| 1584 // 64-bit architecture stay in Smi range when loaded on a 32-bit | 1578 // 64-bit architecture stay in Smi range when loaded on a 32-bit |
| 1585 // architecture. | 1579 // architecture. |
| 1586 static const intptr_t kHashBits = 30; | 1580 static const intptr_t kHashBits = 30; |
| 1587 | 1581 |
| 1588 intptr_t Length() const; | 1582 intptr_t Length() const; |
| 1589 RawAbstractType* TypeAt(intptr_t index) const; | 1583 RawAbstractType* TypeAt(intptr_t index) const; |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1784 // Number of fields in the raw object=3 (instantiations_, length_ and hash_). | 1778 // Number of fields in the raw object=3 (instantiations_, length_ and hash_). |
| 1785 static const int kNumFields = 3; | 1779 static const int kNumFields = 3; |
| 1786 | 1780 |
| 1787 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); | 1781 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeArguments, Object); |
| 1788 friend class AbstractType; | 1782 friend class AbstractType; |
| 1789 friend class Class; | 1783 friend class Class; |
| 1790 friend class ClearTypeHashVisitor; | 1784 friend class ClearTypeHashVisitor; |
| 1791 friend class Object; | 1785 friend class Object; |
| 1792 }; | 1786 }; |
| 1793 | 1787 |
| 1794 | |
| 1795 class PatchClass : public Object { | 1788 class PatchClass : public Object { |
| 1796 public: | 1789 public: |
| 1797 RawClass* patched_class() const { return raw_ptr()->patched_class_; } | 1790 RawClass* patched_class() const { return raw_ptr()->patched_class_; } |
| 1798 RawClass* origin_class() const { return raw_ptr()->origin_class_; } | 1791 RawClass* origin_class() const { return raw_ptr()->origin_class_; } |
| 1799 RawScript* script() const { return raw_ptr()->script_; } | 1792 RawScript* script() const { return raw_ptr()->script_; } |
| 1800 | 1793 |
| 1801 static intptr_t InstanceSize() { | 1794 static intptr_t InstanceSize() { |
| 1802 return RoundedAllocationSize(sizeof(RawPatchClass)); | 1795 return RoundedAllocationSize(sizeof(RawPatchClass)); |
| 1803 } | 1796 } |
| 1804 static bool IsInFullSnapshot(RawPatchClass* cls) { | 1797 static bool IsInFullSnapshot(RawPatchClass* cls) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1815 void set_patched_class(const Class& value) const; | 1808 void set_patched_class(const Class& value) const; |
| 1816 void set_origin_class(const Class& value) const; | 1809 void set_origin_class(const Class& value) const; |
| 1817 void set_script(const Script& value) const; | 1810 void set_script(const Script& value) const; |
| 1818 | 1811 |
| 1819 static RawPatchClass* New(); | 1812 static RawPatchClass* New(); |
| 1820 | 1813 |
| 1821 FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object); | 1814 FINAL_HEAP_OBJECT_IMPLEMENTATION(PatchClass, Object); |
| 1822 friend class Class; | 1815 friend class Class; |
| 1823 }; | 1816 }; |
| 1824 | 1817 |
| 1825 | |
| 1826 class SingleTargetCache : public Object { | 1818 class SingleTargetCache : public Object { |
| 1827 public: | 1819 public: |
| 1828 RawCode* target() const { return raw_ptr()->target_; } | 1820 RawCode* target() const { return raw_ptr()->target_; } |
| 1829 void set_target(const Code& target) const; | 1821 void set_target(const Code& target) const; |
| 1830 static intptr_t target_offset() { | 1822 static intptr_t target_offset() { |
| 1831 return OFFSET_OF(RawSingleTargetCache, target_); | 1823 return OFFSET_OF(RawSingleTargetCache, target_); |
| 1832 } | 1824 } |
| 1833 | 1825 |
| 1834 #define DEFINE_NON_POINTER_FIELD_ACCESSORS(type, name) \ | 1826 #define DEFINE_NON_POINTER_FIELD_ACCESSORS(type, name) \ |
| 1835 type name() const { return raw_ptr()->name##_; } \ | 1827 type name() const { return raw_ptr()->name##_; } \ |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1849 return RoundedAllocationSize(sizeof(RawSingleTargetCache)); | 1841 return RoundedAllocationSize(sizeof(RawSingleTargetCache)); |
| 1850 } | 1842 } |
| 1851 | 1843 |
| 1852 static RawSingleTargetCache* New(); | 1844 static RawSingleTargetCache* New(); |
| 1853 | 1845 |
| 1854 private: | 1846 private: |
| 1855 FINAL_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache, Object); | 1847 FINAL_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache, Object); |
| 1856 friend class Class; | 1848 friend class Class; |
| 1857 }; | 1849 }; |
| 1858 | 1850 |
| 1859 | |
| 1860 class UnlinkedCall : public Object { | 1851 class UnlinkedCall : public Object { |
| 1861 public: | 1852 public: |
| 1862 RawString* target_name() const { return raw_ptr()->target_name_; } | 1853 RawString* target_name() const { return raw_ptr()->target_name_; } |
| 1863 void set_target_name(const String& target_name) const; | 1854 void set_target_name(const String& target_name) const; |
| 1864 RawArray* args_descriptor() const { return raw_ptr()->args_descriptor_; } | 1855 RawArray* args_descriptor() const { return raw_ptr()->args_descriptor_; } |
| 1865 void set_args_descriptor(const Array& args_descriptor) const; | 1856 void set_args_descriptor(const Array& args_descriptor) const; |
| 1866 | 1857 |
| 1867 static intptr_t InstanceSize() { | 1858 static intptr_t InstanceSize() { |
| 1868 return RoundedAllocationSize(sizeof(RawUnlinkedCall)); | 1859 return RoundedAllocationSize(sizeof(RawUnlinkedCall)); |
| 1869 } | 1860 } |
| 1870 | 1861 |
| 1871 static RawUnlinkedCall* New(); | 1862 static RawUnlinkedCall* New(); |
| 1872 | 1863 |
| 1873 private: | 1864 private: |
| 1874 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall, Object); | 1865 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall, Object); |
| 1875 friend class Class; | 1866 friend class Class; |
| 1876 }; | 1867 }; |
| 1877 | 1868 |
| 1878 | |
| 1879 // Object holding information about an IC: test classes and their | 1869 // Object holding information about an IC: test classes and their |
| 1880 // corresponding targets. The owner of the ICData can be either the function | 1870 // corresponding targets. The owner of the ICData can be either the function |
| 1881 // or the original ICData object. In case of background compilation we | 1871 // or the original ICData object. In case of background compilation we |
| 1882 // copy the ICData in a child object, thus freezing it during background | 1872 // copy the ICData in a child object, thus freezing it during background |
| 1883 // compilation. Code may contain only original ICData objects. | 1873 // compilation. Code may contain only original ICData objects. |
| 1884 class ICData : public Object { | 1874 class ICData : public Object { |
| 1885 public: | 1875 public: |
| 1886 RawFunction* Owner() const; | 1876 RawFunction* Owner() const; |
| 1887 | 1877 |
| 1888 RawICData* Original() const; | 1878 RawICData* Original() const; |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2190 // A cache of VM heap allocated preinitialized empty ic data entry arrays. | 2180 // A cache of VM heap allocated preinitialized empty ic data entry arrays. |
| 2191 static RawArray* cached_icdata_arrays_[kCachedICDataArrayCount]; | 2181 static RawArray* cached_icdata_arrays_[kCachedICDataArrayCount]; |
| 2192 | 2182 |
| 2193 FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object); | 2183 FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object); |
| 2194 friend class Class; | 2184 friend class Class; |
| 2195 friend class SnapshotWriter; | 2185 friend class SnapshotWriter; |
| 2196 friend class Serializer; | 2186 friend class Serializer; |
| 2197 friend class Deserializer; | 2187 friend class Deserializer; |
| 2198 }; | 2188 }; |
| 2199 | 2189 |
| 2200 | |
| 2201 class Function : public Object { | 2190 class Function : public Object { |
| 2202 public: | 2191 public: |
| 2203 RawString* name() const { return raw_ptr()->name_; } | 2192 RawString* name() const { return raw_ptr()->name_; } |
| 2204 RawString* UserVisibleName() const; // Same as scrubbed name. | 2193 RawString* UserVisibleName() const; // Same as scrubbed name. |
| 2205 RawString* QualifiedScrubbedName() const { | 2194 RawString* QualifiedScrubbedName() const { |
| 2206 return QualifiedName(kScrubbedName); | 2195 return QualifiedName(kScrubbedName); |
| 2207 } | 2196 } |
| 2208 RawString* QualifiedUserVisibleName() const { | 2197 RawString* QualifiedUserVisibleName() const { |
| 2209 return QualifiedName(kUserVisibleName); | 2198 return QualifiedName(kUserVisibleName); |
| 2210 } | 2199 } |
| (...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3055 FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object); | 3044 FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object); |
| 3056 friend class Class; | 3045 friend class Class; |
| 3057 friend class SnapshotWriter; | 3046 friend class SnapshotWriter; |
| 3058 friend class Parser; // For set_eval_script. | 3047 friend class Parser; // For set_eval_script. |
| 3059 // RawFunction::VisitFunctionPointers accesses the private constructor of | 3048 // RawFunction::VisitFunctionPointers accesses the private constructor of |
| 3060 // Function. | 3049 // Function. |
| 3061 friend class RawFunction; | 3050 friend class RawFunction; |
| 3062 friend class ClassFinalizer; // To reset parent_function. | 3051 friend class ClassFinalizer; // To reset parent_function. |
| 3063 }; | 3052 }; |
| 3064 | 3053 |
| 3065 | |
| 3066 class ClosureData : public Object { | 3054 class ClosureData : public Object { |
| 3067 public: | 3055 public: |
| 3068 static intptr_t InstanceSize() { | 3056 static intptr_t InstanceSize() { |
| 3069 return RoundedAllocationSize(sizeof(RawClosureData)); | 3057 return RoundedAllocationSize(sizeof(RawClosureData)); |
| 3070 } | 3058 } |
| 3071 | 3059 |
| 3072 private: | 3060 private: |
| 3073 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } | 3061 RawContextScope* context_scope() const { return raw_ptr()->context_scope_; } |
| 3074 void set_context_scope(const ContextScope& value) const; | 3062 void set_context_scope(const ContextScope& value) const; |
| 3075 | 3063 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3088 void set_hash(intptr_t value) const; | 3076 void set_hash(intptr_t value) const; |
| 3089 | 3077 |
| 3090 static RawClosureData* New(); | 3078 static RawClosureData* New(); |
| 3091 | 3079 |
| 3092 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); | 3080 FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object); |
| 3093 friend class Class; | 3081 friend class Class; |
| 3094 friend class Function; | 3082 friend class Function; |
| 3095 friend class HeapProfiler; | 3083 friend class HeapProfiler; |
| 3096 }; | 3084 }; |
| 3097 | 3085 |
| 3098 | |
| 3099 class SignatureData : public Object { | 3086 class SignatureData : public Object { |
| 3100 public: | 3087 public: |
| 3101 static intptr_t InstanceSize() { | 3088 static intptr_t InstanceSize() { |
| 3102 return RoundedAllocationSize(sizeof(RawSignatureData)); | 3089 return RoundedAllocationSize(sizeof(RawSignatureData)); |
| 3103 } | 3090 } |
| 3104 | 3091 |
| 3105 private: | 3092 private: |
| 3106 // Enclosing function of this signature function. | 3093 // Enclosing function of this signature function. |
| 3107 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } | 3094 RawFunction* parent_function() const { return raw_ptr()->parent_function_; } |
| 3108 void set_parent_function(const Function& value) const; | 3095 void set_parent_function(const Function& value) const; |
| 3109 | 3096 |
| 3110 // Signature type of this signature function. | 3097 // Signature type of this signature function. |
| 3111 RawType* signature_type() const { return raw_ptr()->signature_type_; } | 3098 RawType* signature_type() const { return raw_ptr()->signature_type_; } |
| 3112 void set_signature_type(const Type& value) const; | 3099 void set_signature_type(const Type& value) const; |
| 3113 | 3100 |
| 3114 static RawSignatureData* New(Heap::Space space = Heap::kOld); | 3101 static RawSignatureData* New(Heap::Space space = Heap::kOld); |
| 3115 | 3102 |
| 3116 FINAL_HEAP_OBJECT_IMPLEMENTATION(SignatureData, Object); | 3103 FINAL_HEAP_OBJECT_IMPLEMENTATION(SignatureData, Object); |
| 3117 friend class Class; | 3104 friend class Class; |
| 3118 friend class Function; | 3105 friend class Function; |
| 3119 friend class HeapProfiler; | 3106 friend class HeapProfiler; |
| 3120 }; | 3107 }; |
| 3121 | 3108 |
| 3122 | |
| 3123 class RedirectionData : public Object { | 3109 class RedirectionData : public Object { |
| 3124 public: | 3110 public: |
| 3125 static intptr_t InstanceSize() { | 3111 static intptr_t InstanceSize() { |
| 3126 return RoundedAllocationSize(sizeof(RawRedirectionData)); | 3112 return RoundedAllocationSize(sizeof(RawRedirectionData)); |
| 3127 } | 3113 } |
| 3128 | 3114 |
| 3129 private: | 3115 private: |
| 3130 // The type specifies the class and type arguments of the target constructor. | 3116 // The type specifies the class and type arguments of the target constructor. |
| 3131 RawType* type() const { return raw_ptr()->type_; } | 3117 RawType* type() const { return raw_ptr()->type_; } |
| 3132 void set_type(const Type& value) const; | 3118 void set_type(const Type& value) const; |
| 3133 | 3119 |
| 3134 // The optional identifier specifies a named constructor. | 3120 // The optional identifier specifies a named constructor. |
| 3135 RawString* identifier() const { return raw_ptr()->identifier_; } | 3121 RawString* identifier() const { return raw_ptr()->identifier_; } |
| 3136 void set_identifier(const String& value) const; | 3122 void set_identifier(const String& value) const; |
| 3137 | 3123 |
| 3138 // The resolved constructor or factory target of the redirection. | 3124 // The resolved constructor or factory target of the redirection. |
| 3139 RawFunction* target() const { return raw_ptr()->target_; } | 3125 RawFunction* target() const { return raw_ptr()->target_; } |
| 3140 void set_target(const Function& value) const; | 3126 void set_target(const Function& value) const; |
| 3141 | 3127 |
| 3142 static RawRedirectionData* New(); | 3128 static RawRedirectionData* New(); |
| 3143 | 3129 |
| 3144 FINAL_HEAP_OBJECT_IMPLEMENTATION(RedirectionData, Object); | 3130 FINAL_HEAP_OBJECT_IMPLEMENTATION(RedirectionData, Object); |
| 3145 friend class Class; | 3131 friend class Class; |
| 3146 friend class Function; | 3132 friend class Function; |
| 3147 friend class HeapProfiler; | 3133 friend class HeapProfiler; |
| 3148 }; | 3134 }; |
| 3149 | 3135 |
| 3150 | |
| 3151 class Field : public Object { | 3136 class Field : public Object { |
| 3152 public: | 3137 public: |
| 3153 RawField* Original() const; | 3138 RawField* Original() const; |
| 3154 void SetOriginal(const Field& value) const; | 3139 void SetOriginal(const Field& value) const; |
| 3155 bool IsOriginal() const { | 3140 bool IsOriginal() const { |
| 3156 if (IsNull()) { | 3141 if (IsNull()) { |
| 3157 return true; | 3142 return true; |
| 3158 } | 3143 } |
| 3159 NoSafepointScope no_safepoint; | 3144 NoSafepointScope no_safepoint; |
| 3160 return !raw_ptr()->owner_->IsField(); | 3145 return !raw_ptr()->owner_->IsField(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3197 return raw_ptr()->kernel_offset_; | 3182 return raw_ptr()->kernel_offset_; |
| 3198 #endif | 3183 #endif |
| 3199 } | 3184 } |
| 3200 | 3185 |
| 3201 void set_kernel_offset(intptr_t kernel_offset) const { | 3186 void set_kernel_offset(intptr_t kernel_offset) const { |
| 3202 #if !defined(DART_PRECOMPILED_RUNTIME) | 3187 #if !defined(DART_PRECOMPILED_RUNTIME) |
| 3203 StoreNonPointer(&raw_ptr()->kernel_offset_, kernel_offset); | 3188 StoreNonPointer(&raw_ptr()->kernel_offset_, kernel_offset); |
| 3204 #endif | 3189 #endif |
| 3205 } | 3190 } |
| 3206 | 3191 |
| 3207 | |
| 3208 inline intptr_t Offset() const; | 3192 inline intptr_t Offset() const; |
| 3209 // Called during class finalization. | 3193 // Called during class finalization. |
| 3210 inline void SetOffset(intptr_t offset_in_bytes) const; | 3194 inline void SetOffset(intptr_t offset_in_bytes) const; |
| 3211 | 3195 |
| 3212 inline RawInstance* StaticValue() const; | 3196 inline RawInstance* StaticValue() const; |
| 3213 inline void SetStaticValue(const Instance& value, | 3197 inline void SetStaticValue(const Instance& value, |
| 3214 bool save_initial_value = false) const; | 3198 bool save_initial_value = false) const; |
| 3215 | 3199 |
| 3216 RawClass* Owner() const; | 3200 RawClass* Owner() const; |
| 3217 RawClass* Origin() const; // Either mixin class, or same as owner(). | 3201 RawClass* Origin() const; // Either mixin class, or same as owner(). |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3467 | 3451 |
| 3468 static RawField* New(); | 3452 static RawField* New(); |
| 3469 | 3453 |
| 3470 FINAL_HEAP_OBJECT_IMPLEMENTATION(Field, Object); | 3454 FINAL_HEAP_OBJECT_IMPLEMENTATION(Field, Object); |
| 3471 friend class Class; | 3455 friend class Class; |
| 3472 friend class HeapProfiler; | 3456 friend class HeapProfiler; |
| 3473 friend class RawField; | 3457 friend class RawField; |
| 3474 friend class FieldSerializationCluster; | 3458 friend class FieldSerializationCluster; |
| 3475 }; | 3459 }; |
| 3476 | 3460 |
| 3477 | |
| 3478 class LiteralToken : public Object { | 3461 class LiteralToken : public Object { |
| 3479 public: | 3462 public: |
| 3480 Token::Kind kind() const { return raw_ptr()->kind_; } | 3463 Token::Kind kind() const { return raw_ptr()->kind_; } |
| 3481 RawString* literal() const { return raw_ptr()->literal_; } | 3464 RawString* literal() const { return raw_ptr()->literal_; } |
| 3482 RawObject* value() const { return raw_ptr()->value_; } | 3465 RawObject* value() const { return raw_ptr()->value_; } |
| 3483 | 3466 |
| 3484 static intptr_t InstanceSize() { | 3467 static intptr_t InstanceSize() { |
| 3485 return RoundedAllocationSize(sizeof(RawLiteralToken)); | 3468 return RoundedAllocationSize(sizeof(RawLiteralToken)); |
| 3486 } | 3469 } |
| 3487 | 3470 |
| 3488 static RawLiteralToken* New(); | 3471 static RawLiteralToken* New(); |
| 3489 static RawLiteralToken* New(Token::Kind kind, const String& literal); | 3472 static RawLiteralToken* New(Token::Kind kind, const String& literal); |
| 3490 | 3473 |
| 3491 private: | 3474 private: |
| 3492 void set_kind(Token::Kind kind) const { | 3475 void set_kind(Token::Kind kind) const { |
| 3493 StoreNonPointer(&raw_ptr()->kind_, kind); | 3476 StoreNonPointer(&raw_ptr()->kind_, kind); |
| 3494 } | 3477 } |
| 3495 void set_literal(const String& literal) const; | 3478 void set_literal(const String& literal) const; |
| 3496 void set_value(const Object& value) const; | 3479 void set_value(const Object& value) const; |
| 3497 | 3480 |
| 3498 FINAL_HEAP_OBJECT_IMPLEMENTATION(LiteralToken, Object); | 3481 FINAL_HEAP_OBJECT_IMPLEMENTATION(LiteralToken, Object); |
| 3499 friend class Class; | 3482 friend class Class; |
| 3500 }; | 3483 }; |
| 3501 | 3484 |
| 3502 | |
| 3503 class TokenStream : public Object { | 3485 class TokenStream : public Object { |
| 3504 public: | 3486 public: |
| 3505 RawGrowableObjectArray* TokenObjects() const; | 3487 RawGrowableObjectArray* TokenObjects() const; |
| 3506 void SetTokenObjects(const GrowableObjectArray& value) const; | 3488 void SetTokenObjects(const GrowableObjectArray& value) const; |
| 3507 | 3489 |
| 3508 RawExternalTypedData* GetStream() const; | 3490 RawExternalTypedData* GetStream() const; |
| 3509 void SetStream(const ExternalTypedData& stream) const; | 3491 void SetStream(const ExternalTypedData& stream) const; |
| 3510 | 3492 |
| 3511 RawString* GenerateSource() const; | 3493 RawString* GenerateSource() const; |
| 3512 RawString* GenerateSource(TokenPosition start, TokenPosition end) const; | 3494 RawString* GenerateSource(TokenPosition start, TokenPosition end) const; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3581 | 3563 |
| 3582 static RawTokenStream* New(); | 3564 static RawTokenStream* New(); |
| 3583 static void DataFinalizer(void* isolate_callback_data, | 3565 static void DataFinalizer(void* isolate_callback_data, |
| 3584 Dart_WeakPersistentHandle handle, | 3566 Dart_WeakPersistentHandle handle, |
| 3585 void* peer); | 3567 void* peer); |
| 3586 | 3568 |
| 3587 FINAL_HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object); | 3569 FINAL_HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object); |
| 3588 friend class Class; | 3570 friend class Class; |
| 3589 }; | 3571 }; |
| 3590 | 3572 |
| 3591 | |
| 3592 class Script : public Object { | 3573 class Script : public Object { |
| 3593 public: | 3574 public: |
| 3594 RawString* url() const { return raw_ptr()->url_; } | 3575 RawString* url() const { return raw_ptr()->url_; } |
| 3595 | 3576 |
| 3596 // The actual url which was loaded from disk, if provided by the embedder. | 3577 // The actual url which was loaded from disk, if provided by the embedder. |
| 3597 RawString* resolved_url() const { return raw_ptr()->resolved_url_; } | 3578 RawString* resolved_url() const { return raw_ptr()->resolved_url_; } |
| 3598 bool HasSource() const; | 3579 bool HasSource() const; |
| 3599 RawString* Source() const; | 3580 RawString* Source() const; |
| 3600 RawString* GenerateSource() const; // Generates source code from Tokenstream. | 3581 RawString* GenerateSource() const; // Generates source code from Tokenstream. |
| 3601 RawGrowableObjectArray* GenerateLineNumberArray() const; | 3582 RawGrowableObjectArray* GenerateLineNumberArray() const; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3704 RawArray* line_starts() const; | 3685 RawArray* line_starts() const; |
| 3705 RawArray* debug_positions() const; | 3686 RawArray* debug_positions() const; |
| 3706 | 3687 |
| 3707 static RawScript* New(); | 3688 static RawScript* New(); |
| 3708 | 3689 |
| 3709 FINAL_HEAP_OBJECT_IMPLEMENTATION(Script, Object); | 3690 FINAL_HEAP_OBJECT_IMPLEMENTATION(Script, Object); |
| 3710 friend class Class; | 3691 friend class Class; |
| 3711 friend class Precompiler; | 3692 friend class Precompiler; |
| 3712 }; | 3693 }; |
| 3713 | 3694 |
| 3714 | |
| 3715 class DictionaryIterator : public ValueObject { | 3695 class DictionaryIterator : public ValueObject { |
| 3716 public: | 3696 public: |
| 3717 explicit DictionaryIterator(const Library& library); | 3697 explicit DictionaryIterator(const Library& library); |
| 3718 | 3698 |
| 3719 bool HasNext() const { return next_ix_ < size_; } | 3699 bool HasNext() const { return next_ix_ < size_; } |
| 3720 | 3700 |
| 3721 // Returns next non-null raw object. | 3701 // Returns next non-null raw object. |
| 3722 RawObject* GetNext(); | 3702 RawObject* GetNext(); |
| 3723 | 3703 |
| 3724 private: | 3704 private: |
| 3725 void MoveToNextObject(); | 3705 void MoveToNextObject(); |
| 3726 | 3706 |
| 3727 const Array& array_; | 3707 const Array& array_; |
| 3728 const int size_; // Number of elements to iterate over. | 3708 const int size_; // Number of elements to iterate over. |
| 3729 int next_ix_; // Index of next element. | 3709 int next_ix_; // Index of next element. |
| 3730 | 3710 |
| 3731 friend class ClassDictionaryIterator; | 3711 friend class ClassDictionaryIterator; |
| 3732 friend class LibraryPrefixIterator; | 3712 friend class LibraryPrefixIterator; |
| 3733 DISALLOW_COPY_AND_ASSIGN(DictionaryIterator); | 3713 DISALLOW_COPY_AND_ASSIGN(DictionaryIterator); |
| 3734 }; | 3714 }; |
| 3735 | 3715 |
| 3736 | |
| 3737 class ClassDictionaryIterator : public DictionaryIterator { | 3716 class ClassDictionaryIterator : public DictionaryIterator { |
| 3738 public: | 3717 public: |
| 3739 enum IterationKind { | 3718 enum IterationKind { |
| 3740 // TODO(hausner): fix call sites that use kIteratePrivate. There is only | 3719 // TODO(hausner): fix call sites that use kIteratePrivate. There is only |
| 3741 // one top-level class per library left, not an array to iterate over. | 3720 // one top-level class per library left, not an array to iterate over. |
| 3742 kIteratePrivate, | 3721 kIteratePrivate, |
| 3743 kNoIteratePrivate | 3722 kNoIteratePrivate |
| 3744 }; | 3723 }; |
| 3745 | 3724 |
| 3746 ClassDictionaryIterator(const Library& library, | 3725 ClassDictionaryIterator(const Library& library, |
| 3747 IterationKind kind = kNoIteratePrivate); | 3726 IterationKind kind = kNoIteratePrivate); |
| 3748 | 3727 |
| 3749 bool HasNext() const { | 3728 bool HasNext() const { |
| 3750 return (next_ix_ < size_) || !toplevel_class_.IsNull(); | 3729 return (next_ix_ < size_) || !toplevel_class_.IsNull(); |
| 3751 } | 3730 } |
| 3752 | 3731 |
| 3753 // Returns a non-null raw class. | 3732 // Returns a non-null raw class. |
| 3754 RawClass* GetNextClass(); | 3733 RawClass* GetNextClass(); |
| 3755 | 3734 |
| 3756 private: | 3735 private: |
| 3757 void MoveToNextClass(); | 3736 void MoveToNextClass(); |
| 3758 | 3737 |
| 3759 Class& toplevel_class_; | 3738 Class& toplevel_class_; |
| 3760 | 3739 |
| 3761 DISALLOW_COPY_AND_ASSIGN(ClassDictionaryIterator); | 3740 DISALLOW_COPY_AND_ASSIGN(ClassDictionaryIterator); |
| 3762 }; | 3741 }; |
| 3763 | 3742 |
| 3764 | |
| 3765 class LibraryPrefixIterator : public DictionaryIterator { | 3743 class LibraryPrefixIterator : public DictionaryIterator { |
| 3766 public: | 3744 public: |
| 3767 explicit LibraryPrefixIterator(const Library& library); | 3745 explicit LibraryPrefixIterator(const Library& library); |
| 3768 RawLibraryPrefix* GetNext(); | 3746 RawLibraryPrefix* GetNext(); |
| 3769 | 3747 |
| 3770 private: | 3748 private: |
| 3771 void Advance(); | 3749 void Advance(); |
| 3772 DISALLOW_COPY_AND_ASSIGN(LibraryPrefixIterator); | 3750 DISALLOW_COPY_AND_ASSIGN(LibraryPrefixIterator); |
| 3773 }; | 3751 }; |
| 3774 | 3752 |
| 3775 | |
| 3776 class Library : public Object { | 3753 class Library : public Object { |
| 3777 public: | 3754 public: |
| 3778 RawString* name() const { return raw_ptr()->name_; } | 3755 RawString* name() const { return raw_ptr()->name_; } |
| 3779 void SetName(const String& name) const; | 3756 void SetName(const String& name) const; |
| 3780 | 3757 |
| 3781 RawString* url() const { return raw_ptr()->url_; } | 3758 RawString* url() const { return raw_ptr()->url_; } |
| 3782 RawString* private_key() const { return raw_ptr()->private_key_; } | 3759 RawString* private_key() const { return raw_ptr()->private_key_; } |
| 3783 bool LoadNotStarted() const { | 3760 bool LoadNotStarted() const { |
| 3784 return raw_ptr()->load_state_ == RawLibrary::kAllocated; | 3761 return raw_ptr()->load_state_ == RawLibrary::kAllocated; |
| 3785 } | 3762 } |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3972 static void CheckFunctionFingerprints(); | 3949 static void CheckFunctionFingerprints(); |
| 3973 #endif // defined(DART_NO_SNAPSHOT). | 3950 #endif // defined(DART_NO_SNAPSHOT). |
| 3974 | 3951 |
| 3975 static bool IsPrivate(const String& name); | 3952 static bool IsPrivate(const String& name); |
| 3976 // Construct the full name of a corelib member. | 3953 // Construct the full name of a corelib member. |
| 3977 static const String& PrivateCoreLibName(const String& member); | 3954 static const String& PrivateCoreLibName(const String& member); |
| 3978 // Lookup class in the core lib which also contains various VM | 3955 // Lookup class in the core lib which also contains various VM |
| 3979 // helper methods and classes. Allow look up of private classes. | 3956 // helper methods and classes. Allow look up of private classes. |
| 3980 static RawClass* LookupCoreClass(const String& class_name); | 3957 static RawClass* LookupCoreClass(const String& class_name); |
| 3981 | 3958 |
| 3982 | |
| 3983 // Return Function::null() if function does not exist in libs. | 3959 // Return Function::null() if function does not exist in libs. |
| 3984 static RawFunction* GetFunction(const GrowableArray<Library*>& libs, | 3960 static RawFunction* GetFunction(const GrowableArray<Library*>& libs, |
| 3985 const char* class_name, | 3961 const char* class_name, |
| 3986 const char* function_name); | 3962 const char* function_name); |
| 3987 | 3963 |
| 3988 // Character used to indicate a private identifier. | 3964 // Character used to indicate a private identifier. |
| 3989 static const char kPrivateIdentifierStart = '_'; | 3965 static const char kPrivateIdentifierStart = '_'; |
| 3990 | 3966 |
| 3991 // Character used to separate private identifiers from | 3967 // Character used to separate private identifiers from |
| 3992 // the library-specific key. | 3968 // the library-specific key. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 4021 void InvalidateResolvedName(const String& name) const; | 3997 void InvalidateResolvedName(const String& name) const; |
| 4022 void InvalidateResolvedNamesCache() const; | 3998 void InvalidateResolvedNamesCache() const; |
| 4023 | 3999 |
| 4024 RawArray* exported_names() const { return raw_ptr()->exported_names_; } | 4000 RawArray* exported_names() const { return raw_ptr()->exported_names_; } |
| 4025 bool LookupExportedNamesCache(const String& name, Object* obj) const; | 4001 bool LookupExportedNamesCache(const String& name, Object* obj) const; |
| 4026 void AddToExportedNamesCache(const String& name, const Object& obj) const; | 4002 void AddToExportedNamesCache(const String& name, const Object& obj) const; |
| 4027 void InitExportedNamesCache() const; | 4003 void InitExportedNamesCache() const; |
| 4028 void ClearExportedNamesCache() const; | 4004 void ClearExportedNamesCache() const; |
| 4029 static void InvalidateExportedNamesCaches(); | 4005 static void InvalidateExportedNamesCaches(); |
| 4030 | 4006 |
| 4031 | |
| 4032 void InitImportList() const; | 4007 void InitImportList() const; |
| 4033 void RehashDictionary(const Array& old_dict, intptr_t new_dict_size) const; | 4008 void RehashDictionary(const Array& old_dict, intptr_t new_dict_size) const; |
| 4034 static RawLibrary* NewLibraryHelper(const String& url, bool import_core_lib); | 4009 static RawLibrary* NewLibraryHelper(const String& url, bool import_core_lib); |
| 4035 RawObject* LookupEntry(const String& name, intptr_t* index) const; | 4010 RawObject* LookupEntry(const String& name, intptr_t* index) const; |
| 4036 | 4011 |
| 4037 void AllocatePrivateKey() const; | 4012 void AllocatePrivateKey() const; |
| 4038 | 4013 |
| 4039 RawString* MakeMetadataName(const Object& obj) const; | 4014 RawString* MakeMetadataName(const Object& obj) const; |
| 4040 RawField* GetMetadataField(const String& metaname) const; | 4015 RawField* GetMetadataField(const String& metaname) const; |
| 4041 void AddMetadata(const Object& owner, | 4016 void AddMetadata(const Object& owner, |
| 4042 const String& name, | 4017 const String& name, |
| 4043 TokenPosition token_pos, | 4018 TokenPosition token_pos, |
| 4044 intptr_t kernel_offset = 0) const; | 4019 intptr_t kernel_offset = 0) const; |
| 4045 | 4020 |
| 4046 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); | 4021 FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object); |
| 4047 | 4022 |
| 4048 friend class Bootstrap; | 4023 friend class Bootstrap; |
| 4049 friend class Class; | 4024 friend class Class; |
| 4050 friend class Debugger; | 4025 friend class Debugger; |
| 4051 friend class DictionaryIterator; | 4026 friend class DictionaryIterator; |
| 4052 friend class Isolate; | 4027 friend class Isolate; |
| 4053 friend class LibraryDeserializationCluster; | 4028 friend class LibraryDeserializationCluster; |
| 4054 friend class Namespace; | 4029 friend class Namespace; |
| 4055 friend class Object; | 4030 friend class Object; |
| 4056 friend class Precompiler; | 4031 friend class Precompiler; |
| 4057 }; | 4032 }; |
| 4058 | 4033 |
| 4059 | |
| 4060 // A Namespace contains the names in a library dictionary, filtered by | 4034 // A Namespace contains the names in a library dictionary, filtered by |
| 4061 // the show/hide combinators. | 4035 // the show/hide combinators. |
| 4062 class Namespace : public Object { | 4036 class Namespace : public Object { |
| 4063 public: | 4037 public: |
| 4064 RawLibrary* library() const { return raw_ptr()->library_; } | 4038 RawLibrary* library() const { return raw_ptr()->library_; } |
| 4065 RawArray* show_names() const { return raw_ptr()->show_names_; } | 4039 RawArray* show_names() const { return raw_ptr()->show_names_; } |
| 4066 RawArray* hide_names() const { return raw_ptr()->hide_names_; } | 4040 RawArray* hide_names() const { return raw_ptr()->hide_names_; } |
| 4067 | 4041 |
| 4068 void AddMetadata(const Object& owner, TokenPosition token_pos); | 4042 void AddMetadata(const Object& owner, TokenPosition token_pos); |
| 4069 RawObject* GetMetadata() const; | 4043 RawObject* GetMetadata() const; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 4083 private: | 4057 private: |
| 4084 static RawNamespace* New(); | 4058 static RawNamespace* New(); |
| 4085 | 4059 |
| 4086 RawField* metadata_field() const { return raw_ptr()->metadata_field_; } | 4060 RawField* metadata_field() const { return raw_ptr()->metadata_field_; } |
| 4087 void set_metadata_field(const Field& value) const; | 4061 void set_metadata_field(const Field& value) const; |
| 4088 | 4062 |
| 4089 FINAL_HEAP_OBJECT_IMPLEMENTATION(Namespace, Object); | 4063 FINAL_HEAP_OBJECT_IMPLEMENTATION(Namespace, Object); |
| 4090 friend class Class; | 4064 friend class Class; |
| 4091 }; | 4065 }; |
| 4092 | 4066 |
| 4093 | |
| 4094 // ObjectPool contains constants, immediates and addresses embedded in code | 4067 // ObjectPool contains constants, immediates and addresses embedded in code |
| 4095 // and deoptimization infos. Each entry has an type-info associated with it | 4068 // and deoptimization infos. Each entry has an type-info associated with it |
| 4096 // which is stored in a typed data array (info_array). | 4069 // which is stored in a typed data array (info_array). |
| 4097 class ObjectPool : public Object { | 4070 class ObjectPool : public Object { |
| 4098 public: | 4071 public: |
| 4099 enum EntryType { | 4072 enum EntryType { |
| 4100 kTaggedObject, | 4073 kTaggedObject, |
| 4101 kImmediate, | 4074 kImmediate, |
| 4102 kNativeEntry, | 4075 kNativeEntry, |
| 4103 }; | 4076 }; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4188 ASSERT((index >= 0) && (index < Length())); | 4161 ASSERT((index >= 0) && (index < Length())); |
| 4189 return &raw_ptr()->data()[index]; | 4162 return &raw_ptr()->data()[index]; |
| 4190 } | 4163 } |
| 4191 | 4164 |
| 4192 FINAL_HEAP_OBJECT_IMPLEMENTATION(ObjectPool, Object); | 4165 FINAL_HEAP_OBJECT_IMPLEMENTATION(ObjectPool, Object); |
| 4193 friend class Class; | 4166 friend class Class; |
| 4194 friend class Object; | 4167 friend class Object; |
| 4195 friend class RawObjectPool; | 4168 friend class RawObjectPool; |
| 4196 }; | 4169 }; |
| 4197 | 4170 |
| 4198 | |
| 4199 class Instructions : public Object { | 4171 class Instructions : public Object { |
| 4200 public: | 4172 public: |
| 4201 enum { | 4173 enum { |
| 4202 kSizePos = 0, | 4174 kSizePos = 0, |
| 4203 kSizeSize = 31, | 4175 kSizeSize = 31, |
| 4204 kFlagsPos = kSizePos + kSizeSize, | 4176 kFlagsPos = kSizePos + kSizeSize, |
| 4205 kFlagsSize = 1, // Currently, only flag is single entry flag. | 4177 kFlagsSize = 1, // Currently, only flag is single entry flag. |
| 4206 }; | 4178 }; |
| 4207 | 4179 |
| 4208 class SizeBits : public BitField<uint32_t, uint32_t, kSizePos, kSizeSize> {}; | 4180 class SizeBits : public BitField<uint32_t, uint32_t, kSizePos, kSizeSize> {}; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4316 // and links the two in a GC safe manner. | 4288 // and links the two in a GC safe manner. |
| 4317 static RawInstructions* New(intptr_t size, bool has_single_entry_point); | 4289 static RawInstructions* New(intptr_t size, bool has_single_entry_point); |
| 4318 | 4290 |
| 4319 FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object); | 4291 FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object); |
| 4320 friend class Class; | 4292 friend class Class; |
| 4321 friend class Code; | 4293 friend class Code; |
| 4322 friend class AssemblyImageWriter; | 4294 friend class AssemblyImageWriter; |
| 4323 friend class BlobImageWriter; | 4295 friend class BlobImageWriter; |
| 4324 }; | 4296 }; |
| 4325 | 4297 |
| 4326 | |
| 4327 class LocalVarDescriptors : public Object { | 4298 class LocalVarDescriptors : public Object { |
| 4328 public: | 4299 public: |
| 4329 intptr_t Length() const; | 4300 intptr_t Length() const; |
| 4330 | 4301 |
| 4331 RawString* GetName(intptr_t var_index) const; | 4302 RawString* GetName(intptr_t var_index) const; |
| 4332 | 4303 |
| 4333 void SetVar(intptr_t var_index, | 4304 void SetVar(intptr_t var_index, |
| 4334 const String& name, | 4305 const String& name, |
| 4335 RawLocalVarDescriptors::VarInfo* info) const; | 4306 RawLocalVarDescriptors::VarInfo* info) const; |
| 4336 | 4307 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4356 static RawLocalVarDescriptors* New(intptr_t num_variables); | 4327 static RawLocalVarDescriptors* New(intptr_t num_variables); |
| 4357 | 4328 |
| 4358 static const char* KindToCString(RawLocalVarDescriptors::VarInfoKind kind); | 4329 static const char* KindToCString(RawLocalVarDescriptors::VarInfoKind kind); |
| 4359 | 4330 |
| 4360 private: | 4331 private: |
| 4361 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); | 4332 FINAL_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors, Object); |
| 4362 friend class Class; | 4333 friend class Class; |
| 4363 friend class Object; | 4334 friend class Object; |
| 4364 }; | 4335 }; |
| 4365 | 4336 |
| 4366 | |
| 4367 class PcDescriptors : public Object { | 4337 class PcDescriptors : public Object { |
| 4368 public: | 4338 public: |
| 4369 static const intptr_t kBytesPerElement = 1; | 4339 static const intptr_t kBytesPerElement = 1; |
| 4370 static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement; | 4340 static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement; |
| 4371 | 4341 |
| 4372 static intptr_t InstanceSize() { | 4342 static intptr_t InstanceSize() { |
| 4373 ASSERT(sizeof(RawPcDescriptors) == | 4343 ASSERT(sizeof(RawPcDescriptors) == |
| 4374 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); | 4344 OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data)); |
| 4375 return 0; | 4345 return 0; |
| 4376 } | 4346 } |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4479 static RawPcDescriptors* New(intptr_t length); | 4449 static RawPcDescriptors* New(intptr_t length); |
| 4480 | 4450 |
| 4481 void SetLength(intptr_t value) const; | 4451 void SetLength(intptr_t value) const; |
| 4482 void CopyData(GrowableArray<uint8_t>* data); | 4452 void CopyData(GrowableArray<uint8_t>* data); |
| 4483 | 4453 |
| 4484 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object); | 4454 FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object); |
| 4485 friend class Class; | 4455 friend class Class; |
| 4486 friend class Object; | 4456 friend class Object; |
| 4487 }; | 4457 }; |
| 4488 | 4458 |
| 4489 | |
| 4490 class CodeSourceMap : public Object { | 4459 class CodeSourceMap : public Object { |
| 4491 public: | 4460 public: |
| 4492 static const intptr_t kBytesPerElement = 1; | 4461 static const intptr_t kBytesPerElement = 1; |
| 4493 static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement; | 4462 static const intptr_t kMaxElements = kMaxInt32 / kBytesPerElement; |
| 4494 | 4463 |
| 4495 static intptr_t InstanceSize() { | 4464 static intptr_t InstanceSize() { |
| 4496 ASSERT(sizeof(RawCodeSourceMap) == | 4465 ASSERT(sizeof(RawCodeSourceMap) == |
| 4497 OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data)); | 4466 OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data)); |
| 4498 return 0; | 4467 return 0; |
| 4499 } | 4468 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4520 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; | 4489 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; |
| 4521 | 4490 |
| 4522 private: | 4491 private: |
| 4523 void SetLength(intptr_t value) const; | 4492 void SetLength(intptr_t value) const; |
| 4524 | 4493 |
| 4525 FINAL_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap, Object); | 4494 FINAL_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap, Object); |
| 4526 friend class Class; | 4495 friend class Class; |
| 4527 friend class Object; | 4496 friend class Object; |
| 4528 }; | 4497 }; |
| 4529 | 4498 |
| 4530 | |
| 4531 class StackMap : public Object { | 4499 class StackMap : public Object { |
| 4532 public: | 4500 public: |
| 4533 static const intptr_t kNoMaximum = -1; | 4501 static const intptr_t kNoMaximum = -1; |
| 4534 static const intptr_t kNoMinimum = -1; | 4502 static const intptr_t kNoMinimum = -1; |
| 4535 | 4503 |
| 4536 bool IsObject(intptr_t index) const { | 4504 bool IsObject(intptr_t index) const { |
| 4537 ASSERT(InRange(index)); | 4505 ASSERT(InRange(index)); |
| 4538 return GetBit(index); | 4506 return GetBit(index); |
| 4539 } | 4507 } |
| 4540 | 4508 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4588 bool InRange(intptr_t index) const { return index < Length(); } | 4556 bool InRange(intptr_t index) const { return index < Length(); } |
| 4589 | 4557 |
| 4590 bool GetBit(intptr_t bit_index) const; | 4558 bool GetBit(intptr_t bit_index) const; |
| 4591 void SetBit(intptr_t bit_index, bool value) const; | 4559 void SetBit(intptr_t bit_index, bool value) const; |
| 4592 | 4560 |
| 4593 FINAL_HEAP_OBJECT_IMPLEMENTATION(StackMap, Object); | 4561 FINAL_HEAP_OBJECT_IMPLEMENTATION(StackMap, Object); |
| 4594 friend class BitmapBuilder; | 4562 friend class BitmapBuilder; |
| 4595 friend class Class; | 4563 friend class Class; |
| 4596 }; | 4564 }; |
| 4597 | 4565 |
| 4598 | |
| 4599 class ExceptionHandlers : public Object { | 4566 class ExceptionHandlers : public Object { |
| 4600 public: | 4567 public: |
| 4601 static const intptr_t kInvalidPcOffset = 0; | 4568 static const intptr_t kInvalidPcOffset = 0; |
| 4602 | 4569 |
| 4603 intptr_t num_entries() const; | 4570 intptr_t num_entries() const; |
| 4604 | 4571 |
| 4605 void GetHandlerInfo(intptr_t try_index, ExceptionHandlerInfo* info) const; | 4572 void GetHandlerInfo(intptr_t try_index, ExceptionHandlerInfo* info) const; |
| 4606 | 4573 |
| 4607 uword HandlerPCOffset(intptr_t try_index) const; | 4574 uword HandlerPCOffset(intptr_t try_index) const; |
| 4608 intptr_t OuterTryIndex(intptr_t try_index) const; | 4575 intptr_t OuterTryIndex(intptr_t try_index) const; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4643 // malicious code. | 4610 // malicious code. |
| 4644 static const intptr_t kMaxHandlers = 1024 * 1024; | 4611 static const intptr_t kMaxHandlers = 1024 * 1024; |
| 4645 | 4612 |
| 4646 void set_handled_types_data(const Array& value) const; | 4613 void set_handled_types_data(const Array& value) const; |
| 4647 | 4614 |
| 4648 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers, Object); | 4615 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers, Object); |
| 4649 friend class Class; | 4616 friend class Class; |
| 4650 friend class Object; | 4617 friend class Object; |
| 4651 }; | 4618 }; |
| 4652 | 4619 |
| 4653 | |
| 4654 class Code : public Object { | 4620 class Code : public Object { |
| 4655 public: | 4621 public: |
| 4656 RawInstructions* active_instructions() const { | 4622 RawInstructions* active_instructions() const { |
| 4657 #if defined(DART_PRECOMPILED_RUNTIME) | 4623 #if defined(DART_PRECOMPILED_RUNTIME) |
| 4658 UNREACHABLE(); | 4624 UNREACHABLE(); |
| 4659 return NULL; | 4625 return NULL; |
| 4660 #else | 4626 #else |
| 4661 return raw_ptr()->active_instructions_; | 4627 return raw_ptr()->active_instructions_; |
| 4662 #endif | 4628 #endif |
| 4663 } | 4629 } |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4821 kNumberOfEntries | 4787 kNumberOfEntries |
| 4822 }; | 4788 }; |
| 4823 | 4789 |
| 4824 const Array& comments_; | 4790 const Array& comments_; |
| 4825 | 4791 |
| 4826 friend class Code; | 4792 friend class Code; |
| 4827 | 4793 |
| 4828 DISALLOW_COPY_AND_ASSIGN(Comments); | 4794 DISALLOW_COPY_AND_ASSIGN(Comments); |
| 4829 }; | 4795 }; |
| 4830 | 4796 |
| 4831 | |
| 4832 const Comments& comments() const; | 4797 const Comments& comments() const; |
| 4833 void set_comments(const Comments& comments) const; | 4798 void set_comments(const Comments& comments) const; |
| 4834 | 4799 |
| 4835 RawObject* return_address_metadata() const { | 4800 RawObject* return_address_metadata() const { |
| 4836 #if defined(DART_PRECOMPILED_RUNTIME) | 4801 #if defined(DART_PRECOMPILED_RUNTIME) |
| 4837 UNREACHABLE(); | 4802 UNREACHABLE(); |
| 4838 return NULL; | 4803 return NULL; |
| 4839 #else | 4804 #else |
| 4840 return raw_ptr()->return_address_metadata_; | 4805 return raw_ptr()->return_address_metadata_; |
| 4841 #endif | 4806 #endif |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5063 // only be created using the Code::FinalizeCode method. This method creates | 5028 // only be created using the Code::FinalizeCode method. This method creates |
| 5064 // the RawInstruction and RawCode objects, sets up the pointer offsets | 5029 // the RawInstruction and RawCode objects, sets up the pointer offsets |
| 5065 // and links the two in a GC safe manner. | 5030 // and links the two in a GC safe manner. |
| 5066 static RawCode* New(intptr_t pointer_offsets_length); | 5031 static RawCode* New(intptr_t pointer_offsets_length); |
| 5067 | 5032 |
| 5068 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object); | 5033 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object); |
| 5069 friend class Class; | 5034 friend class Class; |
| 5070 friend class SnapshotWriter; | 5035 friend class SnapshotWriter; |
| 5071 friend class FunctionSerializationCluster; | 5036 friend class FunctionSerializationCluster; |
| 5072 friend class CodeSerializationCluster; | 5037 friend class CodeSerializationCluster; |
| 5073 friend class CodePatcher; // for set_instructions | 5038 friend class CodePatcher; // for set_instructions |
| 5074 friend class ProgramVisitor; // for set_instructions | 5039 friend class ProgramVisitor; // for set_instructions |
| 5075 // So that the RawFunction pointer visitor can determine whether code the | 5040 // So that the RawFunction pointer visitor can determine whether code the |
| 5076 // function points to is optimized. | 5041 // function points to is optimized. |
| 5077 friend class RawFunction; | 5042 friend class RawFunction; |
| 5078 }; | 5043 }; |
| 5079 | 5044 |
| 5080 | |
| 5081 class Context : public Object { | 5045 class Context : public Object { |
| 5082 public: | 5046 public: |
| 5083 RawContext* parent() const { return raw_ptr()->parent_; } | 5047 RawContext* parent() const { return raw_ptr()->parent_; } |
| 5084 void set_parent(const Context& parent) const { | 5048 void set_parent(const Context& parent) const { |
| 5085 StorePointer(&raw_ptr()->parent_, parent.raw()); | 5049 StorePointer(&raw_ptr()->parent_, parent.raw()); |
| 5086 } | 5050 } |
| 5087 static intptr_t parent_offset() { return OFFSET_OF(RawContext, parent_); } | 5051 static intptr_t parent_offset() { return OFFSET_OF(RawContext, parent_); } |
| 5088 | 5052 |
| 5089 intptr_t num_variables() const { return raw_ptr()->num_variables_; } | 5053 intptr_t num_variables() const { return raw_ptr()->num_variables_; } |
| 5090 static intptr_t num_variables_offset() { | 5054 static intptr_t num_variables_offset() { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5127 | 5091 |
| 5128 void set_num_variables(intptr_t num_variables) const { | 5092 void set_num_variables(intptr_t num_variables) const { |
| 5129 StoreNonPointer(&raw_ptr()->num_variables_, num_variables); | 5093 StoreNonPointer(&raw_ptr()->num_variables_, num_variables); |
| 5130 } | 5094 } |
| 5131 | 5095 |
| 5132 FINAL_HEAP_OBJECT_IMPLEMENTATION(Context, Object); | 5096 FINAL_HEAP_OBJECT_IMPLEMENTATION(Context, Object); |
| 5133 friend class Class; | 5097 friend class Class; |
| 5134 friend class Object; | 5098 friend class Object; |
| 5135 }; | 5099 }; |
| 5136 | 5100 |
| 5137 | |
| 5138 // The ContextScope class makes it possible to delay the compilation of a local | 5101 // The ContextScope class makes it possible to delay the compilation of a local |
| 5139 // function until it is invoked. A ContextScope instance collects the local | 5102 // function until it is invoked. A ContextScope instance collects the local |
| 5140 // variables that are referenced by the local function to be compiled and that | 5103 // variables that are referenced by the local function to be compiled and that |
| 5141 // belong to the outer scopes, that is, to the local scopes of (possibly nested) | 5104 // belong to the outer scopes, that is, to the local scopes of (possibly nested) |
| 5142 // functions enclosing the local function. Each captured variable is represented | 5105 // functions enclosing the local function. Each captured variable is represented |
| 5143 // by its token position in the source, its name, its type, its allocation index | 5106 // by its token position in the source, its name, its type, its allocation index |
| 5144 // in the context, and its context level. The function nesting level and loop | 5107 // in the context, and its context level. The function nesting level and loop |
| 5145 // nesting level are not preserved, since they are only used until the context | 5108 // nesting level are not preserved, since they are only used until the context |
| 5146 // level is assigned. In addition the ContextScope has a field 'is_implicit' | 5109 // level is assigned. In addition the ContextScope has a field 'is_implicit' |
| 5147 // which is true if the ContextScope was created for an implicit closure. | 5110 // which is true if the ContextScope was created for an implicit closure. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5207 const RawContextScope::VariableDesc* VariableDescAddr(intptr_t index) const { | 5170 const RawContextScope::VariableDesc* VariableDescAddr(intptr_t index) const { |
| 5208 ASSERT((index >= 0) && (index < num_variables())); | 5171 ASSERT((index >= 0) && (index < num_variables())); |
| 5209 return raw_ptr()->VariableDescAddr(index); | 5172 return raw_ptr()->VariableDescAddr(index); |
| 5210 } | 5173 } |
| 5211 | 5174 |
| 5212 FINAL_HEAP_OBJECT_IMPLEMENTATION(ContextScope, Object); | 5175 FINAL_HEAP_OBJECT_IMPLEMENTATION(ContextScope, Object); |
| 5213 friend class Class; | 5176 friend class Class; |
| 5214 friend class Object; | 5177 friend class Object; |
| 5215 }; | 5178 }; |
| 5216 | 5179 |
| 5217 | |
| 5218 class MegamorphicCache : public Object { | 5180 class MegamorphicCache : public Object { |
| 5219 public: | 5181 public: |
| 5220 static const intptr_t kInitialCapacity = 16; | 5182 static const intptr_t kInitialCapacity = 16; |
| 5221 static const intptr_t kSpreadFactor = 7; | 5183 static const intptr_t kSpreadFactor = 7; |
| 5222 static const double kLoadFactor; | 5184 static const double kLoadFactor; |
| 5223 | 5185 |
| 5224 RawArray* buckets() const; | 5186 RawArray* buckets() const; |
| 5225 void set_buckets(const Array& buckets) const; | 5187 void set_buckets(const Array& buckets) const; |
| 5226 | 5188 |
| 5227 intptr_t mask() const; | 5189 intptr_t mask() const; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5276 const Smi& class_id, | 5238 const Smi& class_id, |
| 5277 const Function& target); | 5239 const Function& target); |
| 5278 | 5240 |
| 5279 static inline RawObject* GetClassId(const Array& array, intptr_t index); | 5241 static inline RawObject* GetClassId(const Array& array, intptr_t index); |
| 5280 static inline RawObject* GetTargetFunction(const Array& array, | 5242 static inline RawObject* GetTargetFunction(const Array& array, |
| 5281 intptr_t index); | 5243 intptr_t index); |
| 5282 | 5244 |
| 5283 FINAL_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache, Object); | 5245 FINAL_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache, Object); |
| 5284 }; | 5246 }; |
| 5285 | 5247 |
| 5286 | |
| 5287 class SubtypeTestCache : public Object { | 5248 class SubtypeTestCache : public Object { |
| 5288 public: | 5249 public: |
| 5289 enum Entries { | 5250 enum Entries { |
| 5290 kInstanceClassIdOrFunction = 0, | 5251 kInstanceClassIdOrFunction = 0, |
| 5291 kInstanceTypeArguments = 1, | 5252 kInstanceTypeArguments = 1, |
| 5292 kInstantiatorTypeArguments = 2, | 5253 kInstantiatorTypeArguments = 2, |
| 5293 kFunctionTypeArguments = 3, | 5254 kFunctionTypeArguments = 3, |
| 5294 kTestResult = 4, | 5255 kTestResult = 4, |
| 5295 kTestEntryLength = 5, | 5256 kTestEntryLength = 5, |
| 5296 }; | 5257 }; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 5322 RawArray* cache() const { return raw_ptr()->cache_; } | 5283 RawArray* cache() const { return raw_ptr()->cache_; } |
| 5323 | 5284 |
| 5324 void set_cache(const Array& value) const; | 5285 void set_cache(const Array& value) const; |
| 5325 | 5286 |
| 5326 intptr_t TestEntryLength() const; | 5287 intptr_t TestEntryLength() const; |
| 5327 | 5288 |
| 5328 FINAL_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache, Object); | 5289 FINAL_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache, Object); |
| 5329 friend class Class; | 5290 friend class Class; |
| 5330 }; | 5291 }; |
| 5331 | 5292 |
| 5332 | |
| 5333 class Error : public Object { | 5293 class Error : public Object { |
| 5334 public: | 5294 public: |
| 5335 virtual const char* ToErrorCString() const; | 5295 virtual const char* ToErrorCString() const; |
| 5336 | 5296 |
| 5337 private: | 5297 private: |
| 5338 HEAP_OBJECT_IMPLEMENTATION(Error, Object); | 5298 HEAP_OBJECT_IMPLEMENTATION(Error, Object); |
| 5339 }; | 5299 }; |
| 5340 | 5300 |
| 5341 | |
| 5342 class ApiError : public Error { | 5301 class ApiError : public Error { |
| 5343 public: | 5302 public: |
| 5344 RawString* message() const { return raw_ptr()->message_; } | 5303 RawString* message() const { return raw_ptr()->message_; } |
| 5345 | 5304 |
| 5346 static intptr_t InstanceSize() { | 5305 static intptr_t InstanceSize() { |
| 5347 return RoundedAllocationSize(sizeof(RawApiError)); | 5306 return RoundedAllocationSize(sizeof(RawApiError)); |
| 5348 } | 5307 } |
| 5349 | 5308 |
| 5350 static RawApiError* New(const String& message, | 5309 static RawApiError* New(const String& message, |
| 5351 Heap::Space space = Heap::kNew); | 5310 Heap::Space space = Heap::kNew); |
| 5352 | 5311 |
| 5353 virtual const char* ToErrorCString() const; | 5312 virtual const char* ToErrorCString() const; |
| 5354 | 5313 |
| 5355 private: | 5314 private: |
| 5356 void set_message(const String& message) const; | 5315 void set_message(const String& message) const; |
| 5357 | 5316 |
| 5358 static RawApiError* New(); | 5317 static RawApiError* New(); |
| 5359 | 5318 |
| 5360 FINAL_HEAP_OBJECT_IMPLEMENTATION(ApiError, Error); | 5319 FINAL_HEAP_OBJECT_IMPLEMENTATION(ApiError, Error); |
| 5361 friend class Class; | 5320 friend class Class; |
| 5362 }; | 5321 }; |
| 5363 | 5322 |
| 5364 | |
| 5365 class LanguageError : public Error { | 5323 class LanguageError : public Error { |
| 5366 public: | 5324 public: |
| 5367 Report::Kind kind() const { | 5325 Report::Kind kind() const { |
| 5368 return static_cast<Report::Kind>(raw_ptr()->kind_); | 5326 return static_cast<Report::Kind>(raw_ptr()->kind_); |
| 5369 } | 5327 } |
| 5370 | 5328 |
| 5371 // Build, cache, and return formatted message. | 5329 // Build, cache, and return formatted message. |
| 5372 RawString* FormatMessage() const; | 5330 RawString* FormatMessage() const; |
| 5373 | 5331 |
| 5374 static intptr_t InstanceSize() { | 5332 static intptr_t InstanceSize() { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5421 | 5379 |
| 5422 RawString* formatted_message() const { return raw_ptr()->formatted_message_; } | 5380 RawString* formatted_message() const { return raw_ptr()->formatted_message_; } |
| 5423 void set_formatted_message(const String& value) const; | 5381 void set_formatted_message(const String& value) const; |
| 5424 | 5382 |
| 5425 static RawLanguageError* New(); | 5383 static RawLanguageError* New(); |
| 5426 | 5384 |
| 5427 FINAL_HEAP_OBJECT_IMPLEMENTATION(LanguageError, Error); | 5385 FINAL_HEAP_OBJECT_IMPLEMENTATION(LanguageError, Error); |
| 5428 friend class Class; | 5386 friend class Class; |
| 5429 }; | 5387 }; |
| 5430 | 5388 |
| 5431 | |
| 5432 class UnhandledException : public Error { | 5389 class UnhandledException : public Error { |
| 5433 public: | 5390 public: |
| 5434 RawInstance* exception() const { return raw_ptr()->exception_; } | 5391 RawInstance* exception() const { return raw_ptr()->exception_; } |
| 5435 static intptr_t exception_offset() { | 5392 static intptr_t exception_offset() { |
| 5436 return OFFSET_OF(RawUnhandledException, exception_); | 5393 return OFFSET_OF(RawUnhandledException, exception_); |
| 5437 } | 5394 } |
| 5438 | 5395 |
| 5439 RawInstance* stacktrace() const { return raw_ptr()->stacktrace_; } | 5396 RawInstance* stacktrace() const { return raw_ptr()->stacktrace_; } |
| 5440 static intptr_t stacktrace_offset() { | 5397 static intptr_t stacktrace_offset() { |
| 5441 return OFFSET_OF(RawUnhandledException, stacktrace_); | 5398 return OFFSET_OF(RawUnhandledException, stacktrace_); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 5455 static RawUnhandledException* New(Heap::Space space = Heap::kNew); | 5412 static RawUnhandledException* New(Heap::Space space = Heap::kNew); |
| 5456 | 5413 |
| 5457 void set_exception(const Instance& exception) const; | 5414 void set_exception(const Instance& exception) const; |
| 5458 void set_stacktrace(const Instance& stacktrace) const; | 5415 void set_stacktrace(const Instance& stacktrace) const; |
| 5459 | 5416 |
| 5460 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnhandledException, Error); | 5417 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnhandledException, Error); |
| 5461 friend class Class; | 5418 friend class Class; |
| 5462 friend class ObjectStore; | 5419 friend class ObjectStore; |
| 5463 }; | 5420 }; |
| 5464 | 5421 |
| 5465 | |
| 5466 class UnwindError : public Error { | 5422 class UnwindError : public Error { |
| 5467 public: | 5423 public: |
| 5468 bool is_user_initiated() const { return raw_ptr()->is_user_initiated_; } | 5424 bool is_user_initiated() const { return raw_ptr()->is_user_initiated_; } |
| 5469 void set_is_user_initiated(bool value) const; | 5425 void set_is_user_initiated(bool value) const; |
| 5470 | 5426 |
| 5471 RawString* message() const { return raw_ptr()->message_; } | 5427 RawString* message() const { return raw_ptr()->message_; } |
| 5472 | 5428 |
| 5473 static intptr_t InstanceSize() { | 5429 static intptr_t InstanceSize() { |
| 5474 return RoundedAllocationSize(sizeof(RawUnwindError)); | 5430 return RoundedAllocationSize(sizeof(RawUnwindError)); |
| 5475 } | 5431 } |
| 5476 | 5432 |
| 5477 static RawUnwindError* New(const String& message, | 5433 static RawUnwindError* New(const String& message, |
| 5478 Heap::Space space = Heap::kNew); | 5434 Heap::Space space = Heap::kNew); |
| 5479 | 5435 |
| 5480 virtual const char* ToErrorCString() const; | 5436 virtual const char* ToErrorCString() const; |
| 5481 | 5437 |
| 5482 private: | 5438 private: |
| 5483 void set_message(const String& message) const; | 5439 void set_message(const String& message) const; |
| 5484 | 5440 |
| 5485 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnwindError, Error); | 5441 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnwindError, Error); |
| 5486 friend class Class; | 5442 friend class Class; |
| 5487 }; | 5443 }; |
| 5488 | 5444 |
| 5489 | |
| 5490 // Instance is the base class for all instance objects (aka the Object class | 5445 // Instance is the base class for all instance objects (aka the Object class |
| 5491 // in Dart source code. | 5446 // in Dart source code. |
| 5492 class Instance : public Object { | 5447 class Instance : public Object { |
| 5493 public: | 5448 public: |
| 5494 // Equality and identity testing. | 5449 // Equality and identity testing. |
| 5495 // 1. OperatorEquals: true iff 'this == other' is true in Dart code. | 5450 // 1. OperatorEquals: true iff 'this == other' is true in Dart code. |
| 5496 // 2. IsIdenticalTo: true iff 'identical(this, other)' is true in Dart code. | 5451 // 2. IsIdenticalTo: true iff 'identical(this, other)' is true in Dart code. |
| 5497 // 3. CanonicalizeEquals: used to canonicalize compile-time constants, e.g., | 5452 // 3. CanonicalizeEquals: used to canonicalize compile-time constants, e.g., |
| 5498 // using bitwise equality of fields and list elements. | 5453 // using bitwise equality of fields and list elements. |
| 5499 // Subclasses where 1 and 3 coincide may also define a plain Equals, e.g., | 5454 // Subclasses where 1 and 3 coincide may also define a plain Equals, e.g., |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5635 friend class RegExp; | 5590 friend class RegExp; |
| 5636 friend class SnapshotWriter; | 5591 friend class SnapshotWriter; |
| 5637 friend class StubCode; | 5592 friend class StubCode; |
| 5638 friend class TypedDataView; | 5593 friend class TypedDataView; |
| 5639 friend class InstanceSerializationCluster; | 5594 friend class InstanceSerializationCluster; |
| 5640 friend class InstanceDeserializationCluster; | 5595 friend class InstanceDeserializationCluster; |
| 5641 friend class ClassDeserializationCluster; // vtable | 5596 friend class ClassDeserializationCluster; // vtable |
| 5642 friend class InstanceMorpher; | 5597 friend class InstanceMorpher; |
| 5643 }; | 5598 }; |
| 5644 | 5599 |
| 5645 | |
| 5646 class LibraryPrefix : public Instance { | 5600 class LibraryPrefix : public Instance { |
| 5647 public: | 5601 public: |
| 5648 RawString* name() const { return raw_ptr()->name_; } | 5602 RawString* name() const { return raw_ptr()->name_; } |
| 5649 virtual RawString* DictionaryName() const { return name(); } | 5603 virtual RawString* DictionaryName() const { return name(); } |
| 5650 | 5604 |
| 5651 RawArray* imports() const { return raw_ptr()->imports_; } | 5605 RawArray* imports() const { return raw_ptr()->imports_; } |
| 5652 intptr_t num_imports() const { return raw_ptr()->num_imports_; } | 5606 intptr_t num_imports() const { return raw_ptr()->num_imports_; } |
| 5653 RawLibrary* importer() const { return raw_ptr()->importer_; } | 5607 RawLibrary* importer() const { return raw_ptr()->importer_; } |
| 5654 | 5608 |
| 5655 RawInstance* LoadError() const; | 5609 RawInstance* LoadError() const; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5692 void set_num_imports(intptr_t value) const; | 5646 void set_num_imports(intptr_t value) const; |
| 5693 void set_importer(const Library& value) const; | 5647 void set_importer(const Library& value) const; |
| 5694 void set_is_loaded() const; | 5648 void set_is_loaded() const; |
| 5695 | 5649 |
| 5696 static RawLibraryPrefix* New(); | 5650 static RawLibraryPrefix* New(); |
| 5697 | 5651 |
| 5698 FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Instance); | 5652 FINAL_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix, Instance); |
| 5699 friend class Class; | 5653 friend class Class; |
| 5700 }; | 5654 }; |
| 5701 | 5655 |
| 5702 | |
| 5703 // AbstractType is an abstract superclass. | 5656 // AbstractType is an abstract superclass. |
| 5704 // Subclasses of AbstractType are Type and TypeParameter. | 5657 // Subclasses of AbstractType are Type and TypeParameter. |
| 5705 class AbstractType : public Instance { | 5658 class AbstractType : public Instance { |
| 5706 public: | 5659 public: |
| 5707 // We use 30 bits for the hash code so hashes in a snapshot taken on a | 5660 // We use 30 bits for the hash code so hashes in a snapshot taken on a |
| 5708 // 64-bit architecture stay in Smi range when loaded on a 32-bit | 5661 // 64-bit architecture stay in Smi range when loaded on a 32-bit |
| 5709 // architecture. | 5662 // architecture. |
| 5710 static const intptr_t kHashBits = 30; | 5663 static const intptr_t kHashBits = 30; |
| 5711 | 5664 |
| 5712 virtual bool IsFinalized() const; | 5665 virtual bool IsFinalized() const; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5901 // type arguments, if any. | 5854 // type arguments, if any. |
| 5902 RawString* BuildName(NameVisibility visibility) const; | 5855 RawString* BuildName(NameVisibility visibility) const; |
| 5903 | 5856 |
| 5904 protected: | 5857 protected: |
| 5905 HEAP_OBJECT_IMPLEMENTATION(AbstractType, Instance); | 5858 HEAP_OBJECT_IMPLEMENTATION(AbstractType, Instance); |
| 5906 friend class Class; | 5859 friend class Class; |
| 5907 friend class Function; | 5860 friend class Function; |
| 5908 friend class TypeArguments; | 5861 friend class TypeArguments; |
| 5909 }; | 5862 }; |
| 5910 | 5863 |
| 5911 | |
| 5912 // A Type consists of a class, possibly parameterized with type | 5864 // A Type consists of a class, possibly parameterized with type |
| 5913 // arguments. Example: C<T1, T2>. | 5865 // arguments. Example: C<T1, T2>. |
| 5914 // An unresolved class is a String specifying the class name. | 5866 // An unresolved class is a String specifying the class name. |
| 5915 // | 5867 // |
| 5916 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as | 5868 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as |
| 5917 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not | 5869 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not |
| 5918 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'. | 5870 // relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'. |
| 5919 class Type : public AbstractType { | 5871 class Type : public AbstractType { |
| 5920 public: | 5872 public: |
| 5921 static intptr_t type_class_id_offset() { | 5873 static intptr_t type_class_id_offset() { |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6053 void set_type_state(int8_t state) const; | 6005 void set_type_state(int8_t state) const; |
| 6054 | 6006 |
| 6055 static RawType* New(Heap::Space space = Heap::kOld); | 6007 static RawType* New(Heap::Space space = Heap::kOld); |
| 6056 | 6008 |
| 6057 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); | 6009 FINAL_HEAP_OBJECT_IMPLEMENTATION(Type, AbstractType); |
| 6058 friend class Class; | 6010 friend class Class; |
| 6059 friend class TypeArguments; | 6011 friend class TypeArguments; |
| 6060 friend class ClearTypeHashVisitor; | 6012 friend class ClearTypeHashVisitor; |
| 6061 }; | 6013 }; |
| 6062 | 6014 |
| 6063 | |
| 6064 // A TypeRef is used to break cycles in the representation of recursive types. | 6015 // A TypeRef is used to break cycles in the representation of recursive types. |
| 6065 // Its only field is the recursive AbstractType it refers to, which can | 6016 // Its only field is the recursive AbstractType it refers to, which can |
| 6066 // temporarily be null during finalization. | 6017 // temporarily be null during finalization. |
| 6067 // Note that the cycle always involves type arguments. | 6018 // Note that the cycle always involves type arguments. |
| 6068 class TypeRef : public AbstractType { | 6019 class TypeRef : public AbstractType { |
| 6069 public: | 6020 public: |
| 6070 virtual bool IsFinalized() const { | 6021 virtual bool IsFinalized() const { |
| 6071 const AbstractType& ref_type = AbstractType::Handle(type()); | 6022 const AbstractType& ref_type = AbstractType::Handle(type()); |
| 6072 return !ref_type.IsNull() && ref_type.IsFinalized(); | 6023 return !ref_type.IsNull() && ref_type.IsFinalized(); |
| 6073 } | 6024 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6128 | 6079 |
| 6129 static RawTypeRef* New(const AbstractType& type); | 6080 static RawTypeRef* New(const AbstractType& type); |
| 6130 | 6081 |
| 6131 private: | 6082 private: |
| 6132 static RawTypeRef* New(); | 6083 static RawTypeRef* New(); |
| 6133 | 6084 |
| 6134 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeRef, AbstractType); | 6085 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeRef, AbstractType); |
| 6135 friend class Class; | 6086 friend class Class; |
| 6136 }; | 6087 }; |
| 6137 | 6088 |
| 6138 | |
| 6139 // A TypeParameter represents a type parameter of a parameterized class. | 6089 // A TypeParameter represents a type parameter of a parameterized class. |
| 6140 // It specifies its index (and its name for debugging purposes), as well as its | 6090 // It specifies its index (and its name for debugging purposes), as well as its |
| 6141 // upper bound. | 6091 // upper bound. |
| 6142 // For example, the type parameter 'V' is specified as index 1 in the context of | 6092 // For example, the type parameter 'V' is specified as index 1 in the context of |
| 6143 // the class HashMap<K, V>. At compile time, the TypeParameter is not | 6093 // the class HashMap<K, V>. At compile time, the TypeParameter is not |
| 6144 // instantiated yet, i.e. it is only a place holder. | 6094 // instantiated yet, i.e. it is only a place holder. |
| 6145 // Upon finalization, the TypeParameter index is changed to reflect its position | 6095 // Upon finalization, the TypeParameter index is changed to reflect its position |
| 6146 // as type argument (rather than type parameter) of the parameterized class. | 6096 // as type argument (rather than type parameter) of the parameterized class. |
| 6147 // If the type parameter is declared without an extends clause, its bound is set | 6097 // If the type parameter is declared without an extends clause, its bound is set |
| 6148 // to the ObjectType. | 6098 // to the ObjectType. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6233 void set_token_pos(TokenPosition token_pos) const; | 6183 void set_token_pos(TokenPosition token_pos) const; |
| 6234 void set_type_state(int8_t state) const; | 6184 void set_type_state(int8_t state) const; |
| 6235 | 6185 |
| 6236 static RawTypeParameter* New(); | 6186 static RawTypeParameter* New(); |
| 6237 | 6187 |
| 6238 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameter, AbstractType); | 6188 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameter, AbstractType); |
| 6239 friend class Class; | 6189 friend class Class; |
| 6240 friend class ClearTypeHashVisitor; | 6190 friend class ClearTypeHashVisitor; |
| 6241 }; | 6191 }; |
| 6242 | 6192 |
| 6243 | |
| 6244 // A BoundedType represents a type instantiated at compile time from a type | 6193 // A BoundedType represents a type instantiated at compile time from a type |
| 6245 // parameter specifying a bound that either cannot be checked at compile time | 6194 // parameter specifying a bound that either cannot be checked at compile time |
| 6246 // because the type or the bound are still uninstantiated or can be checked and | 6195 // because the type or the bound are still uninstantiated or can be checked and |
| 6247 // would trigger a bound error in checked mode. The bound must be checked at | 6196 // would trigger a bound error in checked mode. The bound must be checked at |
| 6248 // runtime once the type and its bound are instantiated and when the execution | 6197 // runtime once the type and its bound are instantiated and when the execution |
| 6249 // mode is known to be checked mode. | 6198 // mode is known to be checked mode. |
| 6250 class BoundedType : public AbstractType { | 6199 class BoundedType : public AbstractType { |
| 6251 public: | 6200 public: |
| 6252 virtual bool IsFinalized() const { | 6201 virtual bool IsFinalized() const { |
| 6253 return AbstractType::Handle(type()).IsFinalized(); | 6202 return AbstractType::Handle(type()).IsFinalized(); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6329 void set_bound(const AbstractType& value) const; | 6278 void set_bound(const AbstractType& value) const; |
| 6330 void set_type_parameter(const TypeParameter& value) const; | 6279 void set_type_parameter(const TypeParameter& value) const; |
| 6331 | 6280 |
| 6332 static RawBoundedType* New(); | 6281 static RawBoundedType* New(); |
| 6333 | 6282 |
| 6334 FINAL_HEAP_OBJECT_IMPLEMENTATION(BoundedType, AbstractType); | 6283 FINAL_HEAP_OBJECT_IMPLEMENTATION(BoundedType, AbstractType); |
| 6335 friend class Class; | 6284 friend class Class; |
| 6336 friend class ClearTypeHashVisitor; | 6285 friend class ClearTypeHashVisitor; |
| 6337 }; | 6286 }; |
| 6338 | 6287 |
| 6339 | |
| 6340 // A MixinAppType represents a parsed mixin application clause, e.g. | 6288 // A MixinAppType represents a parsed mixin application clause, e.g. |
| 6341 // "S<T> with M<U>, N<V>". | 6289 // "S<T> with M<U>, N<V>". |
| 6342 // MixinAppType objects do not survive finalization, so they do not | 6290 // MixinAppType objects do not survive finalization, so they do not |
| 6343 // need to be written to and read from snapshots. | 6291 // need to be written to and read from snapshots. |
| 6344 // The class finalizer creates synthesized classes S&M and S&M&N if they do not | 6292 // The class finalizer creates synthesized classes S&M and S&M&N if they do not |
| 6345 // yet exist in the library declaring the mixin application clause. | 6293 // yet exist in the library declaring the mixin application clause. |
| 6346 class MixinAppType : public AbstractType { | 6294 class MixinAppType : public AbstractType { |
| 6347 public: | 6295 public: |
| 6348 // A MixinAppType object is unfinalized by definition, since it is replaced at | 6296 // A MixinAppType object is unfinalized by definition, since it is replaced at |
| 6349 // class finalization time with a finalized (and possibly malformed or | 6297 // class finalization time with a finalized (and possibly malformed or |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6381 | 6329 |
| 6382 RawArray* mixin_types() const { return raw_ptr()->mixin_types_; } | 6330 RawArray* mixin_types() const { return raw_ptr()->mixin_types_; } |
| 6383 void set_mixin_types(const Array& value) const; | 6331 void set_mixin_types(const Array& value) const; |
| 6384 | 6332 |
| 6385 static RawMixinAppType* New(); | 6333 static RawMixinAppType* New(); |
| 6386 | 6334 |
| 6387 FINAL_HEAP_OBJECT_IMPLEMENTATION(MixinAppType, AbstractType); | 6335 FINAL_HEAP_OBJECT_IMPLEMENTATION(MixinAppType, AbstractType); |
| 6388 friend class Class; | 6336 friend class Class; |
| 6389 }; | 6337 }; |
| 6390 | 6338 |
| 6391 | |
| 6392 class Number : public Instance { | 6339 class Number : public Instance { |
| 6393 public: | 6340 public: |
| 6394 // TODO(iposva): Add more useful Number methods. | 6341 // TODO(iposva): Add more useful Number methods. |
| 6395 RawString* ToString(Heap::Space space) const; | 6342 RawString* ToString(Heap::Space space) const; |
| 6396 | 6343 |
| 6397 // Numbers are canonicalized differently from other instances/strings. | 6344 // Numbers are canonicalized differently from other instances/strings. |
| 6398 virtual RawInstance* CheckAndCanonicalize(Thread* thread, | 6345 virtual RawInstance* CheckAndCanonicalize(Thread* thread, |
| 6399 const char** error_str) const; | 6346 const char** error_str) const; |
| 6400 | 6347 |
| 6401 #if defined(DEBUG) | 6348 #if defined(DEBUG) |
| 6402 // Check if number is canonical. | 6349 // Check if number is canonical. |
| 6403 virtual bool CheckIsCanonical(Thread* thread) const; | 6350 virtual bool CheckIsCanonical(Thread* thread) const; |
| 6404 #endif // DEBUG | 6351 #endif // DEBUG |
| 6405 | 6352 |
| 6406 private: | 6353 private: |
| 6407 OBJECT_IMPLEMENTATION(Number, Instance); | 6354 OBJECT_IMPLEMENTATION(Number, Instance); |
| 6408 | 6355 |
| 6409 friend class Class; | 6356 friend class Class; |
| 6410 }; | 6357 }; |
| 6411 | 6358 |
| 6412 | |
| 6413 class Integer : public Number { | 6359 class Integer : public Number { |
| 6414 public: | 6360 public: |
| 6415 static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); | 6361 static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); |
| 6416 static RawInteger* NewFromUint64(uint64_t value, | 6362 static RawInteger* NewFromUint64(uint64_t value, |
| 6417 Heap::Space space = Heap::kNew); | 6363 Heap::Space space = Heap::kNew); |
| 6418 | 6364 |
| 6419 // Returns a canonical Integer object allocated in the old gen space. | 6365 // Returns a canonical Integer object allocated in the old gen space. |
| 6420 static RawInteger* NewCanonical(const String& str); | 6366 static RawInteger* NewCanonical(const String& str); |
| 6421 | 6367 |
| 6422 static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew); | 6368 static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6457 Heap::Space space = Heap::kNew) const; | 6403 Heap::Space space = Heap::kNew) const; |
| 6458 RawInteger* BitOp(Token::Kind operation, | 6404 RawInteger* BitOp(Token::Kind operation, |
| 6459 const Integer& other, | 6405 const Integer& other, |
| 6460 Heap::Space space = Heap::kNew) const; | 6406 Heap::Space space = Heap::kNew) const; |
| 6461 | 6407 |
| 6462 private: | 6408 private: |
| 6463 OBJECT_IMPLEMENTATION(Integer, Number); | 6409 OBJECT_IMPLEMENTATION(Integer, Number); |
| 6464 friend class Class; | 6410 friend class Class; |
| 6465 }; | 6411 }; |
| 6466 | 6412 |
| 6467 | |
| 6468 class Smi : public Integer { | 6413 class Smi : public Integer { |
| 6469 public: | 6414 public: |
| 6470 static const intptr_t kBits = kSmiBits; | 6415 static const intptr_t kBits = kSmiBits; |
| 6471 static const intptr_t kMaxValue = kSmiMax; | 6416 static const intptr_t kMaxValue = kSmiMax; |
| 6472 static const intptr_t kMinValue = kSmiMin; | 6417 static const intptr_t kMinValue = kSmiMin; |
| 6473 | 6418 |
| 6474 intptr_t Value() const { return ValueFromRaw(raw_value()); } | 6419 intptr_t Value() const { return ValueFromRaw(raw_value()); } |
| 6475 | 6420 |
| 6476 virtual bool Equals(const Instance& other) const; | 6421 virtual bool Equals(const Instance& other) const; |
| 6477 virtual bool IsZero() const { return Value() == 0; } | 6422 virtual bool IsZero() const { return Value() == 0; } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6542 Smi() : Integer() {} | 6487 Smi() : Integer() {} |
| 6543 BASE_OBJECT_IMPLEMENTATION(Smi, Integer); | 6488 BASE_OBJECT_IMPLEMENTATION(Smi, Integer); |
| 6544 OBJECT_SERVICE_SUPPORT(Smi); | 6489 OBJECT_SERVICE_SUPPORT(Smi); |
| 6545 friend class Api; // For ValueFromRaw | 6490 friend class Api; // For ValueFromRaw |
| 6546 friend class Class; | 6491 friend class Class; |
| 6547 friend class Object; | 6492 friend class Object; |
| 6548 friend class ReusableSmiHandleScope; | 6493 friend class ReusableSmiHandleScope; |
| 6549 friend class Thread; | 6494 friend class Thread; |
| 6550 }; | 6495 }; |
| 6551 | 6496 |
| 6552 | |
| 6553 class Mint : public Integer { | 6497 class Mint : public Integer { |
| 6554 public: | 6498 public: |
| 6555 static const intptr_t kBits = 63; // 64-th bit is sign. | 6499 static const intptr_t kBits = 63; // 64-th bit is sign. |
| 6556 static const int64_t kMaxValue = | 6500 static const int64_t kMaxValue = |
| 6557 static_cast<int64_t>(DART_2PART_UINT64_C(0x7FFFFFFF, FFFFFFFF)); | 6501 static_cast<int64_t>(DART_2PART_UINT64_C(0x7FFFFFFF, FFFFFFFF)); |
| 6558 static const int64_t kMinValue = | 6502 static const int64_t kMinValue = |
| 6559 static_cast<int64_t>(DART_2PART_UINT64_C(0x80000000, 00000000)); | 6503 static_cast<int64_t>(DART_2PART_UINT64_C(0x80000000, 00000000)); |
| 6560 | 6504 |
| 6561 int64_t value() const { return raw_ptr()->value_; } | 6505 int64_t value() const { return raw_ptr()->value_; } |
| 6562 static intptr_t value_offset() { return OFFSET_OF(RawMint, value_); } | 6506 static intptr_t value_offset() { return OFFSET_OF(RawMint, value_); } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6587 static RawMint* NewCanonical(int64_t value); | 6531 static RawMint* NewCanonical(int64_t value); |
| 6588 | 6532 |
| 6589 private: | 6533 private: |
| 6590 void set_value(int64_t value) const; | 6534 void set_value(int64_t value) const; |
| 6591 | 6535 |
| 6592 MINT_OBJECT_IMPLEMENTATION(Mint, Integer, Integer); | 6536 MINT_OBJECT_IMPLEMENTATION(Mint, Integer, Integer); |
| 6593 friend class Class; | 6537 friend class Class; |
| 6594 friend class Number; | 6538 friend class Number; |
| 6595 }; | 6539 }; |
| 6596 | 6540 |
| 6597 | |
| 6598 class Bigint : public Integer { | 6541 class Bigint : public Integer { |
| 6599 public: | 6542 public: |
| 6600 virtual bool IsZero() const { return Used() == 0; } | 6543 virtual bool IsZero() const { return Used() == 0; } |
| 6601 virtual bool IsNegative() const { return Neg(); } | 6544 virtual bool IsNegative() const { return Neg(); } |
| 6602 virtual bool Equals(const Instance& other) const; | 6545 virtual bool Equals(const Instance& other) const; |
| 6603 | 6546 |
| 6604 virtual double AsDoubleValue() const; | 6547 virtual double AsDoubleValue() const; |
| 6605 virtual int64_t AsInt64Value() const; | 6548 virtual int64_t AsInt64Value() const; |
| 6606 virtual int64_t AsTruncatedInt64Value() const; | 6549 virtual int64_t AsTruncatedInt64Value() const; |
| 6607 virtual uint32_t AsTruncatedUint32Value() const; | 6550 virtual uint32_t AsTruncatedUint32Value() const; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6685 static RawTypedData* NewDigitsFromDecCString(const char* str, | 6628 static RawTypedData* NewDigitsFromDecCString(const char* str, |
| 6686 intptr_t* used, | 6629 intptr_t* used, |
| 6687 Heap::Space space = Heap::kNew); | 6630 Heap::Space space = Heap::kNew); |
| 6688 | 6631 |
| 6689 static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew); | 6632 static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew); |
| 6690 | 6633 |
| 6691 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer); | 6634 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer); |
| 6692 friend class Class; | 6635 friend class Class; |
| 6693 }; | 6636 }; |
| 6694 | 6637 |
| 6695 | |
| 6696 // Class Double represents class Double in corelib_impl, which implements | 6638 // Class Double represents class Double in corelib_impl, which implements |
| 6697 // abstract class double in corelib. | 6639 // abstract class double in corelib. |
| 6698 class Double : public Number { | 6640 class Double : public Number { |
| 6699 public: | 6641 public: |
| 6700 double value() const { return raw_ptr()->value_; } | 6642 double value() const { return raw_ptr()->value_; } |
| 6701 | 6643 |
| 6702 bool BitwiseEqualsToDouble(double value) const; | 6644 bool BitwiseEqualsToDouble(double value) const; |
| 6703 virtual bool OperatorEquals(const Instance& other) const; | 6645 virtual bool OperatorEquals(const Instance& other) const; |
| 6704 virtual bool CanonicalizeEquals(const Instance& other) const; | 6646 virtual bool CanonicalizeEquals(const Instance& other) const; |
| 6705 virtual uword ComputeCanonicalTableHash() const { | 6647 virtual uword ComputeCanonicalTableHash() const { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6726 static intptr_t value_offset() { return OFFSET_OF(RawDouble, value_); } | 6668 static intptr_t value_offset() { return OFFSET_OF(RawDouble, value_); } |
| 6727 | 6669 |
| 6728 private: | 6670 private: |
| 6729 void set_value(double value) const; | 6671 void set_value(double value) const; |
| 6730 | 6672 |
| 6731 FINAL_HEAP_OBJECT_IMPLEMENTATION(Double, Number); | 6673 FINAL_HEAP_OBJECT_IMPLEMENTATION(Double, Number); |
| 6732 friend class Class; | 6674 friend class Class; |
| 6733 friend class Number; | 6675 friend class Number; |
| 6734 }; | 6676 }; |
| 6735 | 6677 |
| 6736 | |
| 6737 // String may not be '\0' terminated. | 6678 // String may not be '\0' terminated. |
| 6738 class String : public Instance { | 6679 class String : public Instance { |
| 6739 public: | 6680 public: |
| 6740 // We use 30 bits for the hash code so hashes in a snapshot taken on a | 6681 // We use 30 bits for the hash code so hashes in a snapshot taken on a |
| 6741 // 64-bit architecture stay in Smi range when loaded on a 32-bit | 6682 // 64-bit architecture stay in Smi range when loaded on a 32-bit |
| 6742 // architecture. | 6683 // architecture. |
| 6743 static const intptr_t kHashBits = 30; | 6684 static const intptr_t kHashBits = 30; |
| 6744 | 6685 |
| 6745 static const intptr_t kOneByteChar = 1; | 6686 static const intptr_t kOneByteChar = 1; |
| 6746 static const intptr_t kTwoByteChar = 2; | 6687 static const intptr_t kTwoByteChar = 2; |
| 6747 | 6688 |
| 6748 // All strings share the same maximum element count to keep things | 6689 // All strings share the same maximum element count to keep things |
| 6749 // simple. We choose a value that will prevent integer overflow for | 6690 // simple. We choose a value that will prevent integer overflow for |
| 6750 // 2 byte strings, since it is the worst case. | 6691 // 2 byte strings, since it is the worst case. |
| 6751 #if defined(HASH_IN_OBJECT_HEADER) | 6692 #if defined(HASH_IN_OBJECT_HEADER) |
| 6752 static const intptr_t kSizeofRawString = sizeof(RawInstance) + kWordSize; | 6693 static const intptr_t kSizeofRawString = sizeof(RawInstance) + kWordSize; |
| 6753 #else | 6694 #else |
| 6754 static const intptr_t kSizeofRawString = sizeof(RawInstance) + 2 * kWordSize; | 6695 static const intptr_t kSizeofRawString = sizeof(RawInstance) + 2 * kWordSize; |
| 6755 #endif | 6696 #endif |
| 6756 static const intptr_t kMaxElements = kSmiMax / kTwoByteChar; | 6697 static const intptr_t kMaxElements = kSmiMax / kTwoByteChar; |
| 6757 | 6698 |
| 6758 class CodePointIterator : public ValueObject { | 6699 class CodePointIterator : public ValueObject { |
| 6759 public: | 6700 public: |
| 6760 explicit CodePointIterator(const String& str) | 6701 explicit CodePointIterator(const String& str) |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7074 friend class OneByteString; | 7015 friend class OneByteString; |
| 7075 friend class TwoByteString; | 7016 friend class TwoByteString; |
| 7076 friend class ExternalOneByteString; | 7017 friend class ExternalOneByteString; |
| 7077 friend class ExternalTwoByteString; | 7018 friend class ExternalTwoByteString; |
| 7078 // So that SkippedCodeFunctions can print a debug string from a NoHandleScope. | 7019 // So that SkippedCodeFunctions can print a debug string from a NoHandleScope. |
| 7079 friend class SkippedCodeFunctions; | 7020 friend class SkippedCodeFunctions; |
| 7080 friend class RawOneByteString; | 7021 friend class RawOneByteString; |
| 7081 friend class RODataSerializationCluster; // SetHash | 7022 friend class RODataSerializationCluster; // SetHash |
| 7082 }; | 7023 }; |
| 7083 | 7024 |
| 7084 | |
| 7085 class OneByteString : public AllStatic { | 7025 class OneByteString : public AllStatic { |
| 7086 public: | 7026 public: |
| 7087 static uint16_t CharAt(const String& str, intptr_t index) { | 7027 static uint16_t CharAt(const String& str, intptr_t index) { |
| 7088 ASSERT((index >= 0) && (index < str.Length())); | 7028 ASSERT((index >= 0) && (index < str.Length())); |
| 7089 ASSERT(str.IsOneByteString()); | 7029 ASSERT(str.IsOneByteString()); |
| 7090 return raw_ptr(str)->data()[index]; | 7030 return raw_ptr(str)->data()[index]; |
| 7091 } | 7031 } |
| 7092 | 7032 |
| 7093 static void SetCharAt(const String& str, intptr_t index, uint8_t code_unit) { | 7033 static void SetCharAt(const String& str, intptr_t index, uint8_t code_unit) { |
| 7094 NoSafepointScope no_safepoint; | 7034 NoSafepointScope no_safepoint; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7211 bool as_reference); | 7151 bool as_reference); |
| 7212 | 7152 |
| 7213 friend class Class; | 7153 friend class Class; |
| 7214 friend class String; | 7154 friend class String; |
| 7215 friend class Symbols; | 7155 friend class Symbols; |
| 7216 friend class ExternalOneByteString; | 7156 friend class ExternalOneByteString; |
| 7217 friend class SnapshotReader; | 7157 friend class SnapshotReader; |
| 7218 friend class StringHasher; | 7158 friend class StringHasher; |
| 7219 }; | 7159 }; |
| 7220 | 7160 |
| 7221 | |
| 7222 class TwoByteString : public AllStatic { | 7161 class TwoByteString : public AllStatic { |
| 7223 public: | 7162 public: |
| 7224 static uint16_t CharAt(const String& str, intptr_t index) { | 7163 static uint16_t CharAt(const String& str, intptr_t index) { |
| 7225 ASSERT((index >= 0) && (index < str.Length())); | 7164 ASSERT((index >= 0) && (index < str.Length())); |
| 7226 ASSERT(str.IsTwoByteString()); | 7165 ASSERT(str.IsTwoByteString()); |
| 7227 return raw_ptr(str)->data()[index]; | 7166 return raw_ptr(str)->data()[index]; |
| 7228 } | 7167 } |
| 7229 | 7168 |
| 7230 static void SetCharAt(const String& str, intptr_t index, uint16_t ch) { | 7169 static void SetCharAt(const String& str, intptr_t index, uint16_t ch) { |
| 7231 NoSafepointScope no_safepoint; | 7170 NoSafepointScope no_safepoint; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7298 Dart_PeerFinalizer cback); | 7237 Dart_PeerFinalizer cback); |
| 7299 | 7238 |
| 7300 static void Finalize(void* isolate_callback_data, | 7239 static void Finalize(void* isolate_callback_data, |
| 7301 Dart_WeakPersistentHandle handle, | 7240 Dart_WeakPersistentHandle handle, |
| 7302 void* peer); | 7241 void* peer); |
| 7303 | 7242 |
| 7304 static RawTwoByteString* null() { | 7243 static RawTwoByteString* null() { |
| 7305 return reinterpret_cast<RawTwoByteString*>(Object::null()); | 7244 return reinterpret_cast<RawTwoByteString*>(Object::null()); |
| 7306 } | 7245 } |
| 7307 | 7246 |
| 7308 | |
| 7309 static const ClassId kClassId = kTwoByteStringCid; | 7247 static const ClassId kClassId = kTwoByteStringCid; |
| 7310 | 7248 |
| 7311 private: | 7249 private: |
| 7312 static RawTwoByteString* raw(const String& str) { | 7250 static RawTwoByteString* raw(const String& str) { |
| 7313 return reinterpret_cast<RawTwoByteString*>(str.raw()); | 7251 return reinterpret_cast<RawTwoByteString*>(str.raw()); |
| 7314 } | 7252 } |
| 7315 | 7253 |
| 7316 static const RawTwoByteString* raw_ptr(const String& str) { | 7254 static const RawTwoByteString* raw_ptr(const String& str) { |
| 7317 return reinterpret_cast<const RawTwoByteString*>(str.raw_ptr()); | 7255 return reinterpret_cast<const RawTwoByteString*>(str.raw_ptr()); |
| 7318 } | 7256 } |
| 7319 | 7257 |
| 7320 static uint16_t* CharAddr(const String& str, intptr_t index) { | 7258 static uint16_t* CharAddr(const String& str, intptr_t index) { |
| 7321 ASSERT((index >= 0) && (index < str.Length())); | 7259 ASSERT((index >= 0) && (index < str.Length())); |
| 7322 ASSERT(str.IsTwoByteString()); | 7260 ASSERT(str.IsTwoByteString()); |
| 7323 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[index]; | 7261 return &str.UnsafeMutableNonPointer(raw_ptr(str)->data())[index]; |
| 7324 } | 7262 } |
| 7325 | 7263 |
| 7326 static RawTwoByteString* ReadFrom(SnapshotReader* reader, | 7264 static RawTwoByteString* ReadFrom(SnapshotReader* reader, |
| 7327 intptr_t object_id, | 7265 intptr_t object_id, |
| 7328 intptr_t tags, | 7266 intptr_t tags, |
| 7329 Snapshot::Kind kind, | 7267 Snapshot::Kind kind, |
| 7330 bool as_reference); | 7268 bool as_reference); |
| 7331 | 7269 |
| 7332 friend class Class; | 7270 friend class Class; |
| 7333 friend class String; | 7271 friend class String; |
| 7334 friend class SnapshotReader; | 7272 friend class SnapshotReader; |
| 7335 friend class Symbols; | 7273 friend class Symbols; |
| 7336 }; | 7274 }; |
| 7337 | 7275 |
| 7338 | |
| 7339 class ExternalOneByteString : public AllStatic { | 7276 class ExternalOneByteString : public AllStatic { |
| 7340 public: | 7277 public: |
| 7341 static uint16_t CharAt(const String& str, intptr_t index) { | 7278 static uint16_t CharAt(const String& str, intptr_t index) { |
| 7342 NoSafepointScope no_safepoint; | 7279 NoSafepointScope no_safepoint; |
| 7343 return *CharAddr(str, index); | 7280 return *CharAddr(str, index); |
| 7344 } | 7281 } |
| 7345 | 7282 |
| 7346 static void* GetPeer(const String& str) { | 7283 static void* GetPeer(const String& str) { |
| 7347 return raw_ptr(str)->external_data_->peer(); | 7284 return raw_ptr(str)->external_data_->peer(); |
| 7348 } | 7285 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7412 // Indicates this class cannot be extended by dart code. | 7349 // Indicates this class cannot be extended by dart code. |
| 7413 return -kWordSize; | 7350 return -kWordSize; |
| 7414 } | 7351 } |
| 7415 | 7352 |
| 7416 friend class Class; | 7353 friend class Class; |
| 7417 friend class String; | 7354 friend class String; |
| 7418 friend class SnapshotReader; | 7355 friend class SnapshotReader; |
| 7419 friend class Symbols; | 7356 friend class Symbols; |
| 7420 }; | 7357 }; |
| 7421 | 7358 |
| 7422 | |
| 7423 class ExternalTwoByteString : public AllStatic { | 7359 class ExternalTwoByteString : public AllStatic { |
| 7424 public: | 7360 public: |
| 7425 static uint16_t CharAt(const String& str, intptr_t index) { | 7361 static uint16_t CharAt(const String& str, intptr_t index) { |
| 7426 NoSafepointScope no_safepoint; | 7362 NoSafepointScope no_safepoint; |
| 7427 return *CharAddr(str, index); | 7363 return *CharAddr(str, index); |
| 7428 } | 7364 } |
| 7429 | 7365 |
| 7430 static void* GetPeer(const String& str) { | 7366 static void* GetPeer(const String& str) { |
| 7431 return raw_ptr(str)->external_data_->peer(); | 7367 return raw_ptr(str)->external_data_->peer(); |
| 7432 } | 7368 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7492 // Indicates this class cannot be extended by dart code. | 7428 // Indicates this class cannot be extended by dart code. |
| 7493 return -kWordSize; | 7429 return -kWordSize; |
| 7494 } | 7430 } |
| 7495 | 7431 |
| 7496 friend class Class; | 7432 friend class Class; |
| 7497 friend class String; | 7433 friend class String; |
| 7498 friend class SnapshotReader; | 7434 friend class SnapshotReader; |
| 7499 friend class Symbols; | 7435 friend class Symbols; |
| 7500 }; | 7436 }; |
| 7501 | 7437 |
| 7502 | |
| 7503 // Class Bool implements Dart core class bool. | 7438 // Class Bool implements Dart core class bool. |
| 7504 class Bool : public Instance { | 7439 class Bool : public Instance { |
| 7505 public: | 7440 public: |
| 7506 bool value() const { return raw_ptr()->value_; } | 7441 bool value() const { return raw_ptr()->value_; } |
| 7507 | 7442 |
| 7508 static intptr_t InstanceSize() { | 7443 static intptr_t InstanceSize() { |
| 7509 return RoundedAllocationSize(sizeof(RawBool)); | 7444 return RoundedAllocationSize(sizeof(RawBool)); |
| 7510 } | 7445 } |
| 7511 | 7446 |
| 7512 static const Bool& True() { return Object::bool_true(); } | 7447 static const Bool& True() { return Object::bool_true(); } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 7523 } | 7458 } |
| 7524 | 7459 |
| 7525 // New should only be called to initialize the two legal bool values. | 7460 // New should only be called to initialize the two legal bool values. |
| 7526 static RawBool* New(bool value); | 7461 static RawBool* New(bool value); |
| 7527 | 7462 |
| 7528 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bool, Instance); | 7463 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bool, Instance); |
| 7529 friend class Class; | 7464 friend class Class; |
| 7530 friend class Object; // To initialize the true and false values. | 7465 friend class Object; // To initialize the true and false values. |
| 7531 }; | 7466 }; |
| 7532 | 7467 |
| 7533 | |
| 7534 class Array : public Instance { | 7468 class Array : public Instance { |
| 7535 public: | 7469 public: |
| 7536 // We use 30 bits for the hash code so hashes in a snapshot taken on a | 7470 // We use 30 bits for the hash code so hashes in a snapshot taken on a |
| 7537 // 64-bit architecture stay in Smi range when loaded on a 32-bit | 7471 // 64-bit architecture stay in Smi range when loaded on a 32-bit |
| 7538 // architecture. | 7472 // architecture. |
| 7539 static const intptr_t kHashBits = 30; | 7473 static const intptr_t kHashBits = 30; |
| 7540 | 7474 |
| 7541 intptr_t Length() const { | 7475 intptr_t Length() const { |
| 7542 ASSERT(!IsNull()); | 7476 ASSERT(!IsNull()); |
| 7543 return Smi::Value(raw_ptr()->length_); | 7477 return Smi::Value(raw_ptr()->length_); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7647 StoreSmi(&raw_ptr()->length_, Smi::New(value)); | 7581 StoreSmi(&raw_ptr()->length_, Smi::New(value)); |
| 7648 } | 7582 } |
| 7649 | 7583 |
| 7650 FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance); | 7584 FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance); |
| 7651 friend class Class; | 7585 friend class Class; |
| 7652 friend class ImmutableArray; | 7586 friend class ImmutableArray; |
| 7653 friend class Object; | 7587 friend class Object; |
| 7654 friend class String; | 7588 friend class String; |
| 7655 }; | 7589 }; |
| 7656 | 7590 |
| 7657 | |
| 7658 class ImmutableArray : public AllStatic { | 7591 class ImmutableArray : public AllStatic { |
| 7659 public: | 7592 public: |
| 7660 static RawImmutableArray* New(intptr_t len, Heap::Space space = Heap::kNew); | 7593 static RawImmutableArray* New(intptr_t len, Heap::Space space = Heap::kNew); |
| 7661 | 7594 |
| 7662 static RawImmutableArray* ReadFrom(SnapshotReader* reader, | 7595 static RawImmutableArray* ReadFrom(SnapshotReader* reader, |
| 7663 intptr_t object_id, | 7596 intptr_t object_id, |
| 7664 intptr_t tags, | 7597 intptr_t tags, |
| 7665 Snapshot::Kind kind, | 7598 Snapshot::Kind kind, |
| 7666 bool as_reference); | 7599 bool as_reference); |
| 7667 | 7600 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 7679 return -kWordSize; | 7612 return -kWordSize; |
| 7680 } | 7613 } |
| 7681 | 7614 |
| 7682 static RawImmutableArray* raw(const Array& array) { | 7615 static RawImmutableArray* raw(const Array& array) { |
| 7683 return reinterpret_cast<RawImmutableArray*>(array.raw()); | 7616 return reinterpret_cast<RawImmutableArray*>(array.raw()); |
| 7684 } | 7617 } |
| 7685 | 7618 |
| 7686 friend class Class; | 7619 friend class Class; |
| 7687 }; | 7620 }; |
| 7688 | 7621 |
| 7689 | |
| 7690 class GrowableObjectArray : public Instance { | 7622 class GrowableObjectArray : public Instance { |
| 7691 public: | 7623 public: |
| 7692 intptr_t Capacity() const { | 7624 intptr_t Capacity() const { |
| 7693 NoSafepointScope no_safepoint; | 7625 NoSafepointScope no_safepoint; |
| 7694 ASSERT(!IsNull()); | 7626 ASSERT(!IsNull()); |
| 7695 return Smi::Value(DataArray()->length_); | 7627 return Smi::Value(DataArray()->length_); |
| 7696 } | 7628 } |
| 7697 intptr_t Length() const { | 7629 intptr_t Length() const { |
| 7698 ASSERT(!IsNull()); | 7630 ASSERT(!IsNull()); |
| 7699 return Smi::Value(raw_ptr()->length_); | 7631 return Smi::Value(raw_ptr()->length_); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7787 return &(DataArray()->data()[index]); | 7719 return &(DataArray()->data()[index]); |
| 7788 } | 7720 } |
| 7789 | 7721 |
| 7790 static const int kDefaultInitialCapacity = 0; | 7722 static const int kDefaultInitialCapacity = 0; |
| 7791 | 7723 |
| 7792 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); | 7724 FINAL_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray, Instance); |
| 7793 friend class Array; | 7725 friend class Array; |
| 7794 friend class Class; | 7726 friend class Class; |
| 7795 }; | 7727 }; |
| 7796 | 7728 |
| 7797 | |
| 7798 class Float32x4 : public Instance { | 7729 class Float32x4 : public Instance { |
| 7799 public: | 7730 public: |
| 7800 static RawFloat32x4* New(float value0, | 7731 static RawFloat32x4* New(float value0, |
| 7801 float value1, | 7732 float value1, |
| 7802 float value2, | 7733 float value2, |
| 7803 float value3, | 7734 float value3, |
| 7804 Heap::Space space = Heap::kNew); | 7735 Heap::Space space = Heap::kNew); |
| 7805 static RawFloat32x4* New(simd128_value_t value, | 7736 static RawFloat32x4* New(simd128_value_t value, |
| 7806 Heap::Space space = Heap::kNew); | 7737 Heap::Space space = Heap::kNew); |
| 7807 | 7738 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 7822 return RoundedAllocationSize(sizeof(RawFloat32x4)); | 7753 return RoundedAllocationSize(sizeof(RawFloat32x4)); |
| 7823 } | 7754 } |
| 7824 | 7755 |
| 7825 static intptr_t value_offset() { return OFFSET_OF(RawFloat32x4, value_); } | 7756 static intptr_t value_offset() { return OFFSET_OF(RawFloat32x4, value_); } |
| 7826 | 7757 |
| 7827 private: | 7758 private: |
| 7828 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); | 7759 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32x4, Instance); |
| 7829 friend class Class; | 7760 friend class Class; |
| 7830 }; | 7761 }; |
| 7831 | 7762 |
| 7832 | |
| 7833 class Int32x4 : public Instance { | 7763 class Int32x4 : public Instance { |
| 7834 public: | 7764 public: |
| 7835 static RawInt32x4* New(int32_t value0, | 7765 static RawInt32x4* New(int32_t value0, |
| 7836 int32_t value1, | 7766 int32_t value1, |
| 7837 int32_t value2, | 7767 int32_t value2, |
| 7838 int32_t value3, | 7768 int32_t value3, |
| 7839 Heap::Space space = Heap::kNew); | 7769 Heap::Space space = Heap::kNew); |
| 7840 static RawInt32x4* New(simd128_value_t value, Heap::Space space = Heap::kNew); | 7770 static RawInt32x4* New(simd128_value_t value, Heap::Space space = Heap::kNew); |
| 7841 | 7771 |
| 7842 int32_t x() const; | 7772 int32_t x() const; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 7856 return RoundedAllocationSize(sizeof(RawInt32x4)); | 7786 return RoundedAllocationSize(sizeof(RawInt32x4)); |
| 7857 } | 7787 } |
| 7858 | 7788 |
| 7859 static intptr_t value_offset() { return OFFSET_OF(RawInt32x4, value_); } | 7789 static intptr_t value_offset() { return OFFSET_OF(RawInt32x4, value_); } |
| 7860 | 7790 |
| 7861 private: | 7791 private: |
| 7862 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance); | 7792 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32x4, Instance); |
| 7863 friend class Class; | 7793 friend class Class; |
| 7864 }; | 7794 }; |
| 7865 | 7795 |
| 7866 | |
| 7867 class Float64x2 : public Instance { | 7796 class Float64x2 : public Instance { |
| 7868 public: | 7797 public: |
| 7869 static RawFloat64x2* New(double value0, | 7798 static RawFloat64x2* New(double value0, |
| 7870 double value1, | 7799 double value1, |
| 7871 Heap::Space space = Heap::kNew); | 7800 Heap::Space space = Heap::kNew); |
| 7872 static RawFloat64x2* New(simd128_value_t value, | 7801 static RawFloat64x2* New(simd128_value_t value, |
| 7873 Heap::Space space = Heap::kNew); | 7802 Heap::Space space = Heap::kNew); |
| 7874 | 7803 |
| 7875 double x() const; | 7804 double x() const; |
| 7876 double y() const; | 7805 double y() const; |
| 7877 | 7806 |
| 7878 void set_x(double x) const; | 7807 void set_x(double x) const; |
| 7879 void set_y(double y) const; | 7808 void set_y(double y) const; |
| 7880 | 7809 |
| 7881 simd128_value_t value() const; | 7810 simd128_value_t value() const; |
| 7882 void set_value(simd128_value_t value) const; | 7811 void set_value(simd128_value_t value) const; |
| 7883 | 7812 |
| 7884 static intptr_t InstanceSize() { | 7813 static intptr_t InstanceSize() { |
| 7885 return RoundedAllocationSize(sizeof(RawFloat64x2)); | 7814 return RoundedAllocationSize(sizeof(RawFloat64x2)); |
| 7886 } | 7815 } |
| 7887 | 7816 |
| 7888 static intptr_t value_offset() { return OFFSET_OF(RawFloat64x2, value_); } | 7817 static intptr_t value_offset() { return OFFSET_OF(RawFloat64x2, value_); } |
| 7889 | 7818 |
| 7890 private: | 7819 private: |
| 7891 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64x2, Instance); | 7820 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64x2, Instance); |
| 7892 friend class Class; | 7821 friend class Class; |
| 7893 }; | 7822 }; |
| 7894 | 7823 |
| 7895 | |
| 7896 class TypedData : public Instance { | 7824 class TypedData : public Instance { |
| 7897 public: | 7825 public: |
| 7898 // We use 30 bits for the hash code so hashes in a snapshot taken on a | 7826 // We use 30 bits for the hash code so hashes in a snapshot taken on a |
| 7899 // 64-bit architecture stay in Smi range when loaded on a 32-bit | 7827 // 64-bit architecture stay in Smi range when loaded on a 32-bit |
| 7900 // architecture. | 7828 // architecture. |
| 7901 static const intptr_t kHashBits = 30; | 7829 static const intptr_t kHashBits = 30; |
| 7902 | 7830 |
| 7903 intptr_t Length() const { | 7831 intptr_t Length() const { |
| 7904 ASSERT(!IsNull()); | 7832 ASSERT(!IsNull()); |
| 7905 return Smi::Value(raw_ptr()->length_); | 7833 return Smi::Value(raw_ptr()->length_); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8004 dst.LengthInBytes())); | 7932 dst.LengthInBytes())); |
| 8005 { | 7933 { |
| 8006 NoSafepointScope no_safepoint; | 7934 NoSafepointScope no_safepoint; |
| 8007 if (length_in_bytes > 0) { | 7935 if (length_in_bytes > 0) { |
| 8008 memmove(dst.DataAddr(dst_offset_in_bytes), | 7936 memmove(dst.DataAddr(dst_offset_in_bytes), |
| 8009 src.DataAddr(src_offset_in_bytes), length_in_bytes); | 7937 src.DataAddr(src_offset_in_bytes), length_in_bytes); |
| 8010 } | 7938 } |
| 8011 } | 7939 } |
| 8012 } | 7940 } |
| 8013 | 7941 |
| 8014 | |
| 8015 template <typename DstType, typename SrcType> | 7942 template <typename DstType, typename SrcType> |
| 8016 static void ClampedCopy(const DstType& dst, | 7943 static void ClampedCopy(const DstType& dst, |
| 8017 intptr_t dst_offset_in_bytes, | 7944 intptr_t dst_offset_in_bytes, |
| 8018 const SrcType& src, | 7945 const SrcType& src, |
| 8019 intptr_t src_offset_in_bytes, | 7946 intptr_t src_offset_in_bytes, |
| 8020 intptr_t length_in_bytes) { | 7947 intptr_t length_in_bytes) { |
| 8021 ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes, | 7948 ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes, |
| 8022 src.LengthInBytes())); | 7949 src.LengthInBytes())); |
| 8023 ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes, | 7950 ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes, |
| 8024 dst.LengthInBytes())); | 7951 dst.LengthInBytes())); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8063 static const intptr_t kNumElementSizes = | 7990 static const intptr_t kNumElementSizes = |
| 8064 kTypedDataFloat64x2ArrayCid - kTypedDataInt8ArrayCid + 1; | 7991 kTypedDataFloat64x2ArrayCid - kTypedDataInt8ArrayCid + 1; |
| 8065 static const intptr_t element_size_table[kNumElementSizes]; | 7992 static const intptr_t element_size_table[kNumElementSizes]; |
| 8066 | 7993 |
| 8067 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypedData, Instance); | 7994 FINAL_HEAP_OBJECT_IMPLEMENTATION(TypedData, Instance); |
| 8068 friend class Class; | 7995 friend class Class; |
| 8069 friend class ExternalTypedData; | 7996 friend class ExternalTypedData; |
| 8070 friend class TypedDataView; | 7997 friend class TypedDataView; |
| 8071 }; | 7998 }; |
| 8072 | 7999 |
| 8073 | |
| 8074 class ExternalTypedData : public Instance { | 8000 class ExternalTypedData : public Instance { |
| 8075 public: | 8001 public: |
| 8076 intptr_t Length() const { | 8002 intptr_t Length() const { |
| 8077 ASSERT(!IsNull()); | 8003 ASSERT(!IsNull()); |
| 8078 return Smi::Value(raw_ptr()->length_); | 8004 return Smi::Value(raw_ptr()->length_); |
| 8079 } | 8005 } |
| 8080 | 8006 |
| 8081 intptr_t ElementSizeInBytes() const { | 8007 intptr_t ElementSizeInBytes() const { |
| 8082 intptr_t cid = raw()->GetClassId(); | 8008 intptr_t cid = raw()->GetClassId(); |
| 8083 return ElementSizeInBytes(cid); | 8009 return ElementSizeInBytes(cid); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8175 ASSERT( | 8101 ASSERT( |
| 8176 !Isolate::Current()->heap()->Contains(reinterpret_cast<uword>(data))); | 8102 !Isolate::Current()->heap()->Contains(reinterpret_cast<uword>(data))); |
| 8177 StoreNonPointer(&raw_ptr()->data_, data); | 8103 StoreNonPointer(&raw_ptr()->data_, data); |
| 8178 } | 8104 } |
| 8179 | 8105 |
| 8180 private: | 8106 private: |
| 8181 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData, Instance); | 8107 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData, Instance); |
| 8182 friend class Class; | 8108 friend class Class; |
| 8183 }; | 8109 }; |
| 8184 | 8110 |
| 8185 | |
| 8186 class TypedDataView : public AllStatic { | 8111 class TypedDataView : public AllStatic { |
| 8187 public: | 8112 public: |
| 8188 static intptr_t ElementSizeInBytes(const Instance& view_obj) { | 8113 static intptr_t ElementSizeInBytes(const Instance& view_obj) { |
| 8189 ASSERT(!view_obj.IsNull()); | 8114 ASSERT(!view_obj.IsNull()); |
| 8190 intptr_t cid = view_obj.raw()->GetClassId(); | 8115 intptr_t cid = view_obj.raw()->GetClassId(); |
| 8191 return ElementSizeInBytes(cid); | 8116 return ElementSizeInBytes(cid); |
| 8192 } | 8117 } |
| 8193 | 8118 |
| 8194 static RawInstance* Data(const Instance& view_obj) { | 8119 static RawInstance* Data(const Instance& view_obj) { |
| 8195 ASSERT(!view_obj.IsNull()); | 8120 ASSERT(!view_obj.IsNull()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8235 } | 8160 } |
| 8236 | 8161 |
| 8237 private: | 8162 private: |
| 8238 enum { | 8163 enum { |
| 8239 kDataOffset = 1, | 8164 kDataOffset = 1, |
| 8240 kOffsetInBytesOffset = 2, | 8165 kOffsetInBytesOffset = 2, |
| 8241 kLengthOffset = 3, | 8166 kLengthOffset = 3, |
| 8242 }; | 8167 }; |
| 8243 }; | 8168 }; |
| 8244 | 8169 |
| 8245 | |
| 8246 class ByteBuffer : public AllStatic { | 8170 class ByteBuffer : public AllStatic { |
| 8247 public: | 8171 public: |
| 8248 static RawInstance* Data(const Instance& view_obj) { | 8172 static RawInstance* Data(const Instance& view_obj) { |
| 8249 ASSERT(!view_obj.IsNull()); | 8173 ASSERT(!view_obj.IsNull()); |
| 8250 return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() + | 8174 return *reinterpret_cast<RawInstance* const*>(view_obj.raw_ptr() + |
| 8251 kDataOffset); | 8175 kDataOffset); |
| 8252 } | 8176 } |
| 8253 | 8177 |
| 8254 static intptr_t NumberOfFields() { return kDataOffset; } | 8178 static intptr_t NumberOfFields() { return kDataOffset; } |
| 8255 | 8179 |
| 8256 static intptr_t data_offset() { return kWordSize * kDataOffset; } | 8180 static intptr_t data_offset() { return kWordSize * kDataOffset; } |
| 8257 | 8181 |
| 8258 private: | 8182 private: |
| 8259 enum { | 8183 enum { |
| 8260 kDataOffset = 1, | 8184 kDataOffset = 1, |
| 8261 }; | 8185 }; |
| 8262 }; | 8186 }; |
| 8263 | 8187 |
| 8264 | |
| 8265 // Corresponds to | 8188 // Corresponds to |
| 8266 // - "new Map()", | 8189 // - "new Map()", |
| 8267 // - non-const map literals, and | 8190 // - non-const map literals, and |
| 8268 // - the default constructor of LinkedHashMap in dart:collection. | 8191 // - the default constructor of LinkedHashMap in dart:collection. |
| 8269 class LinkedHashMap : public Instance { | 8192 class LinkedHashMap : public Instance { |
| 8270 public: | 8193 public: |
| 8271 static intptr_t InstanceSize() { | 8194 static intptr_t InstanceSize() { |
| 8272 return RoundedAllocationSize(sizeof(RawLinkedHashMap)); | 8195 return RoundedAllocationSize(sizeof(RawLinkedHashMap)); |
| 8273 } | 8196 } |
| 8274 | 8197 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8388 static const intptr_t kInitialIndexSize = 1 << (kInitialIndexBits + 1); | 8311 static const intptr_t kInitialIndexSize = 1 << (kInitialIndexBits + 1); |
| 8389 | 8312 |
| 8390 // Allocate a map, but leave all fields set to null. | 8313 // Allocate a map, but leave all fields set to null. |
| 8391 // Used during deserialization (since map might contain itself as key/value). | 8314 // Used during deserialization (since map might contain itself as key/value). |
| 8392 static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew); | 8315 static RawLinkedHashMap* NewUninitialized(Heap::Space space = Heap::kNew); |
| 8393 | 8316 |
| 8394 friend class Class; | 8317 friend class Class; |
| 8395 friend class LinkedHashMapDeserializationCluster; | 8318 friend class LinkedHashMapDeserializationCluster; |
| 8396 }; | 8319 }; |
| 8397 | 8320 |
| 8398 | |
| 8399 class Closure : public Instance { | 8321 class Closure : public Instance { |
| 8400 public: | 8322 public: |
| 8401 RawTypeArguments* instantiator_type_arguments() const { | 8323 RawTypeArguments* instantiator_type_arguments() const { |
| 8402 return raw_ptr()->instantiator_type_arguments_; | 8324 return raw_ptr()->instantiator_type_arguments_; |
| 8403 } | 8325 } |
| 8404 static intptr_t instantiator_type_arguments_offset() { | 8326 static intptr_t instantiator_type_arguments_offset() { |
| 8405 return OFFSET_OF(RawClosure, instantiator_type_arguments_); | 8327 return OFFSET_OF(RawClosure, instantiator_type_arguments_); |
| 8406 } | 8328 } |
| 8407 | 8329 |
| 8408 RawTypeArguments* function_type_arguments() const { | 8330 RawTypeArguments* function_type_arguments() const { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 8435 const Context& context, | 8357 const Context& context, |
| 8436 Heap::Space space = Heap::kNew); | 8358 Heap::Space space = Heap::kNew); |
| 8437 | 8359 |
| 8438 private: | 8360 private: |
| 8439 static RawClosure* New(); | 8361 static RawClosure* New(); |
| 8440 | 8362 |
| 8441 FINAL_HEAP_OBJECT_IMPLEMENTATION(Closure, Instance); | 8363 FINAL_HEAP_OBJECT_IMPLEMENTATION(Closure, Instance); |
| 8442 friend class Class; | 8364 friend class Class; |
| 8443 }; | 8365 }; |
| 8444 | 8366 |
| 8445 | |
| 8446 class Capability : public Instance { | 8367 class Capability : public Instance { |
| 8447 public: | 8368 public: |
| 8448 uint64_t Id() const { return raw_ptr()->id_; } | 8369 uint64_t Id() const { return raw_ptr()->id_; } |
| 8449 | 8370 |
| 8450 static intptr_t InstanceSize() { | 8371 static intptr_t InstanceSize() { |
| 8451 return RoundedAllocationSize(sizeof(RawCapability)); | 8372 return RoundedAllocationSize(sizeof(RawCapability)); |
| 8452 } | 8373 } |
| 8453 static RawCapability* New(uint64_t id, Heap::Space space = Heap::kNew); | 8374 static RawCapability* New(uint64_t id, Heap::Space space = Heap::kNew); |
| 8454 | 8375 |
| 8455 private: | 8376 private: |
| 8456 FINAL_HEAP_OBJECT_IMPLEMENTATION(Capability, Instance); | 8377 FINAL_HEAP_OBJECT_IMPLEMENTATION(Capability, Instance); |
| 8457 friend class Class; | 8378 friend class Class; |
| 8458 }; | 8379 }; |
| 8459 | 8380 |
| 8460 | |
| 8461 class ReceivePort : public Instance { | 8381 class ReceivePort : public Instance { |
| 8462 public: | 8382 public: |
| 8463 RawSendPort* send_port() const { return raw_ptr()->send_port_; } | 8383 RawSendPort* send_port() const { return raw_ptr()->send_port_; } |
| 8464 Dart_Port Id() const { return send_port()->ptr()->id_; } | 8384 Dart_Port Id() const { return send_port()->ptr()->id_; } |
| 8465 | 8385 |
| 8466 RawInstance* handler() const { return raw_ptr()->handler_; } | 8386 RawInstance* handler() const { return raw_ptr()->handler_; } |
| 8467 void set_handler(const Instance& value) const; | 8387 void set_handler(const Instance& value) const; |
| 8468 | 8388 |
| 8469 static intptr_t InstanceSize() { | 8389 static intptr_t InstanceSize() { |
| 8470 return RoundedAllocationSize(sizeof(RawReceivePort)); | 8390 return RoundedAllocationSize(sizeof(RawReceivePort)); |
| 8471 } | 8391 } |
| 8472 static RawReceivePort* New(Dart_Port id, | 8392 static RawReceivePort* New(Dart_Port id, |
| 8473 bool is_control_port, | 8393 bool is_control_port, |
| 8474 Heap::Space space = Heap::kNew); | 8394 Heap::Space space = Heap::kNew); |
| 8475 | 8395 |
| 8476 private: | 8396 private: |
| 8477 FINAL_HEAP_OBJECT_IMPLEMENTATION(ReceivePort, Instance); | 8397 FINAL_HEAP_OBJECT_IMPLEMENTATION(ReceivePort, Instance); |
| 8478 friend class Class; | 8398 friend class Class; |
| 8479 }; | 8399 }; |
| 8480 | 8400 |
| 8481 | |
| 8482 class SendPort : public Instance { | 8401 class SendPort : public Instance { |
| 8483 public: | 8402 public: |
| 8484 Dart_Port Id() const { return raw_ptr()->id_; } | 8403 Dart_Port Id() const { return raw_ptr()->id_; } |
| 8485 | 8404 |
| 8486 Dart_Port origin_id() const { return raw_ptr()->origin_id_; } | 8405 Dart_Port origin_id() const { return raw_ptr()->origin_id_; } |
| 8487 void set_origin_id(Dart_Port id) const { | 8406 void set_origin_id(Dart_Port id) const { |
| 8488 ASSERT(origin_id() == 0); | 8407 ASSERT(origin_id() == 0); |
| 8489 StoreNonPointer(&(raw_ptr()->origin_id_), id); | 8408 StoreNonPointer(&(raw_ptr()->origin_id_), id); |
| 8490 } | 8409 } |
| 8491 | 8410 |
| 8492 static intptr_t InstanceSize() { | 8411 static intptr_t InstanceSize() { |
| 8493 return RoundedAllocationSize(sizeof(RawSendPort)); | 8412 return RoundedAllocationSize(sizeof(RawSendPort)); |
| 8494 } | 8413 } |
| 8495 static RawSendPort* New(Dart_Port id, Heap::Space space = Heap::kNew); | 8414 static RawSendPort* New(Dart_Port id, Heap::Space space = Heap::kNew); |
| 8496 static RawSendPort* New(Dart_Port id, | 8415 static RawSendPort* New(Dart_Port id, |
| 8497 Dart_Port origin_id, | 8416 Dart_Port origin_id, |
| 8498 Heap::Space space = Heap::kNew); | 8417 Heap::Space space = Heap::kNew); |
| 8499 | 8418 |
| 8500 private: | 8419 private: |
| 8501 FINAL_HEAP_OBJECT_IMPLEMENTATION(SendPort, Instance); | 8420 FINAL_HEAP_OBJECT_IMPLEMENTATION(SendPort, Instance); |
| 8502 friend class Class; | 8421 friend class Class; |
| 8503 }; | 8422 }; |
| 8504 | 8423 |
| 8505 | |
| 8506 // Internal stacktrace object used in exceptions for printing stack traces. | 8424 // Internal stacktrace object used in exceptions for printing stack traces. |
| 8507 class StackTrace : public Instance { | 8425 class StackTrace : public Instance { |
| 8508 public: | 8426 public: |
| 8509 static const int kPreallocatedStackdepth = 30; | 8427 static const int kPreallocatedStackdepth = 30; |
| 8510 | 8428 |
| 8511 intptr_t Length() const; | 8429 intptr_t Length() const; |
| 8512 | 8430 |
| 8513 RawStackTrace* async_link() const { return raw_ptr()->async_link_; } | 8431 RawStackTrace* async_link() const { return raw_ptr()->async_link_; } |
| 8514 void set_async_link(const StackTrace& async_link) const; | 8432 void set_async_link(const StackTrace& async_link) const; |
| 8515 void set_expand_inlined(bool value) const; | 8433 void set_expand_inlined(bool value) const; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 8540 | 8458 |
| 8541 void set_code_array(const Array& code_array) const; | 8459 void set_code_array(const Array& code_array) const; |
| 8542 void set_pc_offset_array(const Array& pc_offset_array) const; | 8460 void set_pc_offset_array(const Array& pc_offset_array) const; |
| 8543 bool expand_inlined() const; | 8461 bool expand_inlined() const; |
| 8544 | 8462 |
| 8545 FINAL_HEAP_OBJECT_IMPLEMENTATION(StackTrace, Instance); | 8463 FINAL_HEAP_OBJECT_IMPLEMENTATION(StackTrace, Instance); |
| 8546 friend class Class; | 8464 friend class Class; |
| 8547 friend class Debugger; | 8465 friend class Debugger; |
| 8548 }; | 8466 }; |
| 8549 | 8467 |
| 8550 | |
| 8551 // Internal JavaScript regular expression object. | 8468 // Internal JavaScript regular expression object. |
| 8552 class RegExp : public Instance { | 8469 class RegExp : public Instance { |
| 8553 public: | 8470 public: |
| 8554 // Meaning of RegExType: | 8471 // Meaning of RegExType: |
| 8555 // kUninitialized: the type of th regexp has not been initialized yet. | 8472 // kUninitialized: the type of th regexp has not been initialized yet. |
| 8556 // kSimple: A simple pattern to match against, using string indexOf operation. | 8473 // kSimple: A simple pattern to match against, using string indexOf operation. |
| 8557 // kComplex: A complex pattern to match. | 8474 // kComplex: A complex pattern to match. |
| 8558 enum RegExType { | 8475 enum RegExType { |
| 8559 kUnitialized = 0, | 8476 kUnitialized = 0, |
| 8560 kSimple = 1, | 8477 kSimple = 1, |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8681 FlagsBits::update(value, raw_ptr()->type_flags_)); | 8598 FlagsBits::update(value, raw_ptr()->type_flags_)); |
| 8682 } | 8599 } |
| 8683 | 8600 |
| 8684 RegExType type() const { return TypeBits::decode(raw_ptr()->type_flags_); } | 8601 RegExType type() const { return TypeBits::decode(raw_ptr()->type_flags_); } |
| 8685 intptr_t flags() const { return FlagsBits::decode(raw_ptr()->type_flags_); } | 8602 intptr_t flags() const { return FlagsBits::decode(raw_ptr()->type_flags_); } |
| 8686 | 8603 |
| 8687 FINAL_HEAP_OBJECT_IMPLEMENTATION(RegExp, Instance); | 8604 FINAL_HEAP_OBJECT_IMPLEMENTATION(RegExp, Instance); |
| 8688 friend class Class; | 8605 friend class Class; |
| 8689 }; | 8606 }; |
| 8690 | 8607 |
| 8691 | |
| 8692 class WeakProperty : public Instance { | 8608 class WeakProperty : public Instance { |
| 8693 public: | 8609 public: |
| 8694 RawObject* key() const { return raw_ptr()->key_; } | 8610 RawObject* key() const { return raw_ptr()->key_; } |
| 8695 | 8611 |
| 8696 void set_key(const Object& key) const { | 8612 void set_key(const Object& key) const { |
| 8697 StorePointer(&raw_ptr()->key_, key.raw()); | 8613 StorePointer(&raw_ptr()->key_, key.raw()); |
| 8698 } | 8614 } |
| 8699 | 8615 |
| 8700 RawObject* value() const { return raw_ptr()->value_; } | 8616 RawObject* value() const { return raw_ptr()->value_; } |
| 8701 | 8617 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 8713 ASSERT(raw_weak->ptr()->next_ == 0); | 8629 ASSERT(raw_weak->ptr()->next_ == 0); |
| 8714 raw_weak->StorePointer(&(raw_weak->ptr()->key_), Object::null()); | 8630 raw_weak->StorePointer(&(raw_weak->ptr()->key_), Object::null()); |
| 8715 raw_weak->StorePointer(&(raw_weak->ptr()->value_), Object::null()); | 8631 raw_weak->StorePointer(&(raw_weak->ptr()->value_), Object::null()); |
| 8716 } | 8632 } |
| 8717 | 8633 |
| 8718 private: | 8634 private: |
| 8719 FINAL_HEAP_OBJECT_IMPLEMENTATION(WeakProperty, Instance); | 8635 FINAL_HEAP_OBJECT_IMPLEMENTATION(WeakProperty, Instance); |
| 8720 friend class Class; | 8636 friend class Class; |
| 8721 }; | 8637 }; |
| 8722 | 8638 |
| 8723 | |
| 8724 class MirrorReference : public Instance { | 8639 class MirrorReference : public Instance { |
| 8725 public: | 8640 public: |
| 8726 RawObject* referent() const { return raw_ptr()->referent_; } | 8641 RawObject* referent() const { return raw_ptr()->referent_; } |
| 8727 | 8642 |
| 8728 void set_referent(const Object& referent) const { | 8643 void set_referent(const Object& referent) const { |
| 8729 StorePointer(&raw_ptr()->referent_, referent.raw()); | 8644 StorePointer(&raw_ptr()->referent_, referent.raw()); |
| 8730 } | 8645 } |
| 8731 | 8646 |
| 8732 RawAbstractType* GetAbstractTypeReferent() const; | 8647 RawAbstractType* GetAbstractTypeReferent() const; |
| 8733 | 8648 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 8746 | 8661 |
| 8747 static intptr_t InstanceSize() { | 8662 static intptr_t InstanceSize() { |
| 8748 return RoundedAllocationSize(sizeof(RawMirrorReference)); | 8663 return RoundedAllocationSize(sizeof(RawMirrorReference)); |
| 8749 } | 8664 } |
| 8750 | 8665 |
| 8751 private: | 8666 private: |
| 8752 FINAL_HEAP_OBJECT_IMPLEMENTATION(MirrorReference, Instance); | 8667 FINAL_HEAP_OBJECT_IMPLEMENTATION(MirrorReference, Instance); |
| 8753 friend class Class; | 8668 friend class Class; |
| 8754 }; | 8669 }; |
| 8755 | 8670 |
| 8756 | |
| 8757 class UserTag : public Instance { | 8671 class UserTag : public Instance { |
| 8758 public: | 8672 public: |
| 8759 uword tag() const { return raw_ptr()->tag(); } | 8673 uword tag() const { return raw_ptr()->tag(); } |
| 8760 void set_tag(uword t) const { | 8674 void set_tag(uword t) const { |
| 8761 ASSERT(t >= UserTags::kUserTagIdOffset); | 8675 ASSERT(t >= UserTags::kUserTagIdOffset); |
| 8762 ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags); | 8676 ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags); |
| 8763 StoreNonPointer(&raw_ptr()->tag_, t); | 8677 StoreNonPointer(&raw_ptr()->tag_, t); |
| 8764 } | 8678 } |
| 8765 static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); } | 8679 static intptr_t tag_offset() { return OFFSET_OF(RawUserTag, tag_); } |
| 8766 | 8680 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 8783 static void AddTagToIsolate(Thread* thread, const UserTag& tag); | 8697 static void AddTagToIsolate(Thread* thread, const UserTag& tag); |
| 8784 | 8698 |
| 8785 void set_label(const String& tag_label) const { | 8699 void set_label(const String& tag_label) const { |
| 8786 StorePointer(&raw_ptr()->label_, tag_label.raw()); | 8700 StorePointer(&raw_ptr()->label_, tag_label.raw()); |
| 8787 } | 8701 } |
| 8788 | 8702 |
| 8789 FINAL_HEAP_OBJECT_IMPLEMENTATION(UserTag, Instance); | 8703 FINAL_HEAP_OBJECT_IMPLEMENTATION(UserTag, Instance); |
| 8790 friend class Class; | 8704 friend class Class; |
| 8791 }; | 8705 }; |
| 8792 | 8706 |
| 8793 | |
| 8794 class ObjectPoolInfo : public ValueObject { | 8707 class ObjectPoolInfo : public ValueObject { |
| 8795 public: | 8708 public: |
| 8796 explicit ObjectPoolInfo(const ObjectPool& pool) | 8709 explicit ObjectPoolInfo(const ObjectPool& pool) |
| 8797 : array_(TypedData::Handle(pool.info_array())) {} | 8710 : array_(TypedData::Handle(pool.info_array())) {} |
| 8798 | 8711 |
| 8799 explicit ObjectPoolInfo(const TypedData& info_array) : array_(info_array) {} | 8712 explicit ObjectPoolInfo(const TypedData& info_array) : array_(info_array) {} |
| 8800 | 8713 |
| 8801 ObjectPool::EntryType InfoAt(intptr_t i) { | 8714 ObjectPool::EntryType InfoAt(intptr_t i) { |
| 8802 return static_cast<ObjectPool::EntryType>(array_.GetInt8(i)); | 8715 return static_cast<ObjectPool::EntryType>(array_.GetInt8(i)); |
| 8803 } | 8716 } |
| 8804 | 8717 |
| 8805 void SetInfoAt(intptr_t i, ObjectPool::EntryType info) { | 8718 void SetInfoAt(intptr_t i, ObjectPool::EntryType info) { |
| 8806 array_.SetInt8(i, static_cast<int8_t>(info)); | 8719 array_.SetInt8(i, static_cast<int8_t>(info)); |
| 8807 } | 8720 } |
| 8808 | 8721 |
| 8809 private: | 8722 private: |
| 8810 const TypedData& array_; | 8723 const TypedData& array_; |
| 8811 }; | 8724 }; |
| 8812 | 8725 |
| 8813 | |
| 8814 // Breaking cycles and loops. | 8726 // Breaking cycles and loops. |
| 8815 RawClass* Object::clazz() const { | 8727 RawClass* Object::clazz() const { |
| 8816 uword raw_value = reinterpret_cast<uword>(raw_); | 8728 uword raw_value = reinterpret_cast<uword>(raw_); |
| 8817 if ((raw_value & kSmiTagMask) == kSmiTag) { | 8729 if ((raw_value & kSmiTagMask) == kSmiTag) { |
| 8818 return Smi::Class(); | 8730 return Smi::Class(); |
| 8819 } | 8731 } |
| 8820 return Isolate::Current()->class_table()->At(raw()->GetClassId()); | 8732 return Isolate::Current()->class_table()->At(raw()->GetClassId()); |
| 8821 } | 8733 } |
| 8822 | 8734 |
| 8823 | |
| 8824 DART_FORCE_INLINE void Object::SetRaw(RawObject* value) { | 8735 DART_FORCE_INLINE void Object::SetRaw(RawObject* value) { |
| 8825 NoSafepointScope no_safepoint_scope; | 8736 NoSafepointScope no_safepoint_scope; |
| 8826 raw_ = value; | 8737 raw_ = value; |
| 8827 if ((reinterpret_cast<uword>(value) & kSmiTagMask) == kSmiTag) { | 8738 if ((reinterpret_cast<uword>(value) & kSmiTagMask) == kSmiTag) { |
| 8828 set_vtable(Smi::handle_vtable_); | 8739 set_vtable(Smi::handle_vtable_); |
| 8829 return; | 8740 return; |
| 8830 } | 8741 } |
| 8831 intptr_t cid = value->GetClassId(); | 8742 intptr_t cid = value->GetClassId(); |
| 8832 // Free-list elements cannot be wrapped in a handle. | 8743 // Free-list elements cannot be wrapped in a handle. |
| 8833 ASSERT(cid != kFreeListElement); | 8744 ASSERT(cid != kFreeListElement); |
| 8834 ASSERT(cid != kForwardingCorpse); | 8745 ASSERT(cid != kForwardingCorpse); |
| 8835 if (cid >= kNumPredefinedCids) { | 8746 if (cid >= kNumPredefinedCids) { |
| 8836 cid = kInstanceCid; | 8747 cid = kInstanceCid; |
| 8837 } | 8748 } |
| 8838 set_vtable(builtin_vtables_[cid]); | 8749 set_vtable(builtin_vtables_[cid]); |
| 8839 #if defined(DEBUG) | 8750 #if defined(DEBUG) |
| 8840 if (FLAG_verify_handles) { | 8751 if (FLAG_verify_handles) { |
| 8841 Isolate* isolate = Isolate::Current(); | 8752 Isolate* isolate = Isolate::Current(); |
| 8842 Heap* isolate_heap = isolate->heap(); | 8753 Heap* isolate_heap = isolate->heap(); |
| 8843 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); | 8754 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); |
| 8844 ASSERT(isolate_heap->Contains(RawObject::ToAddr(raw_)) || | 8755 ASSERT(isolate_heap->Contains(RawObject::ToAddr(raw_)) || |
| 8845 vm_isolate_heap->Contains(RawObject::ToAddr(raw_))); | 8756 vm_isolate_heap->Contains(RawObject::ToAddr(raw_))); |
| 8846 } | 8757 } |
| 8847 #endif | 8758 #endif |
| 8848 } | 8759 } |
| 8849 | 8760 |
| 8850 | |
| 8851 intptr_t Field::Offset() const { | 8761 intptr_t Field::Offset() const { |
| 8852 ASSERT(is_instance()); // Valid only for dart instance fields. | 8762 ASSERT(is_instance()); // Valid only for dart instance fields. |
| 8853 intptr_t value = Smi::Value(raw_ptr()->value_.offset_); | 8763 intptr_t value = Smi::Value(raw_ptr()->value_.offset_); |
| 8854 return (value * kWordSize); | 8764 return (value * kWordSize); |
| 8855 } | 8765 } |
| 8856 | 8766 |
| 8857 | |
| 8858 void Field::SetOffset(intptr_t offset_in_bytes) const { | 8767 void Field::SetOffset(intptr_t offset_in_bytes) const { |
| 8859 ASSERT(is_instance()); // Valid only for dart instance fields. | 8768 ASSERT(is_instance()); // Valid only for dart instance fields. |
| 8860 ASSERT(kWordSize != 0); | 8769 ASSERT(kWordSize != 0); |
| 8861 StorePointer(&raw_ptr()->value_.offset_, | 8770 StorePointer(&raw_ptr()->value_.offset_, |
| 8862 Smi::New(offset_in_bytes / kWordSize)); | 8771 Smi::New(offset_in_bytes / kWordSize)); |
| 8863 } | 8772 } |
| 8864 | 8773 |
| 8865 | |
| 8866 RawInstance* Field::StaticValue() const { | 8774 RawInstance* Field::StaticValue() const { |
| 8867 ASSERT(is_static()); // Valid only for static dart fields. | 8775 ASSERT(is_static()); // Valid only for static dart fields. |
| 8868 return raw_ptr()->value_.static_value_; | 8776 return raw_ptr()->value_.static_value_; |
| 8869 } | 8777 } |
| 8870 | 8778 |
| 8871 | |
| 8872 void Field::SetStaticValue(const Instance& value, | 8779 void Field::SetStaticValue(const Instance& value, |
| 8873 bool save_initial_value) const { | 8780 bool save_initial_value) const { |
| 8874 ASSERT(Thread::Current()->IsMutatorThread()); | 8781 ASSERT(Thread::Current()->IsMutatorThread()); |
| 8875 ASSERT(is_static()); // Valid only for static dart fields. | 8782 ASSERT(is_static()); // Valid only for static dart fields. |
| 8876 StorePointer(&raw_ptr()->value_.static_value_, value.raw()); | 8783 StorePointer(&raw_ptr()->value_.static_value_, value.raw()); |
| 8877 if (save_initial_value) { | 8784 if (save_initial_value) { |
| 8878 ASSERT(!HasPrecompiledInitializer()); | 8785 ASSERT(!HasPrecompiledInitializer()); |
| 8879 StorePointer(&raw_ptr()->initializer_.saved_value_, value.raw()); | 8786 StorePointer(&raw_ptr()->initializer_.saved_value_, value.raw()); |
| 8880 } | 8787 } |
| 8881 } | 8788 } |
| 8882 | 8789 |
| 8883 | |
| 8884 void Context::SetAt(intptr_t index, const Object& value) const { | 8790 void Context::SetAt(intptr_t index, const Object& value) const { |
| 8885 StorePointer(ObjectAddr(index), value.raw()); | 8791 StorePointer(ObjectAddr(index), value.raw()); |
| 8886 } | 8792 } |
| 8887 | 8793 |
| 8888 | |
| 8889 intptr_t Instance::GetNativeField(int index) const { | 8794 intptr_t Instance::GetNativeField(int index) const { |
| 8890 ASSERT(IsValidNativeIndex(index)); | 8795 ASSERT(IsValidNativeIndex(index)); |
| 8891 NoSafepointScope no_safepoint; | 8796 NoSafepointScope no_safepoint; |
| 8892 RawTypedData* native_fields = | 8797 RawTypedData* native_fields = |
| 8893 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr()); | 8798 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr()); |
| 8894 if (native_fields == TypedData::null()) { | 8799 if (native_fields == TypedData::null()) { |
| 8895 return 0; | 8800 return 0; |
| 8896 } | 8801 } |
| 8897 return reinterpret_cast<intptr_t*>(native_fields->ptr()->data())[index]; | 8802 return reinterpret_cast<intptr_t*>(native_fields->ptr()->data())[index]; |
| 8898 } | 8803 } |
| 8899 | 8804 |
| 8900 | |
| 8901 void Instance::GetNativeFields(uint16_t num_fields, | 8805 void Instance::GetNativeFields(uint16_t num_fields, |
| 8902 intptr_t* field_values) const { | 8806 intptr_t* field_values) const { |
| 8903 NoSafepointScope no_safepoint; | 8807 NoSafepointScope no_safepoint; |
| 8904 ASSERT(num_fields == NumNativeFields()); | 8808 ASSERT(num_fields == NumNativeFields()); |
| 8905 ASSERT(field_values != NULL); | 8809 ASSERT(field_values != NULL); |
| 8906 RawTypedData* native_fields = | 8810 RawTypedData* native_fields = |
| 8907 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr()); | 8811 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr()); |
| 8908 if (native_fields == TypedData::null()) { | 8812 if (native_fields == TypedData::null()) { |
| 8909 for (intptr_t i = 0; i < num_fields; i++) { | 8813 for (intptr_t i = 0; i < num_fields; i++) { |
| 8910 field_values[i] = 0; | 8814 field_values[i] = 0; |
| 8911 } | 8815 } |
| 8912 } | 8816 } |
| 8913 intptr_t* fields = reinterpret_cast<intptr_t*>(native_fields->ptr()->data()); | 8817 intptr_t* fields = reinterpret_cast<intptr_t*>(native_fields->ptr()->data()); |
| 8914 for (intptr_t i = 0; i < num_fields; i++) { | 8818 for (intptr_t i = 0; i < num_fields; i++) { |
| 8915 field_values[i] = fields[i]; | 8819 field_values[i] = fields[i]; |
| 8916 } | 8820 } |
| 8917 } | 8821 } |
| 8918 | 8822 |
| 8919 | |
| 8920 bool String::Equals(const String& str) const { | 8823 bool String::Equals(const String& str) const { |
| 8921 if (raw() == str.raw()) { | 8824 if (raw() == str.raw()) { |
| 8922 return true; // Both handles point to the same raw instance. | 8825 return true; // Both handles point to the same raw instance. |
| 8923 } | 8826 } |
| 8924 if (str.IsNull()) { | 8827 if (str.IsNull()) { |
| 8925 return false; | 8828 return false; |
| 8926 } | 8829 } |
| 8927 if (IsCanonical() && str.IsCanonical()) { | 8830 if (IsCanonical() && str.IsCanonical()) { |
| 8928 return false; // Two symbols that aren't identical aren't equal. | 8831 return false; // Two symbols that aren't identical aren't equal. |
| 8929 } | 8832 } |
| 8930 if (HasHash() && str.HasHash() && (Hash() != str.Hash())) { | 8833 if (HasHash() && str.HasHash() && (Hash() != str.Hash())) { |
| 8931 return false; // Both sides have hash codes and they do not match. | 8834 return false; // Both sides have hash codes and they do not match. |
| 8932 } | 8835 } |
| 8933 return Equals(str, 0, str.Length()); | 8836 return Equals(str, 0, str.Length()); |
| 8934 } | 8837 } |
| 8935 | 8838 |
| 8936 | |
| 8937 intptr_t Library::UrlHash() const { | 8839 intptr_t Library::UrlHash() const { |
| 8938 intptr_t result = String::GetCachedHash(url()); | 8840 intptr_t result = String::GetCachedHash(url()); |
| 8939 ASSERT(result != 0); | 8841 ASSERT(result != 0); |
| 8940 return result; | 8842 return result; |
| 8941 } | 8843 } |
| 8942 | 8844 |
| 8943 | |
| 8944 void MegamorphicCache::SetEntry(const Array& array, | 8845 void MegamorphicCache::SetEntry(const Array& array, |
| 8945 intptr_t index, | 8846 intptr_t index, |
| 8946 const Smi& class_id, | 8847 const Smi& class_id, |
| 8947 const Function& target) { | 8848 const Function& target) { |
| 8948 array.SetAt((index * kEntryLength) + kClassIdIndex, class_id); | 8849 array.SetAt((index * kEntryLength) + kClassIdIndex, class_id); |
| 8949 array.SetAt((index * kEntryLength) + kTargetFunctionIndex, target); | 8850 array.SetAt((index * kEntryLength) + kTargetFunctionIndex, target); |
| 8950 } | 8851 } |
| 8951 | 8852 |
| 8952 | |
| 8953 RawObject* MegamorphicCache::GetClassId(const Array& array, intptr_t index) { | 8853 RawObject* MegamorphicCache::GetClassId(const Array& array, intptr_t index) { |
| 8954 return array.At((index * kEntryLength) + kClassIdIndex); | 8854 return array.At((index * kEntryLength) + kClassIdIndex); |
| 8955 } | 8855 } |
| 8956 | 8856 |
| 8957 | |
| 8958 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 8857 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
| 8959 intptr_t index) { | 8858 intptr_t index) { |
| 8960 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 8859 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
| 8961 } | 8860 } |
| 8962 | 8861 |
| 8963 | |
| 8964 inline intptr_t Type::Hash() const { | 8862 inline intptr_t Type::Hash() const { |
| 8965 intptr_t result = Smi::Value(raw_ptr()->hash_); | 8863 intptr_t result = Smi::Value(raw_ptr()->hash_); |
| 8966 if (result != 0) { | 8864 if (result != 0) { |
| 8967 return result; | 8865 return result; |
| 8968 } | 8866 } |
| 8969 return ComputeHash(); | 8867 return ComputeHash(); |
| 8970 } | 8868 } |
| 8971 | 8869 |
| 8972 | |
| 8973 inline void Type::SetHash(intptr_t value) const { | 8870 inline void Type::SetHash(intptr_t value) const { |
| 8974 // This is only safe because we create a new Smi, which does not cause | 8871 // This is only safe because we create a new Smi, which does not cause |
| 8975 // heap allocation. | 8872 // heap allocation. |
| 8976 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8873 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 8977 } | 8874 } |
| 8978 | 8875 |
| 8979 | |
| 8980 inline intptr_t TypeParameter::Hash() const { | 8876 inline intptr_t TypeParameter::Hash() const { |
| 8981 ASSERT(IsFinalized()); | 8877 ASSERT(IsFinalized()); |
| 8982 intptr_t result = Smi::Value(raw_ptr()->hash_); | 8878 intptr_t result = Smi::Value(raw_ptr()->hash_); |
| 8983 if (result != 0) { | 8879 if (result != 0) { |
| 8984 return result; | 8880 return result; |
| 8985 } | 8881 } |
| 8986 return ComputeHash(); | 8882 return ComputeHash(); |
| 8987 } | 8883 } |
| 8988 | 8884 |
| 8989 | |
| 8990 inline void TypeParameter::SetHash(intptr_t value) const { | 8885 inline void TypeParameter::SetHash(intptr_t value) const { |
| 8991 // This is only safe because we create a new Smi, which does not cause | 8886 // This is only safe because we create a new Smi, which does not cause |
| 8992 // heap allocation. | 8887 // heap allocation. |
| 8993 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8888 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 8994 } | 8889 } |
| 8995 | 8890 |
| 8996 | |
| 8997 inline intptr_t BoundedType::Hash() const { | 8891 inline intptr_t BoundedType::Hash() const { |
| 8998 intptr_t result = Smi::Value(raw_ptr()->hash_); | 8892 intptr_t result = Smi::Value(raw_ptr()->hash_); |
| 8999 if (result != 0) { | 8893 if (result != 0) { |
| 9000 return result; | 8894 return result; |
| 9001 } | 8895 } |
| 9002 return ComputeHash(); | 8896 return ComputeHash(); |
| 9003 } | 8897 } |
| 9004 | 8898 |
| 9005 | |
| 9006 inline void BoundedType::SetHash(intptr_t value) const { | 8899 inline void BoundedType::SetHash(intptr_t value) const { |
| 9007 // This is only safe because we create a new Smi, which does not cause | 8900 // This is only safe because we create a new Smi, which does not cause |
| 9008 // heap allocation. | 8901 // heap allocation. |
| 9009 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8902 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 9010 } | 8903 } |
| 9011 | 8904 |
| 9012 | |
| 9013 inline intptr_t TypeArguments::Hash() const { | 8905 inline intptr_t TypeArguments::Hash() const { |
| 9014 if (IsNull()) return 0; | 8906 if (IsNull()) return 0; |
| 9015 intptr_t result = Smi::Value(raw_ptr()->hash_); | 8907 intptr_t result = Smi::Value(raw_ptr()->hash_); |
| 9016 if (result != 0) { | 8908 if (result != 0) { |
| 9017 return result; | 8909 return result; |
| 9018 } | 8910 } |
| 9019 return ComputeHash(); | 8911 return ComputeHash(); |
| 9020 } | 8912 } |
| 9021 | 8913 |
| 9022 | |
| 9023 inline void TypeArguments::SetHash(intptr_t value) const { | 8914 inline void TypeArguments::SetHash(intptr_t value) const { |
| 9024 // This is only safe because we create a new Smi, which does not cause | 8915 // This is only safe because we create a new Smi, which does not cause |
| 9025 // heap allocation. | 8916 // heap allocation. |
| 9026 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); | 8917 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); |
| 9027 } | 8918 } |
| 9028 | 8919 |
| 9029 } // namespace dart | 8920 } // namespace dart |
| 9030 | 8921 |
| 9031 #endif // RUNTIME_VM_OBJECT_H_ | 8922 #endif // RUNTIME_VM_OBJECT_H_ |
| OLD | NEW |