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 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 intptr_t FindClosureIndex(const Function& function) const; | 1023 intptr_t FindClosureIndex(const Function& function) const; |
1024 RawFunction* ClosureFunctionFromIndex(intptr_t idx) const; | 1024 RawFunction* ClosureFunctionFromIndex(intptr_t idx) const; |
1025 | 1025 |
1026 RawFunction* LookupDynamicFunction(const String& name) const; | 1026 RawFunction* LookupDynamicFunction(const String& name) const; |
1027 RawFunction* LookupDynamicFunctionAllowPrivate(const String& name) const; | 1027 RawFunction* LookupDynamicFunctionAllowPrivate(const String& name) const; |
1028 RawFunction* LookupStaticFunction(const String& name) const; | 1028 RawFunction* LookupStaticFunction(const String& name) const; |
1029 RawFunction* LookupStaticFunctionAllowPrivate(const String& name) const; | 1029 RawFunction* LookupStaticFunctionAllowPrivate(const String& name) const; |
1030 RawFunction* LookupConstructor(const String& name) const; | 1030 RawFunction* LookupConstructor(const String& name) const; |
1031 RawFunction* LookupConstructorAllowPrivate(const String& name) const; | 1031 RawFunction* LookupConstructorAllowPrivate(const String& name) const; |
1032 RawFunction* LookupFactory(const String& name) const; | 1032 RawFunction* LookupFactory(const String& name) const; |
| 1033 RawFunction* LookupFactoryAllowPrivate(const String& name) const; |
1033 RawFunction* LookupFunction(const String& name) const; | 1034 RawFunction* LookupFunction(const String& name) const; |
1034 RawFunction* LookupFunctionAllowPrivate(const String& name) const; | 1035 RawFunction* LookupFunctionAllowPrivate(const String& name) const; |
1035 RawFunction* LookupGetterFunction(const String& name) const; | 1036 RawFunction* LookupGetterFunction(const String& name) const; |
1036 RawFunction* LookupSetterFunction(const String& name) const; | 1037 RawFunction* LookupSetterFunction(const String& name) const; |
1037 RawFunction* LookupFunctionAtToken(intptr_t token_pos) const; | 1038 RawFunction* LookupFunctionAtToken(intptr_t token_pos) const; |
1038 RawField* LookupInstanceField(const String& name) const; | 1039 RawField* LookupInstanceField(const String& name) const; |
1039 RawField* LookupStaticField(const String& name) const; | 1040 RawField* LookupStaticField(const String& name) const; |
1040 RawField* LookupField(const String& name) const; | 1041 RawField* LookupField(const String& name) const; |
1041 | 1042 |
1042 RawLibraryPrefix* LookupLibraryPrefix(const String& name) const; | 1043 RawLibraryPrefix* LookupLibraryPrefix(const String& name) const; |
(...skipping 4057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5100 | 5101 |
5101 private: | 5102 private: |
5102 OBJECT_IMPLEMENTATION(Number, Instance); | 5103 OBJECT_IMPLEMENTATION(Number, Instance); |
5103 friend class Class; | 5104 friend class Class; |
5104 }; | 5105 }; |
5105 | 5106 |
5106 | 5107 |
5107 class Integer : public Number { | 5108 class Integer : public Number { |
5108 public: | 5109 public: |
5109 static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); | 5110 static RawInteger* New(const String& str, Heap::Space space = Heap::kNew); |
5110 static RawInteger* NewFromUint64( | 5111 static RawInteger* NewFromUint64(uint64_t value, |
5111 uint64_t value, Heap::Space space = Heap::kNew); | 5112 Heap::Space space = Heap::kNew); |
5112 | 5113 |
5113 // Returns a canonical Integer object allocated in the old gen space. | 5114 // Returns a canonical Integer object allocated in the old gen space. |
5114 static RawInteger* NewCanonical(const String& str); | 5115 static RawInteger* NewCanonical(const String& str); |
5115 | 5116 |
5116 // Do not throw JavascriptIntegerOverflow if 'silent' is true. | 5117 // Do not throw JavascriptIntegerOverflow if 'silent' is true. |
5117 static RawInteger* New(int64_t value, | 5118 static RawInteger* New(int64_t value, |
5118 Heap::Space space = Heap::kNew, | 5119 Heap::Space space = Heap::kNew, |
5119 const bool silent = false); | 5120 const bool silent = false); |
5120 | 5121 |
5121 virtual bool OperatorEquals(const Instance& other) const { | 5122 virtual bool OperatorEquals(const Instance& other) const { |
5122 return Equals(other); | 5123 return Equals(other); |
5123 } | 5124 } |
5124 virtual bool CanonicalizeEquals(const Instance& other) const { | 5125 virtual bool CanonicalizeEquals(const Instance& other) const { |
5125 return Equals(other); | 5126 return Equals(other); |
5126 } | 5127 } |
5127 virtual bool Equals(const Instance& other) const { | 5128 virtual bool Equals(const Instance& other) const; |
5128 UNREACHABLE(); | |
5129 return false; | |
5130 } | |
5131 | 5129 |
5132 virtual RawObject* HashCode() const { return raw(); } | 5130 virtual RawObject* HashCode() const { return raw(); } |
5133 | 5131 |
5134 // Integer is an abstract class. | 5132 virtual bool IsZero() const; |
5135 virtual bool IsZero() const { | 5133 virtual bool IsNegative() const; |
5136 UNREACHABLE(); | 5134 |
5137 return false; | |
5138 } | |
5139 virtual bool IsNegative() const { | |
5140 // Number is an abstract class. | |
5141 UNREACHABLE(); | |
5142 return false; | |
5143 } | |
5144 virtual double AsDoubleValue() const; | 5135 virtual double AsDoubleValue() const; |
5145 virtual int64_t AsInt64Value() const; | 5136 virtual int64_t AsInt64Value() const; |
5146 virtual uint32_t AsTruncatedUint32Value() const; | 5137 virtual uint32_t AsTruncatedUint32Value() const; |
5147 | 5138 |
| 5139 virtual bool FitsIntoSmi() const; |
| 5140 |
5148 // Returns 0, -1 or 1. | 5141 // Returns 0, -1 or 1. |
5149 virtual int CompareWith(const Integer& other) const; | 5142 virtual int CompareWith(const Integer& other) const; |
5150 | 5143 |
5151 // Return the most compact presentation of an integer. | 5144 // Return the most compact presentation of an integer. |
5152 RawInteger* AsValidInteger() const; | 5145 RawInteger* AsValidInteger() const; |
5153 | 5146 |
| 5147 // Returns null to indicate that a bigint operation is required. |
5154 RawInteger* ArithmeticOp(Token::Kind operation, const Integer& other) const; | 5148 RawInteger* ArithmeticOp(Token::Kind operation, const Integer& other) const; |
5155 RawInteger* BitOp(Token::Kind operation, const Integer& other) const; | 5149 RawInteger* BitOp(Token::Kind operation, const Integer& other) const; |
5156 | 5150 |
5157 // Returns true if the Integer does not fit in a Javascript integer. | 5151 // Returns true if the Integer does not fit in a Javascript integer. |
5158 bool CheckJavascriptIntegerOverflow() const; | 5152 bool CheckJavascriptIntegerOverflow() const; |
5159 | 5153 |
5160 private: | 5154 private: |
5161 // Return an integer in the form of a RawBigint. | |
5162 RawBigint* AsBigint() const; | |
5163 | |
5164 OBJECT_IMPLEMENTATION(Integer, Number); | 5155 OBJECT_IMPLEMENTATION(Integer, Number); |
5165 friend class Class; | 5156 friend class Class; |
5166 }; | 5157 }; |
5167 | 5158 |
5168 | 5159 |
5169 class Smi : public Integer { | 5160 class Smi : public Integer { |
5170 public: | 5161 public: |
5171 static const intptr_t kBits = kSmiBits; | 5162 static const intptr_t kBits = kSmiBits; |
5172 static const intptr_t kMaxValue = kSmiMax; | 5163 static const intptr_t kMaxValue = kSmiMax; |
5173 static const intptr_t kMinValue = kSmiMin; | 5164 static const intptr_t kMinValue = kSmiMin; |
5174 | 5165 |
5175 intptr_t Value() const { | 5166 intptr_t Value() const { |
5176 return ValueFromRaw(raw_value()); | 5167 return ValueFromRaw(raw_value()); |
5177 } | 5168 } |
5178 | 5169 |
5179 virtual bool Equals(const Instance& other) const; | 5170 virtual bool Equals(const Instance& other) const; |
5180 virtual bool IsZero() const { return Value() == 0; } | 5171 virtual bool IsZero() const { return Value() == 0; } |
5181 virtual bool IsNegative() const { return Value() < 0; } | 5172 virtual bool IsNegative() const { return Value() < 0; } |
5182 // Smi values are implicitly canonicalized. | 5173 // Smi values are implicitly canonicalized. |
5183 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { | 5174 virtual RawInstance* CheckAndCanonicalize(const char** error_str) const { |
5184 return reinterpret_cast<RawSmi*>(raw_value()); | 5175 return reinterpret_cast<RawSmi*>(raw_value()); |
5185 } | 5176 } |
5186 | 5177 |
5187 virtual double AsDoubleValue() const; | 5178 virtual double AsDoubleValue() const; |
5188 virtual int64_t AsInt64Value() const; | 5179 virtual int64_t AsInt64Value() const; |
5189 virtual uint32_t AsTruncatedUint32Value() const; | 5180 virtual uint32_t AsTruncatedUint32Value() const; |
5190 | 5181 |
| 5182 virtual bool FitsIntoSmi() const { return true; } |
| 5183 |
5191 virtual int CompareWith(const Integer& other) const; | 5184 virtual int CompareWith(const Integer& other) const; |
5192 | 5185 |
5193 static intptr_t InstanceSize() { return 0; } | 5186 static intptr_t InstanceSize() { return 0; } |
5194 | 5187 |
5195 static RawSmi* New(intptr_t value) { | 5188 static RawSmi* New(intptr_t value) { |
5196 intptr_t raw_smi = (value << kSmiTagShift) | kSmiTag; | 5189 intptr_t raw_smi = (value << kSmiTagShift) | kSmiTag; |
5197 ASSERT(ValueFromRaw(raw_smi) == value); | 5190 ASSERT(ValueFromRaw(raw_smi) == value); |
5198 return reinterpret_cast<RawSmi*>(raw_smi); | 5191 return reinterpret_cast<RawSmi*>(raw_smi); |
5199 } | 5192 } |
5200 | 5193 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5267 virtual bool IsNegative() const { | 5260 virtual bool IsNegative() const { |
5268 return value() < 0; | 5261 return value() < 0; |
5269 } | 5262 } |
5270 | 5263 |
5271 virtual bool Equals(const Instance& other) const; | 5264 virtual bool Equals(const Instance& other) const; |
5272 | 5265 |
5273 virtual double AsDoubleValue() const; | 5266 virtual double AsDoubleValue() const; |
5274 virtual int64_t AsInt64Value() const; | 5267 virtual int64_t AsInt64Value() const; |
5275 virtual uint32_t AsTruncatedUint32Value() const; | 5268 virtual uint32_t AsTruncatedUint32Value() const; |
5276 | 5269 |
| 5270 virtual bool FitsIntoSmi() const; |
| 5271 |
5277 virtual int CompareWith(const Integer& other) const; | 5272 virtual int CompareWith(const Integer& other) const; |
5278 | 5273 |
5279 static intptr_t InstanceSize() { | 5274 static intptr_t InstanceSize() { |
5280 return RoundedAllocationSize(sizeof(RawMint)); | 5275 return RoundedAllocationSize(sizeof(RawMint)); |
5281 } | 5276 } |
5282 | 5277 |
5283 protected: | 5278 protected: |
5284 // Only Integer::NewXXX is allowed to call Mint::NewXXX directly. | 5279 // Only Integer::NewXXX is allowed to call Mint::NewXXX directly. |
5285 friend class Integer; | 5280 friend class Integer; |
5286 | 5281 |
5287 static RawMint* New(int64_t value, Heap::Space space = Heap::kNew); | 5282 static RawMint* New(int64_t value, Heap::Space space = Heap::kNew); |
5288 | 5283 |
5289 static RawMint* NewCanonical(int64_t value); | 5284 static RawMint* NewCanonical(int64_t value); |
5290 | 5285 |
5291 private: | 5286 private: |
5292 void set_value(int64_t value) const; | 5287 void set_value(int64_t value) const; |
5293 | 5288 |
5294 FINAL_HEAP_OBJECT_IMPLEMENTATION(Mint, Integer); | 5289 FINAL_HEAP_OBJECT_IMPLEMENTATION(Mint, Integer); |
5295 friend class Class; | 5290 friend class Class; |
5296 }; | 5291 }; |
5297 | 5292 |
5298 | 5293 |
5299 class Bigint : public Integer { | 5294 class Bigint : public Integer { |
5300 private: | |
5301 typedef uint32_t Chunk; | |
5302 typedef uint64_t DoubleChunk; | |
5303 static const int kChunkSize = sizeof(Chunk); | |
5304 | |
5305 public: | 5295 public: |
5306 virtual bool IsZero() const { return raw_ptr()->signed_length_ == 0; } | 5296 virtual bool IsZero() const { return Used() == 0;} |
5307 virtual bool IsNegative() const { return raw_ptr()->signed_length_ < 0; } | 5297 virtual bool IsNegative() const { return Neg(); } |
5308 | |
5309 virtual bool Equals(const Instance& other) const; | 5298 virtual bool Equals(const Instance& other) const; |
5310 | 5299 |
5311 virtual double AsDoubleValue() const; | 5300 virtual double AsDoubleValue() const; |
5312 virtual int64_t AsInt64Value() const; | 5301 virtual int64_t AsInt64Value() const; |
5313 virtual uint32_t AsTruncatedUint32Value() const; | 5302 virtual uint32_t AsTruncatedUint32Value() const; |
5314 | 5303 |
5315 virtual int CompareWith(const Integer& other) const; | 5304 virtual int CompareWith(const Integer& other) const; |
5316 | 5305 |
5317 static const intptr_t kBytesPerElement = kChunkSize; | 5306 virtual bool CheckAndCanonicalizeFields(const char** error_str) const; |
5318 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; | |
5319 | 5307 |
5320 static intptr_t InstanceSize() { return 0; } | 5308 virtual bool FitsIntoSmi() const; |
| 5309 bool FitsIntoInt64() const; |
| 5310 bool FitsIntoUint64() const; |
| 5311 uint64_t AsUint64Value() const; |
5321 | 5312 |
5322 static intptr_t InstanceSize(intptr_t len) { | 5313 static intptr_t InstanceSize() { |
5323 ASSERT(0 <= len && len <= kMaxElements); | 5314 return RoundedAllocationSize(sizeof(RawBigint)); |
5324 return RoundedAllocationSize(sizeof(RawBigint) + (len * kBytesPerElement)); | |
5325 } | 5315 } |
5326 | 5316 |
5327 protected: | 5317 // Accessors used by native calls from Dart. |
5328 // Only Integer::NewXXX is allowed to call Bigint::NewXXX directly. | 5318 RawBool* neg() const { return raw_ptr()->neg_; } |
5329 friend class Integer; | 5319 void set_neg(const Bool& value) const; |
| 5320 static intptr_t neg_offset() { return OFFSET_OF(RawBigint, neg_); } |
| 5321 RawSmi* used() const { return raw_ptr()->used_; } |
| 5322 void set_used(const Smi& value) const; |
| 5323 static intptr_t used_offset() { return OFFSET_OF(RawBigint, used_); } |
| 5324 RawTypedData* digits() const { return raw_ptr()->digits_; } |
| 5325 void set_digits(const TypedData& value) const; |
| 5326 static intptr_t digits_offset() { return OFFSET_OF(RawBigint, digits_); } |
5330 | 5327 |
5331 RawBigint* BigArithmeticOp(Token::Kind operation, const Bigint& other) const; | 5328 // Accessors used by runtime calls from C++. |
| 5329 bool Neg() const; |
| 5330 void SetNeg(bool value) const; |
| 5331 intptr_t Used() const; |
| 5332 void SetUsed(intptr_t value) const; |
| 5333 uint32_t DigitAt(intptr_t index) const; |
| 5334 void SetDigitAt(intptr_t index, uint32_t value) const; |
5332 | 5335 |
5333 static RawBigint* New(const String& str, Heap::Space space = Heap::kNew); | 5336 const char* ToDecCString(uword (*allocator)(intptr_t size)) const; |
| 5337 const char* ToHexCString(uword (*allocator)(intptr_t size)) const; |
| 5338 |
| 5339 static const intptr_t kExtraDigits = 4; // Same as _Bigint.EXTRA_DIGITS |
| 5340 static const intptr_t kBitsPerDigit = 32; // Same as _Bigint.DIGIT_BITS |
| 5341 static const int64_t kDigitBase = 1LL << kBitsPerDigit; |
| 5342 static const int64_t kDigitMask = kDigitBase - 1; |
| 5343 |
| 5344 static RawBigint* New(Heap::Space space = Heap::kNew); |
| 5345 |
| 5346 static RawBigint* NewFromInt64(int64_t value, |
| 5347 Heap::Space space = Heap::kNew); |
| 5348 |
| 5349 static RawBigint* NewFromUint64(uint64_t value, |
| 5350 Heap::Space space = Heap::kNew); |
| 5351 |
| 5352 static RawBigint* NewFromShiftedInt64(int64_t value, intptr_t shift, |
| 5353 Heap::Space space = Heap::kNew); |
| 5354 |
| 5355 static RawBigint* NewFromCString(const char* str, |
| 5356 Heap::Space space = Heap::kNew); |
5334 | 5357 |
5335 // Returns a canonical Bigint object allocated in the old gen space. | 5358 // Returns a canonical Bigint object allocated in the old gen space. |
5336 static RawBigint* NewCanonical(const String& str); | 5359 static RawBigint* NewCanonical(const String& str); |
5337 | 5360 |
5338 private: | 5361 private: |
5339 Chunk GetChunkAt(intptr_t i) const { | 5362 static RawBigint* NewFromHexCString(const char* str, |
5340 return *ChunkAddr(i); | 5363 Heap::Space space = Heap::kNew); |
5341 } | 5364 static RawBigint* NewFromDecCString(const char* str, |
| 5365 Heap::Space space = Heap::kNew); |
5342 | 5366 |
5343 void SetChunkAt(intptr_t i, Chunk newValue) const { | 5367 // Make sure at least 'length' _digits are allocated. |
5344 *ChunkAddr(i) = newValue; | 5368 // Copy existing _digits if reallocation is necessary. |
5345 } | 5369 void EnsureLength(intptr_t length, Heap::Space space = Heap::kNew) const; |
5346 | 5370 |
5347 // Returns the number of chunks in use. | 5371 // Do not count zero high digits as used. |
5348 intptr_t Length() const { | 5372 void Clamp() const; |
5349 intptr_t signed_length = raw_ptr()->signed_length_; | |
5350 return Utils::Abs(signed_length); | |
5351 } | |
5352 | 5373 |
5353 // SetLength does not change the sign. | 5374 bool IsClamped() const; |
5354 void SetLength(intptr_t length) const { | |
5355 ASSERT(length >= 0); | |
5356 bool is_negative = IsNegative(); | |
5357 raw_ptr()->signed_length_ = length; | |
5358 if (is_negative) ToggleSign(); | |
5359 } | |
5360 | |
5361 void SetSign(bool is_negative) const { | |
5362 if (is_negative != IsNegative()) { | |
5363 ToggleSign(); | |
5364 } | |
5365 } | |
5366 | |
5367 void ToggleSign() const { | |
5368 raw_ptr()->signed_length_ = -raw_ptr()->signed_length_; | |
5369 } | |
5370 | |
5371 Chunk* ChunkAddr(intptr_t index) const { | |
5372 ASSERT(0 <= index); | |
5373 ASSERT(index < Length()); | |
5374 uword digits_start = reinterpret_cast<uword>(raw_ptr()) + sizeof(RawBigint); | |
5375 return &(reinterpret_cast<Chunk*>(digits_start)[index]); | |
5376 } | |
5377 | 5375 |
5378 static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew); | 5376 static RawBigint* Allocate(intptr_t length, Heap::Space space = Heap::kNew); |
5379 | 5377 |
5380 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer); | 5378 FINAL_HEAP_OBJECT_IMPLEMENTATION(Bigint, Integer); |
5381 friend class BigintOperations; | |
5382 friend class Class; | 5379 friend class Class; |
5383 }; | 5380 }; |
5384 | 5381 |
5385 | 5382 |
5386 // Class Double represents class Double in corelib_impl, which implements | 5383 // Class Double represents class Double in corelib_impl, which implements |
5387 // abstract class double in corelib. | 5384 // abstract class double in corelib. |
5388 class Double : public Number { | 5385 class Double : public Number { |
5389 public: | 5386 public: |
5390 double value() const { | 5387 double value() const { |
5391 return raw_ptr()->value_; | 5388 return raw_ptr()->value_; |
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6585 intptr_t cid = raw()->GetClassId(); | 6582 intptr_t cid = raw()->GetClassId(); |
6586 return (ElementSizeInBytes(cid) * Length()); | 6583 return (ElementSizeInBytes(cid) * Length()); |
6587 } | 6584 } |
6588 | 6585 |
6589 void* DataAddr(intptr_t byte_offset) const { | 6586 void* DataAddr(intptr_t byte_offset) const { |
6590 ASSERT((byte_offset == 0) || | 6587 ASSERT((byte_offset == 0) || |
6591 ((byte_offset > 0) && (byte_offset < LengthInBytes()))); | 6588 ((byte_offset > 0) && (byte_offset < LengthInBytes()))); |
6592 return reinterpret_cast<void*>(raw_ptr()->data() + byte_offset); | 6589 return reinterpret_cast<void*>(raw_ptr()->data() + byte_offset); |
6593 } | 6590 } |
6594 | 6591 |
| 6592 virtual bool CanonicalizeEquals(const Instance& other) const; |
| 6593 |
6595 #define TYPED_GETTER_SETTER(name, type) \ | 6594 #define TYPED_GETTER_SETTER(name, type) \ |
6596 type Get##name(intptr_t byte_offset) const { \ | 6595 type Get##name(intptr_t byte_offset) const { \ |
6597 return *reinterpret_cast<type*>(DataAddr(byte_offset)); \ | 6596 return *reinterpret_cast<type*>(DataAddr(byte_offset)); \ |
6598 } \ | 6597 } \ |
6599 void Set##name(intptr_t byte_offset, type value) const { \ | 6598 void Set##name(intptr_t byte_offset, type value) const { \ |
6600 *reinterpret_cast<type*>(DataAddr(byte_offset)) = value; \ | 6599 *reinterpret_cast<type*>(DataAddr(byte_offset)) = value; \ |
6601 } | 6600 } |
6602 TYPED_GETTER_SETTER(Int8, int8_t) | 6601 TYPED_GETTER_SETTER(Int8, int8_t) |
6603 TYPED_GETTER_SETTER(Uint8, uint8_t) | 6602 TYPED_GETTER_SETTER(Uint8, uint8_t) |
6604 TYPED_GETTER_SETTER(Int16, int16_t) | 6603 TYPED_GETTER_SETTER(Int16, int16_t) |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7417 | 7416 |
7418 | 7417 |
7419 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, | 7418 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, |
7420 intptr_t index) { | 7419 intptr_t index) { |
7421 return array.At((index * kEntryLength) + kTargetFunctionIndex); | 7420 return array.At((index * kEntryLength) + kTargetFunctionIndex); |
7422 } | 7421 } |
7423 | 7422 |
7424 } // namespace dart | 7423 } // namespace dart |
7425 | 7424 |
7426 #endif // VM_OBJECT_H_ | 7425 #endif // VM_OBJECT_H_ |
OLD | NEW |