Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_OBJECT_H_ | 5 #ifndef VM_OBJECT_H_ |
| 6 #define VM_OBJECT_H_ | 6 #define VM_OBJECT_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
| (...skipping 4112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4123 | 4123 |
| 4124 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnwindError, Error); | 4124 FINAL_HEAP_OBJECT_IMPLEMENTATION(UnwindError, Error); |
| 4125 friend class Class; | 4125 friend class Class; |
| 4126 }; | 4126 }; |
| 4127 | 4127 |
| 4128 | 4128 |
| 4129 // Instance is the base class for all instance objects (aka the Object class | 4129 // Instance is the base class for all instance objects (aka the Object class |
| 4130 // in Dart source code. | 4130 // in Dart source code. |
| 4131 class Instance : public Object { | 4131 class Instance : public Object { |
| 4132 public: | 4132 public: |
| 4133 virtual bool Equals(const Instance& other) const; | 4133 // Equality and identity testing. |
| 4134 // 1. OperatorEquals: true iff 'this == other' is true in Dart code. | |
|
rmacnak
2014/05/12 17:15:17
Reminds me of Self's equivalent (=), indistinguish
koda
2014/05/12 17:41:43
Maybe we should add SameSameButDifferent :)
| |
| 4135 // 2. IsIdenticalTo: true iff 'identical(this, other)' is true in Dart code. | |
| 4136 // 3. CanonicalizeEquals: used to canonicalize compile-time constants, e.g., | |
|
hausner
2014/05/12 17:09:30
Would it make sense to rename this as BitwiseEqual
koda
2014/05/12 17:41:43
That is almost true, but not technically true for
| |
| 4137 // using bitwise equality of fields and list elements. | |
| 4138 // Subclasses where 1 and 3 coincide may also define a plain Equals, e.g., | |
| 4139 // String and Integer. | |
| 4140 virtual bool OperatorEquals(const Instance& other) const; | |
| 4141 bool IsIdenticalTo(const Instance& other) const; | |
| 4142 virtual bool CanonicalizeEquals(const Instance& other) const; | |
| 4143 | |
| 4134 // Returns Instance::null() if instance cannot be canonicalized. | 4144 // Returns Instance::null() if instance cannot be canonicalized. |
| 4135 // Any non-canonical number of string will be canonicalized here. | 4145 // Any non-canonical number of string will be canonicalized here. |
| 4136 // An instance cannot be canonicalized if it still contains non-canonical | 4146 // An instance cannot be canonicalized if it still contains non-canonical |
| 4137 // instances in its fields. | 4147 // instances in its fields. |
| 4138 // Returns error in error_str, pass NULL if an error cannot occur. | 4148 // Returns error in error_str, pass NULL if an error cannot occur. |
| 4139 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; | 4149 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; |
| 4140 | 4150 |
| 4141 // Returns true if all fields are OK for canonicalization. | 4151 // Returns true if all fields are OK for canonicalization. |
| 4142 virtual bool CheckAndCanonicalizeFields(const char** error_str) const; | 4152 virtual bool CheckAndCanonicalizeFields(const char** error_str) const; |
| 4143 | 4153 |
| 4144 RawObject* GetField(const Field& field) const { | 4154 RawObject* GetField(const Field& field) const { |
| 4145 return *FieldAddr(field); | 4155 return *FieldAddr(field); |
| 4146 } | 4156 } |
| 4147 | 4157 |
| 4148 void SetField(const Field& field, const Object& value) const { | 4158 void SetField(const Field& field, const Object& value) const { |
| 4149 field.UpdateGuardedCidAndLength(value); | 4159 field.UpdateGuardedCidAndLength(value); |
| 4150 StorePointer(FieldAddr(field), value.raw()); | 4160 StorePointer(FieldAddr(field), value.raw()); |
| 4151 } | 4161 } |
| 4152 | 4162 |
| 4153 RawType* GetType() const; | 4163 RawType* GetType() const; |
| 4154 | 4164 |
| 4155 virtual RawTypeArguments* GetTypeArguments() const; | 4165 virtual RawTypeArguments* GetTypeArguments() const; |
| 4156 virtual void SetTypeArguments(const TypeArguments& value) const; | 4166 virtual void SetTypeArguments(const TypeArguments& value) const; |
| 4157 | 4167 |
| 4158 // Check if the type of this instance is a subtype of the given type. | 4168 // Check if the type of this instance is a subtype of the given type. |
| 4159 bool IsInstanceOf(const AbstractType& type, | 4169 bool IsInstanceOf(const AbstractType& type, |
| 4160 const TypeArguments& type_instantiator, | 4170 const TypeArguments& type_instantiator, |
| 4161 Error* bound_error) const; | 4171 Error* bound_error) const; |
| 4162 | 4172 |
| 4163 // Check whether this instance is identical to the argument according to the | |
| 4164 // specification of dare:core's identical(). | |
| 4165 bool IsIdenticalTo(const Instance& other) const; | |
| 4166 | |
| 4167 bool IsValidNativeIndex(int index) const { | 4173 bool IsValidNativeIndex(int index) const { |
| 4168 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); | 4174 return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_)); |
| 4169 } | 4175 } |
| 4170 | 4176 |
| 4171 intptr_t* NativeFieldsDataAddr() const; | 4177 intptr_t* NativeFieldsDataAddr() const; |
| 4172 inline intptr_t GetNativeField(int index) const; | 4178 inline intptr_t GetNativeField(int index) const; |
| 4173 inline void GetNativeFields(uint16_t num_fields, | 4179 inline void GetNativeFields(uint16_t num_fields, |
| 4174 intptr_t* field_values) const; | 4180 intptr_t* field_values) const; |
| 4175 | 4181 |
| 4176 uint16_t NumNativeFields() const { | 4182 uint16_t NumNativeFields() const { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4301 virtual bool IsMalformedOrMalbounded() const; | 4307 virtual bool IsMalformedOrMalbounded() const; |
| 4302 virtual RawLanguageError* error() const; | 4308 virtual RawLanguageError* error() const; |
| 4303 virtual void set_error(const LanguageError& value) const; | 4309 virtual void set_error(const LanguageError& value) const; |
| 4304 virtual bool IsResolved() const; | 4310 virtual bool IsResolved() const; |
| 4305 virtual bool HasResolvedTypeClass() const; | 4311 virtual bool HasResolvedTypeClass() const; |
| 4306 virtual RawClass* type_class() const; | 4312 virtual RawClass* type_class() const; |
| 4307 virtual RawUnresolvedClass* unresolved_class() const; | 4313 virtual RawUnresolvedClass* unresolved_class() const; |
| 4308 virtual RawTypeArguments* arguments() const; | 4314 virtual RawTypeArguments* arguments() const; |
| 4309 virtual intptr_t token_pos() const; | 4315 virtual intptr_t token_pos() const; |
| 4310 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; | 4316 virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const; |
| 4317 virtual bool CanonicalizeEquals(const Instance& other) const { | |
| 4318 return Equals(other); | |
| 4319 } | |
| 4311 virtual bool Equals(const Instance& other) const { | 4320 virtual bool Equals(const Instance& other) const { |
| 4312 return IsEquivalent(other); | 4321 return IsEquivalent(other); |
| 4313 } | 4322 } |
| 4314 virtual bool IsEquivalent(const Instance& other, | 4323 virtual bool IsEquivalent(const Instance& other, |
| 4315 GrowableObjectArray* trail = NULL) const; | 4324 GrowableObjectArray* trail = NULL) const; |
| 4316 virtual bool IsRecursive() const; | 4325 virtual bool IsRecursive() const; |
| 4317 | 4326 |
| 4318 // Instantiate this type using the given type argument vector. | 4327 // Instantiate this type using the given type argument vector. |
| 4319 // Return a new type, or return 'this' if it is already instantiated. | 4328 // Return a new type, or return 'this' if it is already instantiated. |
| 4320 // If bound_error is not NULL, it may be set to reflect a bound error. | 4329 // If bound_error is not NULL, it may be set to reflect a bound error. |
| (...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4867 uint64_t value, Heap::Space space = Heap::kNew); | 4876 uint64_t value, Heap::Space space = Heap::kNew); |
| 4868 | 4877 |
| 4869 // Returns a canonical Integer object allocated in the old gen space. | 4878 // Returns a canonical Integer object allocated in the old gen space. |
| 4870 static RawInteger* NewCanonical(const String& str); | 4879 static RawInteger* NewCanonical(const String& str); |
| 4871 | 4880 |
| 4872 // Do not throw JavascriptIntegerOverflow if 'silent' is true. | 4881 // Do not throw JavascriptIntegerOverflow if 'silent' is true. |
| 4873 static RawInteger* New(int64_t value, | 4882 static RawInteger* New(int64_t value, |
| 4874 Heap::Space space = Heap::kNew, | 4883 Heap::Space space = Heap::kNew, |
| 4875 const bool silent = false); | 4884 const bool silent = false); |
| 4876 | 4885 |
| 4886 virtual bool OperatorEquals(const Instance& other) const { | |
| 4887 return Equals(other); | |
| 4888 } | |
| 4889 virtual bool CanonicalizeEquals(const Instance& other) const { | |
| 4890 return Equals(other); | |
| 4891 } | |
| 4892 virtual bool Equals(const Instance& other) const { | |
| 4893 UNREACHABLE(); | |
| 4894 return false; | |
| 4895 } | |
| 4896 | |
| 4877 // Integer is an abstract class. | 4897 // Integer is an abstract class. |
| 4878 virtual bool IsZero() const { | 4898 virtual bool IsZero() const { |
| 4879 UNREACHABLE(); | 4899 UNREACHABLE(); |
| 4880 return false; | 4900 return false; |
| 4881 } | 4901 } |
| 4882 virtual bool IsNegative() const { | 4902 virtual bool IsNegative() const { |
| 4883 // Number is an abstract class. | 4903 // Number is an abstract class. |
| 4884 UNREACHABLE(); | 4904 UNREACHABLE(); |
| 4885 return false; | 4905 return false; |
| 4886 } | 4906 } |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5131 | 5151 |
| 5132 | 5152 |
| 5133 // Class Double represents class Double in corelib_impl, which implements | 5153 // Class Double represents class Double in corelib_impl, which implements |
| 5134 // abstract class double in corelib. | 5154 // abstract class double in corelib. |
| 5135 class Double : public Number { | 5155 class Double : public Number { |
| 5136 public: | 5156 public: |
| 5137 double value() const { | 5157 double value() const { |
| 5138 return raw_ptr()->value_; | 5158 return raw_ptr()->value_; |
| 5139 } | 5159 } |
| 5140 | 5160 |
| 5141 bool EqualsToDouble(double value) const; | 5161 bool BitwiseEqualsToDouble(double value) const; |
| 5142 virtual bool Equals(const Instance& other) const; | 5162 virtual bool OperatorEquals(const Instance& other) const; |
| 5163 virtual bool CanonicalizeEquals(const Instance& other) const; | |
| 5143 | 5164 |
| 5144 static RawDouble* New(double d, Heap::Space space = Heap::kNew); | 5165 static RawDouble* New(double d, Heap::Space space = Heap::kNew); |
| 5145 | 5166 |
| 5146 static RawDouble* New(const String& str, Heap::Space space = Heap::kNew); | 5167 static RawDouble* New(const String& str, Heap::Space space = Heap::kNew); |
| 5147 | 5168 |
| 5148 // Returns a canonical double object allocated in the old gen space. | 5169 // Returns a canonical double object allocated in the old gen space. |
| 5149 static RawDouble* NewCanonical(double d); | 5170 static RawDouble* NewCanonical(double d); |
| 5150 | 5171 |
| 5151 // Returns a canonical double object (allocated in the old gen space) or | 5172 // Returns a canonical double object (allocated in the old gen space) or |
| 5152 // Double::null() if str points to a string that does not convert to a | 5173 // Double::null() if str points to a string that does not convert to a |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5252 | 5273 |
| 5253 // Compares to an array of UTF-8 encoded characters. | 5274 // Compares to an array of UTF-8 encoded characters. |
| 5254 bool Equals(const uint8_t* characters, intptr_t len) const; | 5275 bool Equals(const uint8_t* characters, intptr_t len) const; |
| 5255 | 5276 |
| 5256 // Compares to an array of UTF-16 encoded characters. | 5277 // Compares to an array of UTF-16 encoded characters. |
| 5257 bool Equals(const uint16_t* characters, intptr_t len) const; | 5278 bool Equals(const uint16_t* characters, intptr_t len) const; |
| 5258 | 5279 |
| 5259 // Compares to an array of UTF-32 encoded characters. | 5280 // Compares to an array of UTF-32 encoded characters. |
| 5260 bool Equals(const int32_t* characters, intptr_t len) const; | 5281 bool Equals(const int32_t* characters, intptr_t len) const; |
| 5261 | 5282 |
| 5283 virtual bool OperatorEquals(const Instance& other) const { | |
| 5284 return Equals(other); | |
| 5285 } | |
| 5286 virtual bool CanonicalizeEquals(const Instance& other) const { | |
| 5287 return Equals(other); | |
| 5288 } | |
| 5262 virtual bool Equals(const Instance& other) const; | 5289 virtual bool Equals(const Instance& other) const; |
| 5263 | 5290 |
| 5264 intptr_t CompareTo(const String& other) const; | 5291 intptr_t CompareTo(const String& other) const; |
| 5265 | 5292 |
| 5266 bool StartsWith(const String& other) const; | 5293 bool StartsWith(const String& other) const; |
| 5267 | 5294 |
| 5268 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; | 5295 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; |
| 5269 | 5296 |
| 5270 bool IsSymbol() const { return raw()->IsCanonical(); } | 5297 bool IsSymbol() const { return raw()->IsCanonical(); } |
| 5271 | 5298 |
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5882 return raw_ptr()->type_arguments_; | 5909 return raw_ptr()->type_arguments_; |
| 5883 } | 5910 } |
| 5884 virtual void SetTypeArguments(const TypeArguments& value) const { | 5911 virtual void SetTypeArguments(const TypeArguments& value) const { |
| 5885 // An Array is raw or takes one type argument. However, its type argument | 5912 // An Array is raw or takes one type argument. However, its type argument |
| 5886 // vector may be longer than 1 due to a type optimization reusing the type | 5913 // vector may be longer than 1 due to a type optimization reusing the type |
| 5887 // argument vector of the instantiator. | 5914 // argument vector of the instantiator. |
| 5888 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); | 5915 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); |
| 5889 StorePointer(&raw_ptr()->type_arguments_, value.raw()); | 5916 StorePointer(&raw_ptr()->type_arguments_, value.raw()); |
| 5890 } | 5917 } |
| 5891 | 5918 |
| 5892 virtual bool Equals(const Instance& other) const; | 5919 virtual bool CanonicalizeEquals(const Instance& other) const; |
| 5893 | 5920 |
| 5894 static const intptr_t kBytesPerElement = kWordSize; | 5921 static const intptr_t kBytesPerElement = kWordSize; |
| 5895 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | 5922 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; |
| 5896 | 5923 |
| 5897 static intptr_t type_arguments_offset() { | 5924 static intptr_t type_arguments_offset() { |
| 5898 return OFFSET_OF(RawArray, type_arguments_); | 5925 return OFFSET_OF(RawArray, type_arguments_); |
| 5899 } | 5926 } |
| 5900 | 5927 |
| 5901 static intptr_t InstanceSize() { | 5928 static intptr_t InstanceSize() { |
| 5902 ASSERT(sizeof(RawArray) == OFFSET_OF_RETURNED_VALUE(RawArray, data)); | 5929 ASSERT(sizeof(RawArray) == OFFSET_OF_RETURNED_VALUE(RawArray, data)); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6042 virtual void SetTypeArguments(const TypeArguments& value) const { | 6069 virtual void SetTypeArguments(const TypeArguments& value) const { |
| 6043 // A GrowableObjectArray is raw or takes one type argument. However, its | 6070 // A GrowableObjectArray is raw or takes one type argument. However, its |
| 6044 // type argument vector may be longer than 1 due to a type optimization | 6071 // type argument vector may be longer than 1 due to a type optimization |
| 6045 // reusing the type argument vector of the instantiator. | 6072 // reusing the type argument vector of the instantiator. |
| 6046 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); | 6073 ASSERT(value.IsNull() || ((value.Length() >= 1) && value.IsInstantiated())); |
| 6047 const Array& contents = Array::Handle(data()); | 6074 const Array& contents = Array::Handle(data()); |
| 6048 contents.SetTypeArguments(value); | 6075 contents.SetTypeArguments(value); |
| 6049 StorePointer(&raw_ptr()->type_arguments_, value.raw()); | 6076 StorePointer(&raw_ptr()->type_arguments_, value.raw()); |
| 6050 } | 6077 } |
| 6051 | 6078 |
| 6052 virtual bool Equals(const Instance& other) const; | 6079 virtual bool CanonicalizeEquals(const Instance& other) const; |
| 6053 | 6080 |
| 6054 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { | 6081 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { |
| 6055 UNREACHABLE(); | 6082 UNREACHABLE(); |
| 6056 return Instance::null(); | 6083 return Instance::null(); |
| 6057 } | 6084 } |
| 6058 | 6085 |
| 6059 static intptr_t type_arguments_offset() { | 6086 static intptr_t type_arguments_offset() { |
| 6060 return OFFSET_OF(RawGrowableObjectArray, type_arguments_); | 6087 return OFFSET_OF(RawGrowableObjectArray, type_arguments_); |
| 6061 } | 6088 } |
| 6062 | 6089 |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6753 void set_is_global() const { raw_ptr()->flags_ |= kGlobal; } | 6780 void set_is_global() const { raw_ptr()->flags_ |= kGlobal; } |
| 6754 void set_is_ignore_case() const { raw_ptr()->flags_ |= kIgnoreCase; } | 6781 void set_is_ignore_case() const { raw_ptr()->flags_ |= kIgnoreCase; } |
| 6755 void set_is_multi_line() const { raw_ptr()->flags_ |= kMultiLine; } | 6782 void set_is_multi_line() const { raw_ptr()->flags_ |= kMultiLine; } |
| 6756 void set_is_simple() const { raw_ptr()->type_ = kSimple; } | 6783 void set_is_simple() const { raw_ptr()->type_ = kSimple; } |
| 6757 void set_is_complex() const { raw_ptr()->type_ = kComplex; } | 6784 void set_is_complex() const { raw_ptr()->type_ = kComplex; } |
| 6758 | 6785 |
| 6759 void* GetDataStartAddress() const; | 6786 void* GetDataStartAddress() const; |
| 6760 static RawJSRegExp* FromDataStartAddress(void* data); | 6787 static RawJSRegExp* FromDataStartAddress(void* data); |
| 6761 const char* Flags() const; | 6788 const char* Flags() const; |
| 6762 | 6789 |
| 6763 virtual bool Equals(const Instance& other) const; | 6790 virtual bool CanonicalizeEquals(const Instance& other) const; |
| 6764 | 6791 |
| 6765 static const intptr_t kBytesPerElement = 1; | 6792 static const intptr_t kBytesPerElement = 1; |
| 6766 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | 6793 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; |
| 6767 | 6794 |
| 6768 static intptr_t InstanceSize() { | 6795 static intptr_t InstanceSize() { |
| 6769 ASSERT(sizeof(RawJSRegExp) == OFFSET_OF(RawJSRegExp, data_)); | 6796 ASSERT(sizeof(RawJSRegExp) == OFFSET_OF(RawJSRegExp, data_)); |
| 6770 return 0; | 6797 return 0; |
| 6771 } | 6798 } |
| 6772 | 6799 |
| 6773 static intptr_t InstanceSize(intptr_t len) { | 6800 static intptr_t InstanceSize(intptr_t len) { |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7036 | 7063 |
| 7037 | 7064 |
| 7038 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 7065 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
| 7039 intptr_t index) { | 7066 intptr_t index) { |
| 7040 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 7067 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
| 7041 } | 7068 } |
| 7042 | 7069 |
| 7043 } // namespace dart | 7070 } // namespace dart |
| 7044 | 7071 |
| 7045 #endif // VM_OBJECT_H_ | 7072 #endif // VM_OBJECT_H_ |
| OLD | NEW |