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

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

Issue 13139002: Remove support for 'dart:scalarlist' in the Dart VM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 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 | Annotate | Revision Log
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 2164 matching lines...) Expand 10 before | Expand all | Expand 10 after
2175 static RawLibrary* AsyncLibrary(); 2175 static RawLibrary* AsyncLibrary();
2176 static RawLibrary* CoreLibrary(); 2176 static RawLibrary* CoreLibrary();
2177 static RawLibrary* CollectionLibrary(); 2177 static RawLibrary* CollectionLibrary();
2178 static RawLibrary* CollectionDevLibrary(); 2178 static RawLibrary* CollectionDevLibrary();
2179 static RawLibrary* CryptoLibrary(); 2179 static RawLibrary* CryptoLibrary();
2180 static RawLibrary* IsolateLibrary(); 2180 static RawLibrary* IsolateLibrary();
2181 static RawLibrary* JsonLibrary(); 2181 static RawLibrary* JsonLibrary();
2182 static RawLibrary* MathLibrary(); 2182 static RawLibrary* MathLibrary();
2183 static RawLibrary* MirrorsLibrary(); 2183 static RawLibrary* MirrorsLibrary();
2184 static RawLibrary* NativeWrappersLibrary(); 2184 static RawLibrary* NativeWrappersLibrary();
2185 static RawLibrary* ScalarlistLibrary();
2186 static RawLibrary* TypedDataLibrary(); 2185 static RawLibrary* TypedDataLibrary();
2187 static RawLibrary* UriLibrary(); 2186 static RawLibrary* UriLibrary();
2188 static RawLibrary* UtfLibrary(); 2187 static RawLibrary* UtfLibrary();
2189 2188
2190 // Eagerly compile all classes and functions in the library. 2189 // Eagerly compile all classes and functions in the library.
2191 static RawError* CompileAll(); 2190 static RawError* CompileAll();
2192 2191
2193 private: 2192 private:
2194 static const int kInitialImportsCapacity = 4; 2193 static const int kInitialImportsCapacity = 4;
2195 static const int kImportsCapacityIncrement = 8; 2194 static const int kImportsCapacityIncrement = 8;
(...skipping 3002 matching lines...) Expand 10 before | Expand all | Expand 10 after
5198 void SetPeer(void* peer) const { 5197 void SetPeer(void* peer) const {
5199 raw_ptr()->peer_ = peer; 5198 raw_ptr()->peer_ = peer;
5200 } 5199 }
5201 5200
5202 private: 5201 private:
5203 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData, Instance); 5202 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData, Instance);
5204 friend class Class; 5203 friend class Class;
5205 }; 5204 };
5206 5205
5207 5206
5208 class ByteArray : public Instance {
5209 public:
5210 intptr_t Length() const {
5211 ASSERT(!IsNull());
5212 return Smi::Value(raw_ptr()->length_);
5213 }
5214
5215 static intptr_t length_offset() {
5216 return OFFSET_OF(RawByteArray, length_);
5217 }
5218
5219 virtual intptr_t ByteLength() const;
5220
5221 virtual void* GetPeer() const { return NULL; }
5222 virtual uint8_t* ByteAddr(intptr_t byte_offset) const;
5223
5224 FinalizablePersistentHandle* AddFinalizer(
5225 void* peer, Dart_WeakPersistentHandleFinalizer callback) const;
5226
5227 static void Copy(void* dst,
5228 const ByteArray& src,
5229 intptr_t src_offset,
5230 intptr_t length);
5231
5232 static void Copy(const ByteArray& dst,
5233 intptr_t dst_offset,
5234 const void* src,
5235 intptr_t length);
5236
5237 static void Copy(const ByteArray& dst,
5238 intptr_t dst_offset,
5239 const ByteArray& src,
5240 intptr_t src_offset,
5241 intptr_t length);
5242
5243 protected:
5244 virtual void SetPeer(void* peer) const { }
5245
5246 template<typename HandleT, typename RawT>
5247 static RawT* NewImpl(intptr_t class_id,
5248 intptr_t len,
5249 Heap::Space space);
5250
5251 template<typename HandleT, typename RawT, typename ElementT>
5252 static RawT* NewImpl(intptr_t class_id,
5253 const ElementT* data,
5254 intptr_t len,
5255 Heap::Space space);
5256
5257 template<typename HandleT, typename RawT, typename ElementT>
5258 static RawT* NewExternalImpl(intptr_t class_id,
5259 ElementT* data,
5260 intptr_t len,
5261 Heap::Space space);
5262
5263 template<typename HandleT, typename RawT, typename ElementT>
5264 static RawT* ReadFromImpl(SnapshotReader* reader,
5265 intptr_t object_id,
5266 intptr_t tags,
5267 Snapshot::Kind kind);
5268
5269 void SetLength(intptr_t value) const {
5270 raw_ptr()->length_ = Smi::New(value);
5271 }
5272
5273 private:
5274 HEAP_OBJECT_IMPLEMENTATION(ByteArray, Instance);
5275 friend class Class;
5276 };
5277
5278
5279 class Int8Array : public ByteArray {
5280 public:
5281 intptr_t ByteLength() const {
5282 return Length();
5283 }
5284
5285 int8_t At(intptr_t index) const {
5286 ASSERT((index >= 0) && (index < Length()));
5287 return raw_ptr()->data_[index];
5288 }
5289
5290 void SetAt(intptr_t index, int8_t value) const {
5291 ASSERT((index >= 0) && (index < Length()));
5292 raw_ptr()->data_[index] = value;
5293 }
5294
5295 static const intptr_t kBytesPerElement = 1;
5296 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5297
5298 static intptr_t data_offset() {
5299 return OFFSET_OF(RawInt8Array, data_);
5300 }
5301
5302 static intptr_t InstanceSize() {
5303 ASSERT(sizeof(RawInt8Array) == OFFSET_OF(RawInt8Array, data_));
5304 return 0;
5305 }
5306
5307 static intptr_t InstanceSize(intptr_t len) {
5308 ASSERT(0 <= len && len <= kMaxElements);
5309 return RoundedAllocationSize(
5310 sizeof(RawInt8Array) + (len * kBytesPerElement));
5311 }
5312
5313 static RawInt8Array* New(intptr_t len,
5314 Heap::Space space = Heap::kNew);
5315 static RawInt8Array* New(const int8_t* data,
5316 intptr_t len,
5317 Heap::Space space = Heap::kNew);
5318
5319 private:
5320 uint8_t* ByteAddr(intptr_t byte_offset) const {
5321 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5322 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5323 }
5324
5325 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int8Array, ByteArray);
5326 friend class ByteArray;
5327 friend class Class;
5328 };
5329
5330
5331 class Uint8Array : public ByteArray {
5332 public:
5333 intptr_t ByteLength() const {
5334 return Length();
5335 }
5336
5337 uint8_t At(intptr_t index) const {
5338 ASSERT((index >= 0) && (index < Length()));
5339 return raw_ptr()->data_[index];
5340 }
5341
5342 void SetAt(intptr_t index, uint8_t value) const {
5343 ASSERT((index >= 0) && (index < Length()));
5344 raw_ptr()->data_[index] = value;
5345 }
5346
5347 static const intptr_t kBytesPerElement = 1;
5348 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5349
5350 static intptr_t data_offset() {
5351 return OFFSET_OF(RawUint8Array, data_);
5352 }
5353
5354 static intptr_t InstanceSize() {
5355 ASSERT(sizeof(RawUint8Array) == OFFSET_OF(RawUint8Array, data_));
5356 return 0;
5357 }
5358
5359 static intptr_t InstanceSize(intptr_t len) {
5360 ASSERT(0 <= len && len <= kMaxElements);
5361 return RoundedAllocationSize(
5362 sizeof(RawUint8Array) + (len * kBytesPerElement));
5363 }
5364
5365 static RawUint8Array* New(intptr_t len,
5366 Heap::Space space = Heap::kNew);
5367 static RawUint8Array* New(const uint8_t* data,
5368 intptr_t len,
5369 Heap::Space space = Heap::kNew);
5370
5371 private:
5372 uint8_t* ByteAddr(intptr_t byte_offset) const {
5373 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5374 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5375 }
5376
5377 FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint8Array, ByteArray);
5378 friend class ByteArray;
5379 friend class Class;
5380 };
5381
5382
5383 class Uint8ClampedArray : public ByteArray {
5384 public:
5385 intptr_t ByteLength() const {
5386 return Length();
5387 }
5388
5389 uint8_t At(intptr_t index) const {
5390 ASSERT((index >= 0) && (index < Length()));
5391 return raw_ptr()->data_[index];
5392 }
5393
5394 void SetAt(intptr_t index, uint8_t value) const {
5395 ASSERT((index >= 0) && (index < Length()));
5396 raw_ptr()->data_[index] = value;
5397 }
5398
5399 static const intptr_t kBytesPerElement = 1;
5400 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5401
5402 static intptr_t data_offset() {
5403 return OFFSET_OF(RawUint8ClampedArray, data_);
5404 }
5405
5406 static intptr_t InstanceSize() {
5407 ASSERT(sizeof(RawUint8ClampedArray) ==
5408 OFFSET_OF(RawUint8ClampedArray, data_));
5409 return 0;
5410 }
5411
5412 static intptr_t InstanceSize(intptr_t len) {
5413 ASSERT(0 <= len && len <= kMaxElements);
5414 return RoundedAllocationSize(
5415 sizeof(RawUint8ClampedArray) + (len * kBytesPerElement));
5416 }
5417
5418 static RawUint8ClampedArray* New(intptr_t len,
5419 Heap::Space space = Heap::kNew);
5420 static RawUint8ClampedArray* New(const uint8_t* data,
5421 intptr_t len,
5422 Heap::Space space = Heap::kNew);
5423
5424 private:
5425 uint8_t* ByteAddr(intptr_t byte_offset) const {
5426 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5427 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5428 }
5429
5430 FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint8ClampedArray, ByteArray);
5431 friend class ByteArray;
5432 friend class Class;
5433 };
5434
5435
5436 class Int16Array : public ByteArray {
5437 public:
5438 intptr_t ByteLength() const {
5439 return Length() * kBytesPerElement;
5440 }
5441
5442 int16_t At(intptr_t index) const {
5443 ASSERT((index >= 0) && (index < Length()));
5444 return raw_ptr()->data_[index];
5445 }
5446
5447 void SetAt(intptr_t index, int16_t value) const {
5448 ASSERT((index >= 0) && (index < Length()));
5449 raw_ptr()->data_[index] = value;
5450 }
5451
5452 static const intptr_t kBytesPerElement = 2;
5453 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5454
5455 static intptr_t data_offset() {
5456 return OFFSET_OF(RawInt16Array, data_);
5457 }
5458
5459 static intptr_t InstanceSize() {
5460 ASSERT(sizeof(RawInt16Array) == OFFSET_OF(RawInt16Array, data_));
5461 return 0;
5462 }
5463
5464 static intptr_t InstanceSize(intptr_t len) {
5465 ASSERT(0 <= len && len <= kMaxElements);
5466 return RoundedAllocationSize(
5467 sizeof(RawInt16Array) + (len * kBytesPerElement));
5468 }
5469
5470 static RawInt16Array* New(intptr_t len,
5471 Heap::Space space = Heap::kNew);
5472 static RawInt16Array* New(const int16_t* data,
5473 intptr_t len,
5474 Heap::Space space = Heap::kNew);
5475
5476 private:
5477 uint8_t* ByteAddr(intptr_t byte_offset) const {
5478 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5479 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5480 }
5481
5482 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int16Array, ByteArray);
5483 friend class ByteArray;
5484 friend class Class;
5485 };
5486
5487
5488 class Uint16Array : public ByteArray {
5489 public:
5490 intptr_t ByteLength() const {
5491 return Length() * kBytesPerElement;
5492 }
5493
5494 uint16_t At(intptr_t index) const {
5495 ASSERT((index >= 0) && (index < Length()));
5496 return raw_ptr()->data_[index];
5497 }
5498
5499 void SetAt(intptr_t index, uint16_t value) const {
5500 ASSERT((index >= 0) && (index < Length()));
5501 raw_ptr()->data_[index] = value;
5502 }
5503
5504 static const intptr_t kBytesPerElement = 2;
5505 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5506
5507 static intptr_t data_offset() {
5508 return OFFSET_OF(RawUint16Array, data_);
5509 }
5510
5511 static intptr_t InstanceSize() {
5512 ASSERT(sizeof(RawUint16Array) == OFFSET_OF(RawUint16Array, data_));
5513 return 0;
5514 }
5515
5516 static intptr_t InstanceSize(intptr_t len) {
5517 ASSERT(0 <= len && len <= kMaxElements);
5518 return RoundedAllocationSize(
5519 sizeof(RawUint16Array) + (len * kBytesPerElement));
5520 }
5521
5522 static RawUint16Array* New(intptr_t len,
5523 Heap::Space space = Heap::kNew);
5524 static RawUint16Array* New(const uint16_t* data,
5525 intptr_t len,
5526 Heap::Space space = Heap::kNew);
5527
5528 uint8_t* ByteAddr(intptr_t byte_offset) const {
5529 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5530 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5531 }
5532
5533 private:
5534 FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint16Array, ByteArray);
5535 friend class ByteArray;
5536 friend class Class;
5537 };
5538
5539
5540 class Int32Array : public ByteArray {
5541 public:
5542 intptr_t ByteLength() const {
5543 return Length() * kBytesPerElement;
5544 }
5545
5546 int32_t At(intptr_t index) const {
5547 ASSERT((index >= 0) && (index < Length()));
5548 return raw_ptr()->data_[index];
5549 }
5550
5551 void SetAt(intptr_t index, int32_t value) const {
5552 ASSERT((index >= 0) && (index < Length()));
5553 raw_ptr()->data_[index] = value;
5554 }
5555
5556 static const intptr_t kBytesPerElement = 4;
5557 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5558
5559 static intptr_t data_offset() {
5560 return OFFSET_OF(RawInt32Array, data_);
5561 }
5562
5563 static intptr_t InstanceSize() {
5564 ASSERT(sizeof(RawInt32Array) == OFFSET_OF(RawInt32Array, data_));
5565 return 0;
5566 }
5567
5568 static intptr_t InstanceSize(intptr_t len) {
5569 ASSERT(0 <= len && len <= kMaxElements);
5570 return RoundedAllocationSize(
5571 sizeof(RawInt32Array) + (len * kBytesPerElement));
5572 }
5573
5574 static RawInt32Array* New(intptr_t len,
5575 Heap::Space space = Heap::kNew);
5576 static RawInt32Array* New(const int32_t* data,
5577 intptr_t len,
5578 Heap::Space space = Heap::kNew);
5579
5580 private:
5581 uint8_t* ByteAddr(intptr_t byte_offset) const {
5582 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5583 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5584 }
5585
5586 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int32Array, ByteArray);
5587 friend class ByteArray;
5588 friend class Class;
5589 };
5590
5591
5592 class Uint32Array : public ByteArray {
5593 public:
5594 intptr_t ByteLength() const {
5595 return Length() * kBytesPerElement;
5596 }
5597
5598 uint32_t At(intptr_t index) const {
5599 ASSERT((index >= 0) && (index < Length()));
5600 return raw_ptr()->data_[index];
5601 }
5602
5603 void SetAt(intptr_t index, uint32_t value) const {
5604 ASSERT((index >= 0) && (index < Length()));
5605 raw_ptr()->data_[index] = value;
5606 }
5607
5608 static const intptr_t kBytesPerElement = 4;
5609 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5610
5611 static intptr_t data_offset() {
5612 return OFFSET_OF(RawUint32Array, data_);
5613 }
5614
5615 static intptr_t InstanceSize() {
5616 ASSERT(sizeof(RawUint32Array) == OFFSET_OF(RawUint32Array, data_));
5617 return 0;
5618 }
5619
5620 static intptr_t InstanceSize(intptr_t len) {
5621 ASSERT(0 <= len && len <= kMaxElements);
5622 return RoundedAllocationSize(
5623 sizeof(RawUint32Array) + (len * kBytesPerElement));
5624 }
5625
5626 static RawUint32Array* New(intptr_t len,
5627 Heap::Space space = Heap::kNew);
5628 static RawUint32Array* New(const uint32_t* data,
5629 intptr_t len,
5630 Heap::Space space = Heap::kNew);
5631
5632 private:
5633 uint8_t* ByteAddr(intptr_t byte_offset) const {
5634 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5635 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5636 }
5637
5638 FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint32Array, ByteArray);
5639 friend class ByteArray;
5640 friend class Class;
5641 };
5642
5643
5644 class Int64Array : public ByteArray {
5645 public:
5646 intptr_t ByteLength() const {
5647 return Length() * kBytesPerElement;
5648 }
5649
5650 int64_t At(intptr_t index) const {
5651 ASSERT((index >= 0) && (index < Length()));
5652 return raw_ptr()->data_[index];
5653 }
5654
5655 void SetAt(intptr_t index, int64_t value) const {
5656 ASSERT((index >= 0) && (index < Length()));
5657 raw_ptr()->data_[index] = value;
5658 }
5659
5660 static const intptr_t kBytesPerElement = 8;
5661 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5662
5663 static intptr_t data_offset() {
5664 return OFFSET_OF(RawInt64Array, data_);
5665 }
5666
5667 static intptr_t InstanceSize() {
5668 ASSERT(sizeof(RawInt64Array) == OFFSET_OF(RawInt64Array, data_));
5669 return 0;
5670 }
5671
5672 static intptr_t InstanceSize(intptr_t len) {
5673 ASSERT(0 <= len && len <= kMaxElements);
5674 return RoundedAllocationSize(
5675 sizeof(RawInt64Array) + (len * kBytesPerElement));
5676 }
5677
5678 static RawInt64Array* New(intptr_t len,
5679 Heap::Space space = Heap::kNew);
5680 static RawInt64Array* New(const int64_t* data,
5681 intptr_t len,
5682 Heap::Space space = Heap::kNew);
5683
5684 private:
5685 uint8_t* ByteAddr(intptr_t byte_offset) const {
5686 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5687 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5688 }
5689
5690 FINAL_HEAP_OBJECT_IMPLEMENTATION(Int64Array, ByteArray);
5691 friend class ByteArray;
5692 friend class Class;
5693 };
5694
5695
5696 class Uint64Array : public ByteArray {
5697 public:
5698 intptr_t ByteLength() const {
5699 return Length() * sizeof(uint64_t);
5700 }
5701
5702 uint64_t At(intptr_t index) const {
5703 ASSERT((index >= 0) && (index < Length()));
5704 return raw_ptr()->data_[index];
5705 }
5706
5707 void SetAt(intptr_t index, uint64_t value) const {
5708 ASSERT((index >= 0) && (index < Length()));
5709 raw_ptr()->data_[index] = value;
5710 }
5711
5712 static const intptr_t kBytesPerElement = 8;
5713 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5714
5715 static intptr_t data_offset() {
5716 return OFFSET_OF(RawUint64Array, data_);
5717 }
5718
5719 static intptr_t InstanceSize() {
5720 ASSERT(sizeof(RawUint64Array) == OFFSET_OF(RawUint64Array, data_));
5721 return 0;
5722 }
5723
5724 static intptr_t InstanceSize(intptr_t len) {
5725 ASSERT(0 <= len && len <= kMaxElements);
5726 return RoundedAllocationSize(
5727 sizeof(RawUint64Array) + (len * kBytesPerElement));
5728 }
5729
5730 static RawUint64Array* New(intptr_t len,
5731 Heap::Space space = Heap::kNew);
5732 static RawUint64Array* New(const uint64_t* data,
5733 intptr_t len,
5734 Heap::Space space = Heap::kNew);
5735
5736 private:
5737 uint8_t* ByteAddr(intptr_t byte_offset) const {
5738 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5739 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5740 }
5741
5742 FINAL_HEAP_OBJECT_IMPLEMENTATION(Uint64Array, ByteArray);
5743 friend class ByteArray;
5744 friend class Class;
5745 };
5746
5747
5748 class Float32Array : public ByteArray {
5749 public:
5750 intptr_t ByteLength() const {
5751 return Length() * kBytesPerElement;
5752 }
5753
5754 float At(intptr_t index) const {
5755 ASSERT((index >= 0) && (index < Length()));
5756 return raw_ptr()->data_[index];
5757 }
5758
5759 void SetAt(intptr_t index, float value) const {
5760 ASSERT((index >= 0) && (index < Length()));
5761 raw_ptr()->data_[index] = value;
5762 }
5763
5764 static const intptr_t kBytesPerElement = 4;
5765 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5766
5767 static intptr_t data_offset() {
5768 return OFFSET_OF(RawFloat32Array, data_);
5769 }
5770
5771 static intptr_t InstanceSize() {
5772 ASSERT(sizeof(RawFloat32Array) == OFFSET_OF(RawFloat32Array, data_));
5773 return 0;
5774 }
5775
5776 static intptr_t InstanceSize(intptr_t len) {
5777 ASSERT(0 <= len && len <= kMaxElements);
5778 return RoundedAllocationSize(
5779 sizeof(RawFloat32Array) + (len * kBytesPerElement));
5780 }
5781
5782 static RawFloat32Array* New(intptr_t len,
5783 Heap::Space space = Heap::kNew);
5784 static RawFloat32Array* New(const float* data,
5785 intptr_t len,
5786 Heap::Space space = Heap::kNew);
5787
5788 private:
5789 uint8_t* ByteAddr(intptr_t byte_offset) const {
5790 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5791 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5792 }
5793
5794 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float32Array, ByteArray);
5795 friend class ByteArray;
5796 friend class Class;
5797 };
5798
5799
5800 class Float64Array : public ByteArray {
5801 public:
5802 intptr_t ByteLength() const {
5803 return Length() * kBytesPerElement;
5804 }
5805
5806 double At(intptr_t index) const {
5807 ASSERT((index >= 0) && (index < Length()));
5808 return raw_ptr()->data_[index];
5809 }
5810
5811 void SetAt(intptr_t index, double value) const {
5812 ASSERT((index >= 0) && (index < Length()));
5813 raw_ptr()->data_[index] = value;
5814 }
5815
5816 static const intptr_t kBytesPerElement = 8;
5817 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
5818
5819 static intptr_t InstanceSize() {
5820 ASSERT(sizeof(RawFloat64Array) == OFFSET_OF(RawFloat64Array, data_));
5821 return 0;
5822 }
5823
5824 static intptr_t data_offset() {
5825 return OFFSET_OF(RawFloat64Array, data_);
5826 }
5827
5828 static intptr_t InstanceSize(intptr_t len) {
5829 ASSERT(0 <= len && len <= kMaxElements);
5830 return RoundedAllocationSize(
5831 sizeof(RawFloat64Array) + (len * kBytesPerElement));
5832 }
5833
5834 static RawFloat64Array* New(intptr_t len,
5835 Heap::Space space = Heap::kNew);
5836 static RawFloat64Array* New(const double* data,
5837 intptr_t len,
5838 Heap::Space space = Heap::kNew);
5839
5840 private:
5841 uint8_t* ByteAddr(intptr_t byte_offset) const {
5842 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5843 return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
5844 }
5845
5846 FINAL_HEAP_OBJECT_IMPLEMENTATION(Float64Array, ByteArray);
5847 friend class ByteArray;
5848 friend class Class;
5849 };
5850
5851
5852 class ExternalInt8Array : public ByteArray {
5853 public:
5854 intptr_t ByteLength() const {
5855 return Length() * kBytesPerElement;
5856 }
5857
5858 int8_t At(intptr_t index) const {
5859 ASSERT((index >= 0) && (index < Length()));
5860 return raw_ptr()->data_[index];
5861 }
5862
5863 void SetAt(intptr_t index, int8_t value) const {
5864 ASSERT((index >= 0) && (index < Length()));
5865 raw_ptr()->data_[index] = value;
5866 }
5867
5868 int8_t* GetData() const {
5869 return raw_ptr()->data_;
5870 }
5871
5872 void* GetPeer() const {
5873 return raw_ptr()->peer_;
5874 }
5875
5876 static const intptr_t kBytesPerElement = 1;
5877
5878 // Since external arrays may be serialized to non-external ones,
5879 // enforce the same maximum element count.
5880 static const intptr_t kMaxElements = Int8Array::kMaxElements;
5881
5882 static intptr_t InstanceSize() {
5883 return RoundedAllocationSize(sizeof(RawExternalInt8Array));
5884 }
5885
5886 static intptr_t data_offset() {
5887 return OFFSET_OF(RawExternalInt8Array, data_);
5888 }
5889
5890 static RawExternalInt8Array* New(int8_t* data,
5891 intptr_t len,
5892 Heap::Space space = Heap::kNew);
5893
5894 private:
5895 uint8_t* ByteAddr(intptr_t byte_offset) const {
5896 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5897 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
5898 return data + byte_offset;
5899 }
5900
5901 void SetData(int8_t* data) const {
5902 raw_ptr()->data_ = data;
5903 }
5904
5905 void SetPeer(void* peer) const {
5906 raw_ptr()->peer_ = peer;
5907 }
5908
5909 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt8Array, ByteArray);
5910 friend class ByteArray;
5911 friend class Class;
5912 };
5913
5914
5915 class ExternalUint8Array : public ByteArray {
5916 public:
5917 intptr_t ByteLength() const {
5918 return Length() * kBytesPerElement;
5919 }
5920
5921 uint8_t At(intptr_t index) const {
5922 ASSERT((index >= 0) && (index < Length()));
5923 return raw_ptr()->data_[index];
5924 }
5925
5926 void SetAt(intptr_t index, uint8_t value) const {
5927 ASSERT((index >= 0) && (index < Length()));
5928 raw_ptr()->data_[index] = value;
5929 }
5930
5931 uint8_t* GetData() const {
5932 return raw_ptr()->data_;
5933 }
5934
5935 void* GetPeer() const {
5936 return raw_ptr()->peer_;
5937 }
5938
5939 static const intptr_t kBytesPerElement = 1;
5940
5941 // Since external arrays may be serialized to non-external ones,
5942 // enforce the same maximum element count.
5943 static const intptr_t kMaxElements = Uint8Array::kMaxElements;
5944
5945 static intptr_t InstanceSize() {
5946 return RoundedAllocationSize(sizeof(RawExternalUint8Array));
5947 }
5948
5949 static intptr_t data_offset() {
5950 return OFFSET_OF(RawExternalUint8Array, data_);
5951 }
5952
5953 static RawExternalUint8Array* New(uint8_t* data,
5954 intptr_t len,
5955 Heap::Space space = Heap::kNew);
5956
5957 private:
5958 uint8_t* ByteAddr(intptr_t byte_offset) const {
5959 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
5960 uint8_t* data =
5961 reinterpret_cast<uint8_t*>(raw_ptr()->data_);
5962 return data + byte_offset;
5963 }
5964
5965 void SetData(uint8_t* data) const {
5966 raw_ptr()->data_ = data;
5967 }
5968
5969 void SetPeer(void* peer) const {
5970 raw_ptr()->peer_ = peer;
5971 }
5972
5973 HEAP_OBJECT_IMPLEMENTATION(ExternalUint8Array, ByteArray);
5974 friend class ByteArray;
5975 friend class Class;
5976 friend class TokenStream;
5977 };
5978
5979
5980 class ExternalUint8ClampedArray : public ExternalUint8Array {
5981 public:
5982 static RawExternalUint8ClampedArray* New(uint8_t* data,
5983 intptr_t len,
5984 Heap::Space space = Heap::kNew);
5985
5986 private:
5987 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint8ClampedArray,
5988 ExternalUint8Array);
5989 friend class Class;
5990 };
5991
5992
5993 class ExternalInt16Array : public ByteArray {
5994 public:
5995 intptr_t ByteLength() const {
5996 return Length() * kBytesPerElement;
5997 }
5998
5999 int16_t At(intptr_t index) const {
6000 ASSERT((index >= 0) && (index < Length()));
6001 return raw_ptr()->data_[index];
6002 }
6003
6004 void SetAt(intptr_t index, int16_t value) const {
6005 ASSERT((index >= 0) && (index < Length()));
6006 raw_ptr()->data_[index] = value;
6007 }
6008
6009 int16_t* GetData() const {
6010 return raw_ptr()->data_;
6011 }
6012
6013 void* GetPeer() const {
6014 return raw_ptr()->peer_;
6015 }
6016
6017 static const intptr_t kBytesPerElement = 2;
6018
6019 // Since external arrays may be serialized to non-external ones,
6020 // enforce the same maximum element count.
6021 static const intptr_t kMaxElements = Int16Array::kMaxElements;
6022
6023 static intptr_t InstanceSize() {
6024 return RoundedAllocationSize(sizeof(RawExternalInt16Array));
6025 }
6026
6027 static RawExternalInt16Array* New(int16_t* data,
6028 intptr_t len,
6029 Heap::Space space = Heap::kNew);
6030
6031 private:
6032 uint8_t* ByteAddr(intptr_t byte_offset) const {
6033 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6034 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6035 return data + byte_offset;
6036 }
6037
6038 void SetData(int16_t* data) const {
6039 raw_ptr()->data_ = data;
6040 }
6041
6042 void SetPeer(void* peer) const {
6043 raw_ptr()->peer_ = peer;
6044 }
6045
6046 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt16Array, ByteArray);
6047 friend class ByteArray;
6048 friend class Class;
6049 };
6050
6051
6052 class ExternalUint16Array : public ByteArray {
6053 public:
6054 intptr_t ByteLength() const {
6055 return Length() * kBytesPerElement;
6056 }
6057
6058 int16_t At(intptr_t index) const {
6059 ASSERT((index >= 0) && (index < Length()));
6060 return raw_ptr()->data_[index];
6061 }
6062
6063 void SetAt(intptr_t index, int16_t value) const {
6064 ASSERT((index >= 0) && (index < Length()));
6065 raw_ptr()->data_[index] = value;
6066 }
6067
6068 uint16_t* GetData() const {
6069 return raw_ptr()->data_;
6070 }
6071
6072 void* GetPeer() const {
6073 return raw_ptr()->peer_;
6074 }
6075
6076 static const intptr_t kBytesPerElement = 2;
6077
6078 // Since external arrays may be serialized to non-external ones,
6079 // enforce the same maximum element count.
6080 static const intptr_t kMaxElements = Uint16Array::kMaxElements;
6081
6082 static intptr_t InstanceSize() {
6083 return RoundedAllocationSize(sizeof(RawExternalUint16Array));
6084 }
6085
6086 static RawExternalUint16Array* New(uint16_t* data,
6087 intptr_t len,
6088 Heap::Space space = Heap::kNew);
6089
6090 private:
6091 uint8_t* ByteAddr(intptr_t byte_offset) const {
6092 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6093 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6094 return data + byte_offset;
6095 }
6096
6097 void SetData(uint16_t* data) const {
6098 raw_ptr()->data_ = data;
6099 }
6100
6101 void SetPeer(void* peer) const {
6102 raw_ptr()->peer_ = peer;
6103 }
6104
6105 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint16Array, ByteArray);
6106 friend class ByteArray;
6107 friend class Class;
6108 };
6109
6110
6111 class ExternalInt32Array : public ByteArray {
6112 public:
6113 intptr_t ByteLength() const {
6114 return Length() * kBytesPerElement;
6115 }
6116
6117 int32_t At(intptr_t index) const {
6118 ASSERT((index >= 0) && (index < Length()));
6119 return raw_ptr()->data_[index];
6120 }
6121
6122 void SetAt(intptr_t index, int32_t value) const {
6123 ASSERT((index >= 0) && (index < Length()));
6124 raw_ptr()->data_[index] = value;
6125 }
6126
6127 int32_t* GetData() const {
6128 return raw_ptr()->data_;
6129 }
6130
6131 void* GetPeer() const {
6132 return raw_ptr()->peer_;
6133 }
6134
6135 static const intptr_t kBytesPerElement = 4;
6136
6137 // Since external arrays may be serialized to non-external ones,
6138 // enforce the same maximum element count.
6139 static const intptr_t kMaxElements = Int32Array::kMaxElements;
6140
6141 static intptr_t InstanceSize() {
6142 return RoundedAllocationSize(sizeof(RawExternalInt32Array));
6143 }
6144
6145 static RawExternalInt32Array* New(int32_t* data,
6146 intptr_t len,
6147 Heap::Space space = Heap::kNew);
6148
6149 private:
6150 uint8_t* ByteAddr(intptr_t byte_offset) const {
6151 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6152 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6153 return data + byte_offset;
6154 }
6155
6156 void SetData(int32_t* data) const {
6157 raw_ptr()->data_ = data;
6158 }
6159
6160 void SetPeer(void* peer) const {
6161 raw_ptr()->peer_ = peer;
6162 }
6163
6164 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt32Array, ByteArray);
6165 friend class ByteArray;
6166 friend class Class;
6167 };
6168
6169
6170 class ExternalUint32Array : public ByteArray {
6171 public:
6172 intptr_t ByteLength() const {
6173 return Length() * kBytesPerElement;
6174 }
6175
6176 int32_t At(intptr_t index) const {
6177 ASSERT((index >= 0) && (index < Length()));
6178 return raw_ptr()->data_[index];
6179 }
6180
6181 void SetAt(intptr_t index, int32_t value) const {
6182 ASSERT((index >= 0) && (index < Length()));
6183 raw_ptr()->data_[index] = value;
6184 }
6185
6186 uint32_t* GetData() const {
6187 return raw_ptr()->data_;
6188 }
6189
6190 void* GetPeer() const {
6191 return raw_ptr()->peer_;
6192 }
6193
6194 static const intptr_t kBytesPerElement = 4;
6195
6196 // Since external arrays may be serialized to non-external ones,
6197 // enforce the same maximum element count.
6198 static const intptr_t kMaxElements = Uint32Array::kMaxElements;
6199
6200 static intptr_t InstanceSize() {
6201 return RoundedAllocationSize(sizeof(RawExternalUint32Array));
6202 }
6203
6204 static RawExternalUint32Array* New(uint32_t* data,
6205 intptr_t len,
6206 Heap::Space space = Heap::kNew);
6207
6208 private:
6209 uint8_t* ByteAddr(intptr_t byte_offset) const {
6210 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6211 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6212 return data + byte_offset;
6213 }
6214
6215 void SetData(uint32_t* data) const {
6216 raw_ptr()->data_ = data;
6217 }
6218
6219 void SetPeer(void* peer) const {
6220 raw_ptr()->peer_ = peer;
6221 }
6222
6223 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint32Array, ByteArray);
6224 friend class ByteArray;
6225 friend class Class;
6226 };
6227
6228
6229 class ExternalInt64Array : public ByteArray {
6230 public:
6231 intptr_t ByteLength() const {
6232 return Length() * kBytesPerElement;
6233 }
6234
6235 int64_t At(intptr_t index) const {
6236 ASSERT((index >= 0) && (index < Length()));
6237 return raw_ptr()->data_[index];
6238 }
6239
6240 void SetAt(intptr_t index, int64_t value) const {
6241 ASSERT((index >= 0) && (index < Length()));
6242 raw_ptr()->data_[index] = value;
6243 }
6244
6245 int64_t* GetData() const {
6246 return raw_ptr()->data_;
6247 }
6248
6249 void* GetPeer() const {
6250 return raw_ptr()->peer_;
6251 }
6252
6253 static const intptr_t kBytesPerElement = 8;
6254
6255 // Since external arrays may be serialized to non-external ones,
6256 // enforce the same maximum element count.
6257 static const intptr_t kMaxElements = Int64Array::kMaxElements;
6258
6259 static intptr_t InstanceSize() {
6260 return RoundedAllocationSize(sizeof(RawExternalInt64Array));
6261 }
6262
6263 static RawExternalInt64Array* New(int64_t* data,
6264 intptr_t len,
6265 Heap::Space space = Heap::kNew);
6266
6267 private:
6268 uint8_t* ByteAddr(intptr_t byte_offset) const {
6269 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6270 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6271 return data + byte_offset;
6272 }
6273
6274 void SetData(int64_t* data) const {
6275 raw_ptr()->data_ = data;
6276 }
6277
6278 void SetPeer(void* peer) const {
6279 raw_ptr()->peer_ = peer;
6280 }
6281
6282 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt64Array, ByteArray);
6283 friend class ByteArray;
6284 friend class Class;
6285 };
6286
6287
6288 class ExternalUint64Array : public ByteArray {
6289 public:
6290 intptr_t ByteLength() const {
6291 return Length() * kBytesPerElement;
6292 }
6293
6294 int64_t At(intptr_t index) const {
6295 ASSERT((index >= 0) && (index < Length()));
6296 return raw_ptr()->data_[index];
6297 }
6298
6299 void SetAt(intptr_t index, int64_t value) const {
6300 ASSERT((index >= 0) && (index < Length()));
6301 raw_ptr()->data_[index] = value;
6302 }
6303
6304 uint64_t* GetData() const {
6305 return raw_ptr()->data_;
6306 }
6307
6308 void* GetPeer() const {
6309 return raw_ptr()->peer_;
6310 }
6311
6312 static const intptr_t kBytesPerElement = 8;
6313
6314 // Since external arrays may be serialized to non-external ones,
6315 // enforce the same maximum element count.
6316 static const intptr_t kMaxElements = Uint64Array::kMaxElements;
6317
6318 static intptr_t InstanceSize() {
6319 return RoundedAllocationSize(sizeof(RawExternalUint64Array));
6320 }
6321
6322 static RawExternalUint64Array* New(uint64_t* data,
6323 intptr_t len,
6324 Heap::Space space = Heap::kNew);
6325
6326 private:
6327 uint8_t* ByteAddr(intptr_t byte_offset) const {
6328 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6329 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6330 return data + byte_offset;
6331 }
6332
6333 void SetData(uint64_t* data) const {
6334 raw_ptr()->data_ = data;
6335 }
6336
6337 void SetPeer(void* peer) const {
6338 raw_ptr()->peer_ = peer;
6339 }
6340
6341 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint64Array, ByteArray);
6342 friend class ByteArray;
6343 friend class Class;
6344 };
6345
6346
6347 class ExternalFloat32Array : public ByteArray {
6348 public:
6349 intptr_t ByteLength() const {
6350 return Length() * kBytesPerElement;
6351 }
6352
6353 float At(intptr_t index) const {
6354 ASSERT((index >= 0) && (index < Length()));
6355 return raw_ptr()->data_[index];
6356 }
6357
6358 void SetAt(intptr_t index, float value) const {
6359 ASSERT((index >= 0) && (index < Length()));
6360 raw_ptr()->data_[index] = value;
6361 }
6362
6363 float* GetData() const {
6364 return raw_ptr()->data_;
6365 }
6366
6367 void* GetPeer() const {
6368 return raw_ptr()->peer_;
6369 }
6370
6371 static const intptr_t kBytesPerElement = 4;
6372
6373 // Since external arrays may be serialized to non-external ones,
6374 // enforce the same maximum element count.
6375 static const intptr_t kMaxElements = Float32Array::kMaxElements;
6376
6377 static intptr_t InstanceSize() {
6378 return RoundedAllocationSize(sizeof(RawExternalFloat32Array));
6379 }
6380
6381 static RawExternalFloat32Array* New(float* data,
6382 intptr_t len,
6383 Heap::Space space = Heap::kNew);
6384
6385 private:
6386 uint8_t* ByteAddr(intptr_t byte_offset) const {
6387 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6388 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6389 return data + byte_offset;
6390 }
6391
6392 void SetData(float* data) const {
6393 raw_ptr()->data_ = data;
6394 }
6395
6396 void SetPeer(void* peer) const {
6397 raw_ptr()->peer_ = peer;
6398 }
6399
6400 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32Array, ByteArray);
6401 friend class ByteArray;
6402 friend class Class;
6403 };
6404
6405
6406 class ExternalFloat64Array : public ByteArray {
6407 public:
6408 intptr_t ByteLength() const {
6409 return Length() * kBytesPerElement;
6410 }
6411
6412 double At(intptr_t index) const {
6413 ASSERT((index >= 0) && (index < Length()));
6414 return raw_ptr()->data_[index];
6415 }
6416
6417 void SetAt(intptr_t index, double value) const {
6418 ASSERT((index >= 0) && (index < Length()));
6419 raw_ptr()->data_[index] = value;
6420 }
6421
6422 double* GetData() const {
6423 return raw_ptr()->data_;
6424 }
6425
6426 void* GetPeer() const {
6427 return raw_ptr()->peer_;
6428 }
6429
6430 static const intptr_t kBytesPerElement = 8;
6431
6432 // Since external arrays may be serialized to non-external ones,
6433 // enforce the same maximum element count.
6434 static const intptr_t kMaxElements = Float64Array::kMaxElements;
6435
6436 static intptr_t InstanceSize() {
6437 return RoundedAllocationSize(sizeof(RawExternalFloat64Array));
6438 }
6439
6440 static RawExternalFloat64Array* New(double* data,
6441 intptr_t len,
6442 Heap::Space space = Heap::kNew);
6443
6444 private:
6445 uint8_t* ByteAddr(intptr_t byte_offset) const {
6446 ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
6447 uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
6448 return data + byte_offset;
6449 }
6450
6451 void SetData(double* data) const {
6452 raw_ptr()->data_ = data;
6453 }
6454
6455 void SetPeer(void* peer) const {
6456 raw_ptr()->peer_ = peer;
6457 }
6458
6459 FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat64Array, ByteArray);
6460 friend class ByteArray;
6461 friend class Class;
6462 };
6463
6464
6465 // DartFunction represents the abstract Dart class 'Function'. 5207 // DartFunction represents the abstract Dart class 'Function'.
6466 class DartFunction : public Instance { 5208 class DartFunction : public Instance {
6467 private: 5209 private:
6468 FINAL_HEAP_OBJECT_IMPLEMENTATION(DartFunction, Instance); 5210 FINAL_HEAP_OBJECT_IMPLEMENTATION(DartFunction, Instance);
6469 friend class Class; 5211 friend class Class;
6470 friend class Instance; 5212 friend class Instance;
6471 }; 5213 };
6472 5214
6473 5215
6474 class Closure : public AllStatic { 5216 class Closure : public AllStatic {
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
6762 5504
6763 5505
6764 void Context::SetAt(intptr_t index, const Instance& value) const { 5506 void Context::SetAt(intptr_t index, const Instance& value) const {
6765 StorePointer(InstanceAddr(index), value.raw()); 5507 StorePointer(InstanceAddr(index), value.raw());
6766 } 5508 }
6767 5509
6768 5510
6769 intptr_t Instance::GetNativeField(Isolate* isolate, int index) const { 5511 intptr_t Instance::GetNativeField(Isolate* isolate, int index) const {
6770 ASSERT(IsValidNativeIndex(index)); 5512 ASSERT(IsValidNativeIndex(index));
6771 NoGCScope no_gc; 5513 NoGCScope no_gc;
6772 RawIntPtrArray* native_fields = 5514 RawTypedData* native_fields =
6773 reinterpret_cast<RawIntPtrArray*>(*NativeFieldsAddr()); 5515 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr());
6774 if (native_fields == IntPtrArray::null()) { 5516 if (native_fields == TypedData::null()) {
6775 return 0; 5517 return 0;
6776 } 5518 }
6777 return native_fields->ptr()->data_[index]; 5519 intptr_t byte_offset = index * sizeof(intptr_t);
5520 return *reinterpret_cast<intptr_t*>(native_fields->ptr()->data_ +
5521 byte_offset);
6778 } 5522 }
6779 5523
6780 5524
6781 bool String::Equals(const String& str) const { 5525 bool String::Equals(const String& str) const {
6782 if (raw() == str.raw()) { 5526 if (raw() == str.raw()) {
6783 return true; // Both handles point to the same raw instance. 5527 return true; // Both handles point to the same raw instance.
6784 } 5528 }
6785 if (str.IsNull()) { 5529 if (str.IsNull()) {
6786 return false; 5530 return false;
6787 } 5531 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
6823 5567
6824 5568
6825 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 5569 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
6826 intptr_t index) { 5570 intptr_t index) {
6827 return array.At((index * kEntryLength) + kTargetFunctionIndex); 5571 return array.At((index * kEntryLength) + kTargetFunctionIndex);
6828 } 5572 }
6829 5573
6830 } // namespace dart 5574 } // namespace dart
6831 5575
6832 #endif // VM_OBJECT_H_ 5576 #endif // VM_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698