Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: runtime/vm/object.h

Issue 1900863002: Reapply "- Use a hash table to canonicalize instances/arrays to avoid having to iterate over a line… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 // - constants_list_ position of found element, or 1206 // - constants_list_ position of found element, or
1207 // - constants_list_ position where new canonical can be inserted. 1207 // - constants_list_ position where new canonical can be inserted.
1208 RawDouble* LookupCanonicalDouble(Zone* zone, 1208 RawDouble* LookupCanonicalDouble(Zone* zone,
1209 double value, intptr_t* index) const; 1209 double value, intptr_t* index) const;
1210 RawMint* LookupCanonicalMint(Zone* zone, 1210 RawMint* LookupCanonicalMint(Zone* zone,
1211 int64_t value, intptr_t* index) const; 1211 int64_t value, intptr_t* index) const;
1212 RawBigint* LookupCanonicalBigint(Zone* zone, 1212 RawBigint* LookupCanonicalBigint(Zone* zone,
1213 const Bigint& value, intptr_t* index) const; 1213 const Bigint& value, intptr_t* index) const;
1214 // The methods above are more efficient than this generic one. 1214 // The methods above are more efficient than this generic one.
1215 RawInstance* LookupCanonicalInstance(Zone* zone, 1215 RawInstance* LookupCanonicalInstance(Zone* zone,
1216 const Instance& value, 1216 const Instance& value) const;
1217 intptr_t* index) const;
1218 1217
1219 void InsertCanonicalConstant(intptr_t index, const Instance& constant) const; 1218 RawInstance* InsertCanonicalConstant(Zone* zone,
1219 const Instance& constant) const;
1220 void InsertCanonicalNumber(Zone* zone, 1220 void InsertCanonicalNumber(Zone* zone,
1221 intptr_t index, 1221 intptr_t index,
1222 const Number& constant) const; 1222 const Number& constant) const;
1223 1223
1224 intptr_t FindCanonicalTypeIndex(const AbstractType& needle) const; 1224 intptr_t FindCanonicalTypeIndex(const AbstractType& needle) const;
1225 RawAbstractType* CanonicalTypeFromIndex(intptr_t idx) const; 1225 RawAbstractType* CanonicalTypeFromIndex(intptr_t idx) const;
1226 1226
1227 void RehashConstants(Zone* zone) const;
1228
1227 static intptr_t InstanceSize() { 1229 static intptr_t InstanceSize() {
1228 return RoundedAllocationSize(sizeof(RawClass)); 1230 return RoundedAllocationSize(sizeof(RawClass));
1229 } 1231 }
1230 1232
1231 bool is_implemented() const { 1233 bool is_implemented() const {
1232 return ImplementedBit::decode(raw_ptr()->state_bits_); 1234 return ImplementedBit::decode(raw_ptr()->state_bits_);
1233 } 1235 }
1234 void set_is_implemented() const; 1236 void set_is_implemented() const;
1235 1237
1236 bool is_abstract() const { 1238 bool is_abstract() const {
(...skipping 3909 matching lines...) Expand 10 before | Expand all | Expand 10 after
5146 // Equality and identity testing. 5148 // Equality and identity testing.
5147 // 1. OperatorEquals: true iff 'this == other' is true in Dart code. 5149 // 1. OperatorEquals: true iff 'this == other' is true in Dart code.
5148 // 2. IsIdenticalTo: true iff 'identical(this, other)' is true in Dart code. 5150 // 2. IsIdenticalTo: true iff 'identical(this, other)' is true in Dart code.
5149 // 3. CanonicalizeEquals: used to canonicalize compile-time constants, e.g., 5151 // 3. CanonicalizeEquals: used to canonicalize compile-time constants, e.g.,
5150 // using bitwise equality of fields and list elements. 5152 // using bitwise equality of fields and list elements.
5151 // Subclasses where 1 and 3 coincide may also define a plain Equals, e.g., 5153 // Subclasses where 1 and 3 coincide may also define a plain Equals, e.g.,
5152 // String and Integer. 5154 // String and Integer.
5153 virtual bool OperatorEquals(const Instance& other) const; 5155 virtual bool OperatorEquals(const Instance& other) const;
5154 bool IsIdenticalTo(const Instance& other) const; 5156 bool IsIdenticalTo(const Instance& other) const;
5155 virtual bool CanonicalizeEquals(const Instance& other) const; 5157 virtual bool CanonicalizeEquals(const Instance& other) const;
5158 virtual uword ComputeCanonicalTableHash() const;
5159
5160 intptr_t SizeFromClass() const {
5161 #if defined(DEBUG)
5162 const Class& cls = Class::Handle(clazz());
5163 ASSERT(cls.is_finalized() || cls.is_prefinalized());
5164 #endif
5165 return (clazz()->ptr()->instance_size_in_words_ * kWordSize);
5166 }
5156 5167
5157 // Returns Instance::null() if instance cannot be canonicalized. 5168 // Returns Instance::null() if instance cannot be canonicalized.
5158 // Any non-canonical number of string will be canonicalized here. 5169 // Any non-canonical number of string will be canonicalized here.
5159 // An instance cannot be canonicalized if it still contains non-canonical 5170 // An instance cannot be canonicalized if it still contains non-canonical
5160 // instances in its fields. 5171 // instances in its fields.
5161 // Returns error in error_str, pass NULL if an error cannot occur. 5172 // Returns error in error_str, pass NULL if an error cannot occur.
5162 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; 5173 virtual RawInstance* CheckAndCanonicalize(Thread* thread,
5174 const char** error_str) const;
5163 5175
5164 // Returns true if all fields are OK for canonicalization. 5176 // Returns true if all fields are OK for canonicalization.
5165 virtual bool CheckAndCanonicalizeFields(Zone* zone, 5177 virtual bool CheckAndCanonicalizeFields(Thread* thread,
5166 const char** error_str) const; 5178 const char** error_str) const;
5167 5179
5168 RawObject* GetField(const Field& field) const { 5180 RawObject* GetField(const Field& field) const {
5169 return *FieldAddr(field); 5181 return *FieldAddr(field);
5170 } 5182 }
5171 5183
5172 void SetField(const Field& field, const Object& value) const { 5184 void SetField(const Field& field, const Object& value) const {
5173 field.RecordStore(value); 5185 field.RecordStore(value);
5174 StorePointer(FieldAddr(field), value.raw()); 5186 StorePointer(FieldAddr(field), value.raw());
5175 } 5187 }
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
5375 virtual RawAbstractType* CloneUnfinalized() const; 5387 virtual RawAbstractType* CloneUnfinalized() const;
5376 5388
5377 // Return a clone of this uninstantiated type where all references to type 5389 // Return a clone of this uninstantiated type where all references to type
5378 // parameters are replaced with references to type parameters of the same name 5390 // parameters are replaced with references to type parameters of the same name
5379 // but belonging to the new owner class. 5391 // but belonging to the new owner class.
5380 // Apply recursively to type arguments, i.e. instantiated type arguments of 5392 // Apply recursively to type arguments, i.e. instantiated type arguments of
5381 // an uninstantiated type are not cloned, but shared. 5393 // an uninstantiated type are not cloned, but shared.
5382 virtual RawAbstractType* CloneUninstantiated( 5394 virtual RawAbstractType* CloneUninstantiated(
5383 const Class& new_owner, TrailPtr trail = NULL) const; 5395 const Class& new_owner, TrailPtr trail = NULL) const;
5384 5396
5385 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { 5397 virtual RawInstance* CheckAndCanonicalize(Thread* thread,
5398 const char** error_str) const {
5386 return Canonicalize(); 5399 return Canonicalize();
5387 } 5400 }
5388 5401
5389 // Return the canonical version of this type. 5402 // Return the canonical version of this type.
5390 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const; 5403 virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
5391 5404
5392 // Return the object associated with the receiver in the trail or 5405 // Return the object associated with the receiver in the trail or
5393 // AbstractType::null() if the receiver is not contained in the trail. 5406 // AbstractType::null() if the receiver is not contained in the trail.
5394 RawAbstractType* OnlyBuddyInTrail(TrailPtr trail) const; 5407 RawAbstractType* OnlyBuddyInTrail(TrailPtr trail) const;
5395 5408
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
5944 friend class Class; 5957 friend class Class;
5945 }; 5958 };
5946 5959
5947 5960
5948 class Number : public Instance { 5961 class Number : public Instance {
5949 public: 5962 public:
5950 // TODO(iposva): Add more useful Number methods. 5963 // TODO(iposva): Add more useful Number methods.
5951 RawString* ToString(Heap::Space space) const; 5964 RawString* ToString(Heap::Space space) const;
5952 5965
5953 // Numbers are canonicalized differently from other instances/strings. 5966 // Numbers are canonicalized differently from other instances/strings.
5954 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; 5967 virtual RawInstance* CheckAndCanonicalize(Thread* thread,
5968 const char** error_str) const;
5955 5969
5956 private: 5970 private:
5957 OBJECT_IMPLEMENTATION(Number, Instance); 5971 OBJECT_IMPLEMENTATION(Number, Instance);
5958 5972
5959 friend class Class; 5973 friend class Class;
5960 }; 5974 };
5961 5975
5962 5976
5963 class Integer : public Number { 5977 class Integer : public Number {
5964 public: 5978 public:
5965 static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); 5979 static RawInteger* New(const String& str, Heap::Space space = Heap::kNew);
5966 static RawInteger* NewFromUint64(uint64_t value, 5980 static RawInteger* NewFromUint64(uint64_t value,
5967 Heap::Space space = Heap::kNew); 5981 Heap::Space space = Heap::kNew);
5968 5982
5969 // Returns a canonical Integer object allocated in the old gen space. 5983 // Returns a canonical Integer object allocated in the old gen space.
5970 static RawInteger* NewCanonical(const String& str); 5984 static RawInteger* NewCanonical(const String& str);
5971 5985
5972 static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew); 5986 static RawInteger* New(int64_t value, Heap::Space space = Heap::kNew);
5973 5987
5974 virtual bool OperatorEquals(const Instance& other) const { 5988 virtual bool OperatorEquals(const Instance& other) const {
5975 return Equals(other); 5989 return Equals(other);
5976 } 5990 }
5977 virtual bool CanonicalizeEquals(const Instance& other) const { 5991 virtual bool CanonicalizeEquals(const Instance& other) const {
5978 return Equals(other); 5992 return Equals(other);
5979 } 5993 }
5994 virtual uword ComputeCanonicalTableHash() const {
5995 UNREACHABLE();
5996 return 0;
5997 }
5980 virtual bool Equals(const Instance& other) const; 5998 virtual bool Equals(const Instance& other) const;
5981 5999
5982 virtual RawObject* HashCode() const { return raw(); } 6000 virtual RawObject* HashCode() const { return raw(); }
5983 6001
5984 virtual bool IsZero() const; 6002 virtual bool IsZero() const;
5985 virtual bool IsNegative() const; 6003 virtual bool IsNegative() const;
5986 6004
5987 virtual double AsDoubleValue() const; 6005 virtual double AsDoubleValue() const;
5988 virtual int64_t AsInt64Value() const; 6006 virtual int64_t AsInt64Value() const;
5989 virtual int64_t AsTruncatedInt64Value() const { 6007 virtual int64_t AsTruncatedInt64Value() const {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
6155 virtual bool IsNegative() const { return Neg(); } 6173 virtual bool IsNegative() const { return Neg(); }
6156 virtual bool Equals(const Instance& other) const; 6174 virtual bool Equals(const Instance& other) const;
6157 6175
6158 virtual double AsDoubleValue() const; 6176 virtual double AsDoubleValue() const;
6159 virtual int64_t AsInt64Value() const; 6177 virtual int64_t AsInt64Value() const;
6160 virtual int64_t AsTruncatedInt64Value() const; 6178 virtual int64_t AsTruncatedInt64Value() const;
6161 virtual uint32_t AsTruncatedUint32Value() const; 6179 virtual uint32_t AsTruncatedUint32Value() const;
6162 6180
6163 virtual int CompareWith(const Integer& other) const; 6181 virtual int CompareWith(const Integer& other) const;
6164 6182
6165 virtual bool CheckAndCanonicalizeFields(Zone* zone, 6183 virtual bool CheckAndCanonicalizeFields(Thread* thread,
6166 const char** error_str) const; 6184 const char** error_str) const;
6167 6185
6168 virtual bool FitsIntoSmi() const; 6186 virtual bool FitsIntoSmi() const;
6169 bool FitsIntoInt64() const; 6187 bool FitsIntoInt64() const;
6170 bool FitsIntoUint64() const; 6188 bool FitsIntoUint64() const;
6171 uint64_t AsUint64Value() const; 6189 uint64_t AsUint64Value() const;
6172 6190
6173 static intptr_t InstanceSize() { 6191 static intptr_t InstanceSize() {
6174 return RoundedAllocationSize(sizeof(RawBigint)); 6192 return RoundedAllocationSize(sizeof(RawBigint));
6175 } 6193 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
6247 // abstract class double in corelib. 6265 // abstract class double in corelib.
6248 class Double : public Number { 6266 class Double : public Number {
6249 public: 6267 public:
6250 double value() const { 6268 double value() const {
6251 return raw_ptr()->value_; 6269 return raw_ptr()->value_;
6252 } 6270 }
6253 6271
6254 bool BitwiseEqualsToDouble(double value) const; 6272 bool BitwiseEqualsToDouble(double value) const;
6255 virtual bool OperatorEquals(const Instance& other) const; 6273 virtual bool OperatorEquals(const Instance& other) const;
6256 virtual bool CanonicalizeEquals(const Instance& other) const; 6274 virtual bool CanonicalizeEquals(const Instance& other) const;
6275 virtual uword ComputeCanonicalTableHash() const {
6276 UNREACHABLE();
6277 return 0;
6278 }
6257 6279
6258 static RawDouble* New(double d, Heap::Space space = Heap::kNew); 6280 static RawDouble* New(double d, Heap::Space space = Heap::kNew);
6259 6281
6260 static RawDouble* New(const String& str, Heap::Space space = Heap::kNew); 6282 static RawDouble* New(const String& str, Heap::Space space = Heap::kNew);
6261 6283
6262 // Returns a canonical double object allocated in the old gen space. 6284 // Returns a canonical double object allocated in the old gen space.
6263 static RawDouble* NewCanonical(double d); 6285 static RawDouble* NewCanonical(double d);
6264 6286
6265 // Returns a canonical double object (allocated in the old gen space) or 6287 // Returns a canonical double object (allocated in the old gen space) or
6266 // Double::null() if str points to a string that does not convert to a 6288 // Double::null() if str points to a string that does not convert to a
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
6397 6419
6398 // True iff this string equals str1 + str2. 6420 // True iff this string equals str1 + str2.
6399 bool EqualsConcat(const String& str1, const String& str2) const; 6421 bool EqualsConcat(const String& str1, const String& str2) const;
6400 6422
6401 virtual bool OperatorEquals(const Instance& other) const { 6423 virtual bool OperatorEquals(const Instance& other) const {
6402 return Equals(other); 6424 return Equals(other);
6403 } 6425 }
6404 virtual bool CanonicalizeEquals(const Instance& other) const { 6426 virtual bool CanonicalizeEquals(const Instance& other) const {
6405 return Equals(other); 6427 return Equals(other);
6406 } 6428 }
6429 virtual uword ComputeCanonicalTableHash() const {
6430 UNREACHABLE();
6431 return 0;
6432 }
6407 virtual bool Equals(const Instance& other) const; 6433 virtual bool Equals(const Instance& other) const;
6408 6434
6409 intptr_t CompareTo(const String& other) const; 6435 intptr_t CompareTo(const String& other) const;
6410 6436
6411 bool StartsWith(const String& other) const; 6437 bool StartsWith(const String& other) const;
6412 6438
6413 // Strings are canonicalized using the symbol table. 6439 // Strings are canonicalized using the symbol table.
6414 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const; 6440 virtual RawInstance* CheckAndCanonicalize(Thread* thread,
6441 const char** error_str) const;
6415 6442
6416 bool IsSymbol() const { return raw()->IsCanonical(); } 6443 bool IsSymbol() const { return raw()->IsCanonical(); }
6417 6444
6418 bool IsOneByteString() const { 6445 bool IsOneByteString() const {
6419 return raw()->GetClassId() == kOneByteStringCid; 6446 return raw()->GetClassId() == kOneByteStringCid;
6420 } 6447 }
6421 6448
6422 bool IsTwoByteString() const { 6449 bool IsTwoByteString() const {
6423 return raw()->GetClassId() == kTwoByteStringCid; 6450 return raw()->GetClassId() == kTwoByteStringCid;
6424 } 6451 }
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
7086 // argument vector of the instantiator. 7113 // argument vector of the instantiator.
7087 ASSERT(value.IsNull() || 7114 ASSERT(value.IsNull() ||
7088 ((value.Length() >= 1) && 7115 ((value.Length() >= 1) &&
7089 value.IsInstantiated() /*&& value.IsCanonical()*/)); 7116 value.IsInstantiated() /*&& value.IsCanonical()*/));
7090 // TODO(asiva): Values read from a message snapshot are not properly marked 7117 // TODO(asiva): Values read from a message snapshot are not properly marked
7091 // as canonical. See for example tests/isolate/mandel_isolate_test.dart. 7118 // as canonical. See for example tests/isolate/mandel_isolate_test.dart.
7092 StorePointer(&raw_ptr()->type_arguments_, value.raw()); 7119 StorePointer(&raw_ptr()->type_arguments_, value.raw());
7093 } 7120 }
7094 7121
7095 virtual bool CanonicalizeEquals(const Instance& other) const; 7122 virtual bool CanonicalizeEquals(const Instance& other) const;
7123 virtual uword ComputeCanonicalTableHash() const;
7096 7124
7097 static const intptr_t kBytesPerElement = kWordSize; 7125 static const intptr_t kBytesPerElement = kWordSize;
7098 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 7126 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
7099 7127
7100 static intptr_t type_arguments_offset() { 7128 static intptr_t type_arguments_offset() {
7101 return OFFSET_OF(RawArray, type_arguments_); 7129 return OFFSET_OF(RawArray, type_arguments_);
7102 } 7130 }
7103 7131
7104 static intptr_t InstanceSize() { 7132 static intptr_t InstanceSize() {
7105 ASSERT(sizeof(RawArray) == OFFSET_OF_RETURNED_VALUE(RawArray, data)); 7133 ASSERT(sizeof(RawArray) == OFFSET_OF_RETURNED_VALUE(RawArray, data));
7106 return 0; 7134 return 0;
7107 } 7135 }
7108 7136
7109 static intptr_t InstanceSize(intptr_t len) { 7137 static intptr_t InstanceSize(intptr_t len) {
7110 // Ensure that variable length data is not adding to the object length. 7138 // Ensure that variable length data is not adding to the object length.
7111 ASSERT(sizeof(RawArray) == (sizeof(RawInstance) + (2 * kWordSize))); 7139 ASSERT(sizeof(RawArray) == (sizeof(RawInstance) + (2 * kWordSize)));
7112 ASSERT(0 <= len && len <= kMaxElements); 7140 ASSERT(0 <= len && len <= kMaxElements);
7113 return RoundedAllocationSize(sizeof(RawArray) + (len * kBytesPerElement)); 7141 return RoundedAllocationSize(sizeof(RawArray) + (len * kBytesPerElement));
7114 } 7142 }
7115 7143
7116 // Returns true if all elements are OK for canonicalization. 7144 // Returns true if all elements are OK for canonicalization.
7117 virtual bool CheckAndCanonicalizeFields(Zone* zone, 7145 virtual bool CheckAndCanonicalizeFields(Thread* thread,
7118 const char** error_str) const; 7146 const char** error_str) const;
7119 7147
7120 // Make the array immutable to Dart code by switching the class pointer 7148 // Make the array immutable to Dart code by switching the class pointer
7121 // to ImmutableArray. 7149 // to ImmutableArray.
7122 void MakeImmutable() const; 7150 void MakeImmutable() const;
7123 7151
7124 static RawArray* New(intptr_t len, Heap::Space space = Heap::kNew); 7152 static RawArray* New(intptr_t len, Heap::Space space = Heap::kNew);
7125 7153
7126 // Creates and returns a new array with 'new_length'. Copies all elements from 7154 // Creates and returns a new array with 'new_length'. Copies all elements from
7127 // 'source' to the new array. 'new_length' must be greater than or equal to 7155 // 'source' to the new array. 'new_length' must be greater than or equal to
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
7259 const Array& contents = Array::Handle(data()); 7287 const Array& contents = Array::Handle(data());
7260 contents.SetTypeArguments(value); 7288 contents.SetTypeArguments(value);
7261 StorePointer(&raw_ptr()->type_arguments_, value.raw()); 7289 StorePointer(&raw_ptr()->type_arguments_, value.raw());
7262 } 7290 }
7263 7291
7264 // We don't expect a growable object array to be canonicalized. 7292 // We don't expect a growable object array to be canonicalized.
7265 virtual bool CanonicalizeEquals(const Instance& other) const { 7293 virtual bool CanonicalizeEquals(const Instance& other) const {
7266 UNREACHABLE(); 7294 UNREACHABLE();
7267 return false; 7295 return false;
7268 } 7296 }
7297 virtual uword ComputeCanonicalTableHash() const {
7298 UNREACHABLE();
7299 return 0;
7300 }
7269 7301
7270 // We don't expect a growable object array to be canonicalized. 7302 // We don't expect a growable object array to be canonicalized.
7271 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { 7303 virtual RawInstance* CheckAndCanonicalize(Thread* thread,
7304 const char** error_str) const {
7272 UNREACHABLE(); 7305 UNREACHABLE();
7273 return Instance::null(); 7306 return Instance::null();
7274 } 7307 }
7275 7308
7276 static intptr_t type_arguments_offset() { 7309 static intptr_t type_arguments_offset() {
7277 return OFFSET_OF(RawGrowableObjectArray, type_arguments_); 7310 return OFFSET_OF(RawGrowableObjectArray, type_arguments_);
7278 } 7311 }
7279 7312
7280 static intptr_t length_offset() { 7313 static intptr_t length_offset() {
7281 return OFFSET_OF(RawGrowableObjectArray, length_); 7314 return OFFSET_OF(RawGrowableObjectArray, length_);
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
7435 } 7468 }
7436 7469
7437 void* DataAddr(intptr_t byte_offset) const { 7470 void* DataAddr(intptr_t byte_offset) const {
7438 ASSERT((byte_offset == 0) || 7471 ASSERT((byte_offset == 0) ||
7439 ((byte_offset > 0) && (byte_offset < LengthInBytes()))); 7472 ((byte_offset > 0) && (byte_offset < LengthInBytes())));
7440 return reinterpret_cast<void*>( 7473 return reinterpret_cast<void*>(
7441 UnsafeMutableNonPointer(raw_ptr()->data()) + byte_offset); 7474 UnsafeMutableNonPointer(raw_ptr()->data()) + byte_offset);
7442 } 7475 }
7443 7476
7444 virtual bool CanonicalizeEquals(const Instance& other) const; 7477 virtual bool CanonicalizeEquals(const Instance& other) const;
7478 virtual uword ComputeCanonicalTableHash() const;
7445 7479
7446 #define TYPED_GETTER_SETTER(name, type) \ 7480 #define TYPED_GETTER_SETTER(name, type) \
7447 type Get##name(intptr_t byte_offset) const { \ 7481 type Get##name(intptr_t byte_offset) const { \
7448 NoSafepointScope no_safepoint; \ 7482 NoSafepointScope no_safepoint; \
7449 return *reinterpret_cast<type*>(DataAddr(byte_offset)); \ 7483 return *reinterpret_cast<type*>(DataAddr(byte_offset)); \
7450 } \ 7484 } \
7451 void Set##name(intptr_t byte_offset, type value) const { \ 7485 void Set##name(intptr_t byte_offset, type value) const { \
7452 NoSafepointScope no_safepoint; \ 7486 NoSafepointScope no_safepoint; \
7453 *reinterpret_cast<type*>(DataAddr(byte_offset)) = value; \ 7487 *reinterpret_cast<type*>(DataAddr(byte_offset)) = value; \
7454 } 7488 }
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
7950 7984
7951 static intptr_t type_arguments_offset() { 7985 static intptr_t type_arguments_offset() {
7952 return OFFSET_OF(RawClosure, type_arguments_); 7986 return OFFSET_OF(RawClosure, type_arguments_);
7953 } 7987 }
7954 7988
7955 static intptr_t InstanceSize() { 7989 static intptr_t InstanceSize() {
7956 return RoundedAllocationSize(sizeof(RawClosure)); 7990 return RoundedAllocationSize(sizeof(RawClosure));
7957 } 7991 }
7958 7992
7959 // Returns true if all elements are OK for canonicalization. 7993 // Returns true if all elements are OK for canonicalization.
7960 virtual bool CheckAndCanonicalizeFields(Zone* zone, 7994 virtual bool CheckAndCanonicalizeFields(Thread* thread,
7961 const char** error_str) const { 7995 const char** error_str) const {
7962 // None of the fields of a closure are instances. 7996 // None of the fields of a closure are instances.
7963 return true; 7997 return true;
7964 } 7998 }
7965 7999
7966 static RawClosure* New(const Function& function, 8000 static RawClosure* New(const Function& function,
7967 const Context& context, 8001 const Context& context,
7968 Heap::Space space = Heap::kNew); 8002 Heap::Space space = Heap::kNew);
7969 8003
7970 private: 8004 private:
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
8455 8489
8456 8490
8457 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 8491 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
8458 intptr_t index) { 8492 intptr_t index) {
8459 return array.At((index * kEntryLength) + kTargetFunctionIndex); 8493 return array.At((index * kEntryLength) + kTargetFunctionIndex);
8460 } 8494 }
8461 8495
8462 } // namespace dart 8496 } // namespace dart
8463 8497
8464 #endif // VM_OBJECT_H_ 8498 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698