Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/elements.h" | 5 #include "src/elements.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 555 uint32_t entry) { | 555 uint32_t entry) { |
| 556 uint32_t index = GetIndexForEntryImpl(*backing_store, entry); | 556 uint32_t index = GetIndexForEntryImpl(*backing_store, entry); |
| 557 return BackingStore::get(Handle<BackingStore>::cast(backing_store), index); | 557 return BackingStore::get(Handle<BackingStore>::cast(backing_store), index); |
| 558 } | 558 } |
| 559 | 559 |
| 560 virtual void Set(FixedArrayBase* backing_store, uint32_t entry, | 560 virtual void Set(FixedArrayBase* backing_store, uint32_t entry, |
| 561 Object* value) final { | 561 Object* value) final { |
| 562 ElementsAccessorSubclass::SetImpl(backing_store, entry, value); | 562 ElementsAccessorSubclass::SetImpl(backing_store, entry, value); |
| 563 } | 563 } |
| 564 | 564 |
| 565 static void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | 565 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, |
| 566 Object* value) { | 566 Object* value) { |
| 567 BackingStore::cast(backing_store)->SetValue(entry, value); | 567 BackingStore::cast(backing_store)->SetValue(entry, value); |
| 568 } | 568 } |
| 569 | 569 |
| 570 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | |
| 571 Object* value, WriteBarrierMode mode) { | |
| 572 BackingStore::cast(backing_store)->SetValue(entry, value); | |
| 573 } | |
| 574 | |
| 570 virtual void Reconfigure(Handle<JSObject> object, | 575 virtual void Reconfigure(Handle<JSObject> object, |
| 571 Handle<FixedArrayBase> store, uint32_t entry, | 576 Handle<FixedArrayBase> store, uint32_t entry, |
| 572 Handle<Object> value, | 577 Handle<Object> value, |
| 573 PropertyAttributes attributes) final { | 578 PropertyAttributes attributes) final { |
| 574 ElementsAccessorSubclass::ReconfigureImpl(object, store, entry, value, | 579 ElementsAccessorSubclass::ReconfigureImpl(object, store, entry, value, |
| 575 attributes); | 580 attributes); |
| 576 } | 581 } |
| 577 | 582 |
| 578 static void ReconfigureImpl(Handle<JSObject> object, | 583 static void ReconfigureImpl(Handle<JSObject> object, |
| 579 Handle<FixedArrayBase> store, uint32_t entry, | 584 Handle<FixedArrayBase> store, uint32_t entry, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 602 push_size, direction); | 607 push_size, direction); |
| 603 } | 608 } |
| 604 | 609 |
| 605 static uint32_t PushImpl(Handle<JSArray> receiver, | 610 static uint32_t PushImpl(Handle<JSArray> receiver, |
| 606 Handle<FixedArrayBase> elms_obj, Object** objects, | 611 Handle<FixedArrayBase> elms_obj, Object** objects, |
| 607 uint32_t push_size, int direction) { | 612 uint32_t push_size, int direction) { |
| 608 UNREACHABLE(); | 613 UNREACHABLE(); |
| 609 return 0; | 614 return 0; |
| 610 } | 615 } |
| 611 | 616 |
| 617 virtual uint32_t Unshift(Handle<JSArray> receiver, | |
| 618 Handle<FixedArrayBase> backing_store, | |
| 619 Arguments* args, uint32_t unshift_size) final { | |
| 620 return ElementsAccessorSubclass::UnshiftImpl(receiver, backing_store, args, | |
| 621 unshift_size); | |
| 622 } | |
| 623 | |
| 624 static uint32_t UnshiftImpl(Handle<JSArray> receiver, | |
| 625 Handle<FixedArrayBase> elms_obj, Arguments* args, | |
| 626 uint32_t unshift_size) { | |
| 627 UNREACHABLE(); | |
| 628 return 0; | |
| 629 } | |
| 630 | |
| 612 virtual Handle<JSArray> Slice(Handle<JSObject> receiver, | 631 virtual Handle<JSArray> Slice(Handle<JSObject> receiver, |
| 613 Handle<FixedArrayBase> backing_store, | 632 Handle<FixedArrayBase> backing_store, |
| 614 uint32_t start, uint32_t end) final { | 633 uint32_t start, uint32_t end) final { |
| 615 return ElementsAccessorSubclass::SliceImpl(receiver, backing_store, start, | 634 return ElementsAccessorSubclass::SliceImpl(receiver, backing_store, start, |
| 616 end); | 635 end); |
| 617 } | 636 } |
| 618 | 637 |
| 619 static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, | 638 static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, |
| 620 Handle<FixedArrayBase> backing_store, | 639 Handle<FixedArrayBase> backing_store, |
| 621 uint32_t start, uint32_t end) { | 640 uint32_t start, uint32_t end) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 655 handle(array->elements())); | 674 handle(array->elements())); |
| 656 } | 675 } |
| 657 | 676 |
| 658 static void SetLengthImpl(Handle<JSArray> array, uint32_t length, | 677 static void SetLengthImpl(Handle<JSArray> array, uint32_t length, |
| 659 Handle<FixedArrayBase> backing_store); | 678 Handle<FixedArrayBase> backing_store); |
| 660 | 679 |
| 661 static Handle<FixedArrayBase> ConvertElementsWithCapacity( | 680 static Handle<FixedArrayBase> ConvertElementsWithCapacity( |
| 662 Handle<JSObject> object, Handle<FixedArrayBase> old_elements, | 681 Handle<JSObject> object, Handle<FixedArrayBase> old_elements, |
| 663 ElementsKind from_kind, uint32_t capacity) { | 682 ElementsKind from_kind, uint32_t capacity) { |
| 664 return ConvertElementsWithCapacity( | 683 return ConvertElementsWithCapacity( |
| 665 object, old_elements, from_kind, capacity, | 684 object, old_elements, from_kind, capacity, 0, 0, |
| 666 ElementsAccessor::kCopyToEndAndInitializeToHole); | 685 ElementsAccessor::kCopyToEndAndInitializeToHole); |
| 667 } | 686 } |
| 668 | 687 |
| 669 static Handle<FixedArrayBase> ConvertElementsWithCapacity( | 688 static Handle<FixedArrayBase> ConvertElementsWithCapacity( |
| 670 Handle<JSObject> object, Handle<FixedArrayBase> old_elements, | 689 Handle<JSObject> object, Handle<FixedArrayBase> old_elements, |
| 671 ElementsKind from_kind, uint32_t capacity, int copy_size) { | 690 ElementsKind from_kind, uint32_t capacity, int copy_size) { |
| 691 return ConvertElementsWithCapacity(object, old_elements, from_kind, | |
| 692 capacity, 0, 0, copy_size); | |
| 693 } | |
| 694 | |
| 695 static Handle<FixedArrayBase> ConvertElementsWithCapacity( | |
| 696 Handle<JSObject> object, Handle<FixedArrayBase> old_elements, | |
| 697 ElementsKind from_kind, uint32_t capacity, uint32_t src_index, | |
| 698 uint32_t dst_index, int copy_size) { | |
|
Camillo Bruni
2015/09/01 08:45:12
Added this ConvertElementsWithCapacity to avoid co
| |
| 672 Isolate* isolate = object->GetIsolate(); | 699 Isolate* isolate = object->GetIsolate(); |
| 673 Handle<FixedArrayBase> new_elements; | 700 Handle<FixedArrayBase> new_elements; |
| 674 if (IsFastDoubleElementsKind(kind())) { | 701 if (IsFastDoubleElementsKind(kind())) { |
| 675 new_elements = isolate->factory()->NewFixedDoubleArray(capacity); | 702 new_elements = isolate->factory()->NewFixedDoubleArray(capacity); |
| 676 } else { | 703 } else { |
| 677 new_elements = isolate->factory()->NewUninitializedFixedArray(capacity); | 704 new_elements = isolate->factory()->NewUninitializedFixedArray(capacity); |
| 678 } | 705 } |
| 679 | 706 |
| 680 int packed_size = kPackedSizeNotKnown; | 707 int packed_size = kPackedSizeNotKnown; |
| 681 if (IsFastPackedElementsKind(from_kind) && object->IsJSArray()) { | 708 if (IsFastPackedElementsKind(from_kind) && object->IsJSArray()) { |
| 682 packed_size = Smi::cast(JSArray::cast(*object)->length())->value(); | 709 packed_size = Smi::cast(JSArray::cast(*object)->length())->value(); |
| 683 } | 710 } |
| 684 | 711 |
| 685 ElementsAccessorSubclass::CopyElementsImpl( | 712 ElementsAccessorSubclass::CopyElementsImpl( |
| 686 *old_elements, 0, *new_elements, from_kind, 0, packed_size, copy_size); | 713 *old_elements, src_index, *new_elements, from_kind, dst_index, |
| 714 packed_size, copy_size); | |
| 687 | 715 |
| 688 return new_elements; | 716 return new_elements; |
| 689 } | 717 } |
| 690 | 718 |
| 691 static void GrowCapacityAndConvertImpl(Handle<JSObject> object, | 719 static void GrowCapacityAndConvertImpl(Handle<JSObject> object, |
| 692 uint32_t capacity) { | 720 uint32_t capacity) { |
| 693 ElementsKind from_kind = object->GetElementsKind(); | 721 ElementsKind from_kind = object->GetElementsKind(); |
| 694 if (IsFastSmiOrObjectElementsKind(from_kind)) { | 722 if (IsFastSmiOrObjectElementsKind(from_kind)) { |
| 695 // Array optimizations rely on the prototype lookups of Array objects | 723 // Array optimizations rely on the prototype lookups of Array objects |
| 696 // always returning undefined. If there is a store to the initial | 724 // always returning undefined. If there is a store to the initial |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 994 static Object* GetRaw(FixedArrayBase* store, uint32_t entry) { | 1022 static Object* GetRaw(FixedArrayBase* store, uint32_t entry) { |
| 995 SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store); | 1023 SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store); |
| 996 return backing_store->ValueAt(entry); | 1024 return backing_store->ValueAt(entry); |
| 997 } | 1025 } |
| 998 | 1026 |
| 999 static Handle<Object> GetImpl(Handle<FixedArrayBase> store, uint32_t entry) { | 1027 static Handle<Object> GetImpl(Handle<FixedArrayBase> store, uint32_t entry) { |
| 1000 Isolate* isolate = store->GetIsolate(); | 1028 Isolate* isolate = store->GetIsolate(); |
| 1001 return handle(GetRaw(*store, entry), isolate); | 1029 return handle(GetRaw(*store, entry), isolate); |
| 1002 } | 1030 } |
| 1003 | 1031 |
| 1004 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) { | 1032 static inline void SetImpl(FixedArrayBase* store, uint32_t entry, |
| 1033 Object* value) { | |
| 1005 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); | 1034 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); |
| 1006 dictionary->ValueAtPut(entry, value); | 1035 dictionary->ValueAtPut(entry, value); |
| 1007 } | 1036 } |
| 1008 | 1037 |
| 1009 static void ReconfigureImpl(Handle<JSObject> object, | 1038 static void ReconfigureImpl(Handle<JSObject> object, |
| 1010 Handle<FixedArrayBase> store, uint32_t entry, | 1039 Handle<FixedArrayBase> store, uint32_t entry, |
| 1011 Handle<Object> value, | 1040 Handle<Object> value, |
| 1012 PropertyAttributes attributes) { | 1041 PropertyAttributes attributes) { |
| 1013 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); | 1042 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); |
| 1014 if (attributes != NONE) object->RequireSlowElements(dictionary); | 1043 if (attributes != NONE) object->RequireSlowElements(dictionary); |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1283 } | 1312 } |
| 1284 if (!new_elms.is_identical_to(backing_store)) { | 1313 if (!new_elms.is_identical_to(backing_store)) { |
| 1285 receiver->set_elements(*new_elms); | 1314 receiver->set_elements(*new_elms); |
| 1286 } | 1315 } |
| 1287 DCHECK(*new_elms == receiver->elements()); | 1316 DCHECK(*new_elms == receiver->elements()); |
| 1288 // Set the length. | 1317 // Set the length. |
| 1289 receiver->set_length(Smi::FromInt(new_length)); | 1318 receiver->set_length(Smi::FromInt(new_length)); |
| 1290 return new_length; | 1319 return new_length; |
| 1291 } | 1320 } |
| 1292 | 1321 |
| 1322 static uint32_t UnshiftImpl(Handle<JSArray> receiver, | |
| 1323 Handle<FixedArrayBase> backing_store, | |
| 1324 Arguments* args, uint32_t unshift_size) { | |
| 1325 uint32_t len = Smi::cast(receiver->length())->value(); | |
| 1326 if (unshift_size == 0) { | |
| 1327 return len; | |
| 1328 } | |
| 1329 uint32_t elms_len = backing_store->length(); | |
| 1330 // Currently fixed arrays cannot grow too big, so | |
| 1331 // we should never hit this case. | |
| 1332 DCHECK(unshift_size <= static_cast<uint32_t>(Smi::kMaxValue - len)); | |
| 1333 uint32_t new_length = len + unshift_size; | |
| 1334 | |
| 1335 if (new_length > elms_len) { | |
| 1336 // New backing storage is needed. | |
| 1337 uint32_t capacity = new_length + (new_length >> 1) + 16; | |
| 1338 backing_store = FastElementsAccessorSubclass::ConvertElementsWithCapacity( | |
| 1339 receiver, backing_store, KindTraits::Kind, capacity, 0, unshift_size, | |
| 1340 ElementsAccessor::kCopyToEndAndInitializeToHole); | |
| 1341 DisallowHeapAllocation no_gc; | |
| 1342 receiver->set_elements(*backing_store); | |
| 1343 } else { | |
| 1344 // unshift_size is > 0 and new_length <= elms_len, so backing_store cannot | |
| 1345 // be the empty_fixed_array. | |
| 1346 DisallowHeapAllocation no_gc; | |
| 1347 Isolate* isolate = receiver->GetIsolate(); | |
| 1348 FastElementsAccessorSubclass::MoveElements(isolate->heap(), backing_store, | |
| 1349 unshift_size, 0, len, 0, 0); | |
| 1350 } | |
| 1351 | |
| 1352 // Add the provided values. | |
| 1353 DisallowHeapAllocation no_gc; | |
| 1354 FixedArrayBase* raw_backing_store = *backing_store; | |
| 1355 WriteBarrierMode mode = raw_backing_store->GetWriteBarrierMode(no_gc); | |
|
Camillo Bruni
2015/09/01 08:45:12
Introduced the second SetImpl so we can pass along
| |
| 1356 for (uint32_t index = 0; index < unshift_size; index++) { | |
| 1357 FastElementsAccessorSubclass::SetImpl(raw_backing_store, index, | |
| 1358 (*args)[index + 1], mode); | |
| 1359 } | |
| 1360 // Set the length. | |
| 1361 receiver->set_length(Smi::FromInt(new_length)); | |
| 1362 return new_length; | |
| 1363 } | |
| 1364 | |
| 1293 static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, | 1365 static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, |
| 1294 int dst_index, int src_index, int len, | 1366 int dst_index, int src_index, int len, |
| 1295 int hole_start, int hole_end) { | 1367 int hole_start, int hole_end) { |
| 1296 UNREACHABLE(); | 1368 UNREACHABLE(); |
| 1297 } | 1369 } |
| 1298 | 1370 |
| 1299 static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, | 1371 static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, |
| 1300 Handle<FixedArrayBase> backing_store, | 1372 Handle<FixedArrayBase> backing_store, |
| 1301 uint32_t start, uint32_t end) { | 1373 uint32_t start, uint32_t end) { |
| 1302 Isolate* isolate = receiver->GetIsolate(); | 1374 Isolate* isolate = receiver->GetIsolate(); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1428 | 1500 |
| 1429 template<typename FastElementsAccessorSubclass, | 1501 template<typename FastElementsAccessorSubclass, |
| 1430 typename KindTraits> | 1502 typename KindTraits> |
| 1431 class FastSmiOrObjectElementsAccessor | 1503 class FastSmiOrObjectElementsAccessor |
| 1432 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { | 1504 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { |
| 1433 public: | 1505 public: |
| 1434 explicit FastSmiOrObjectElementsAccessor(const char* name) | 1506 explicit FastSmiOrObjectElementsAccessor(const char* name) |
| 1435 : FastElementsAccessor<FastElementsAccessorSubclass, | 1507 : FastElementsAccessor<FastElementsAccessorSubclass, |
| 1436 KindTraits>(name) {} | 1508 KindTraits>(name) {} |
| 1437 | 1509 |
| 1510 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | |
| 1511 Object* value) { | |
| 1512 FixedArray::cast(backing_store)->set(entry, value); | |
|
Camillo Bruni
2015/09/01 08:45:13
If I don't use the more uniform SetValue method (w
| |
| 1513 } | |
| 1514 | |
| 1515 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | |
| 1516 Object* value, WriteBarrierMode mode) { | |
| 1517 FixedArray::cast(backing_store)->set(entry, value, mode); | |
| 1518 } | |
| 1519 | |
| 1438 static Object* GetRaw(FixedArray* backing_store, uint32_t entry) { | 1520 static Object* GetRaw(FixedArray* backing_store, uint32_t entry) { |
| 1439 uint32_t index = FastElementsAccessorSubclass::GetIndexForEntryImpl( | 1521 uint32_t index = FastElementsAccessorSubclass::GetIndexForEntryImpl( |
| 1440 backing_store, entry); | 1522 backing_store, entry); |
| 1441 return backing_store->get(index); | 1523 return backing_store->get(index); |
| 1442 } | 1524 } |
| 1443 | 1525 |
| 1444 static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, | 1526 static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, |
| 1445 int dst_index, int src_index, int len, | 1527 int dst_index, int src_index, int len, |
| 1446 int hole_start, int hole_end) { | 1528 int hole_start, int hole_end) { |
| 1447 Handle<FixedArray> dst_elms = Handle<FixedArray>::cast(backing_store); | 1529 Handle<FixedArray> dst_elms = Handle<FixedArray>::cast(backing_store); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1547 | 1629 |
| 1548 template<typename FastElementsAccessorSubclass, | 1630 template<typename FastElementsAccessorSubclass, |
| 1549 typename KindTraits> | 1631 typename KindTraits> |
| 1550 class FastDoubleElementsAccessor | 1632 class FastDoubleElementsAccessor |
| 1551 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { | 1633 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { |
| 1552 public: | 1634 public: |
| 1553 explicit FastDoubleElementsAccessor(const char* name) | 1635 explicit FastDoubleElementsAccessor(const char* name) |
| 1554 : FastElementsAccessor<FastElementsAccessorSubclass, | 1636 : FastElementsAccessor<FastElementsAccessorSubclass, |
| 1555 KindTraits>(name) {} | 1637 KindTraits>(name) {} |
| 1556 | 1638 |
| 1639 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | |
| 1640 Object* value) { | |
|
Camillo Bruni
2015/09/01 08:45:12
If I leave out this version (for FixedDoubleArray)
| |
| 1641 FixedDoubleArray::cast(backing_store)->set(entry, value->Number()); | |
| 1642 } | |
| 1643 | |
| 1644 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | |
| 1645 Object* value, WriteBarrierMode mode) { | |
| 1646 FixedDoubleArray::cast(backing_store)->set(entry, value->Number()); | |
| 1647 } | |
| 1648 | |
| 1557 static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, | 1649 static void MoveElements(Heap* heap, Handle<FixedArrayBase> backing_store, |
| 1558 int dst_index, int src_index, int len, | 1650 int dst_index, int src_index, int len, |
| 1559 int hole_start, int hole_end) { | 1651 int hole_start, int hole_end) { |
| 1560 Handle<FixedDoubleArray> dst_elms = | 1652 Handle<FixedDoubleArray> dst_elms = |
| 1561 Handle<FixedDoubleArray>::cast(backing_store); | 1653 Handle<FixedDoubleArray>::cast(backing_store); |
| 1562 if (len != 0) { | 1654 if (len != 0) { |
| 1563 MemMove(dst_elms->data_start() + dst_index, | 1655 MemMove(dst_elms->data_start() + dst_index, |
| 1564 dst_elms->data_start() + src_index, len * kDoubleSize); | 1656 dst_elms->data_start() + src_index, len * kDoubleSize); |
| 1565 } | 1657 } |
| 1566 if (hole_start != hole_end) { | 1658 if (hole_start != hole_end) { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1737 } | 1829 } |
| 1738 return result; | 1830 return result; |
| 1739 } | 1831 } |
| 1740 } | 1832 } |
| 1741 | 1833 |
| 1742 static void GrowCapacityAndConvertImpl(Handle<JSObject> object, | 1834 static void GrowCapacityAndConvertImpl(Handle<JSObject> object, |
| 1743 uint32_t capacity) { | 1835 uint32_t capacity) { |
| 1744 UNREACHABLE(); | 1836 UNREACHABLE(); |
| 1745 } | 1837 } |
| 1746 | 1838 |
| 1747 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) { | 1839 static inline void SetImpl(FixedArrayBase* store, uint32_t entry, |
| 1840 Object* value) { | |
| 1748 FixedArray* parameter_map = FixedArray::cast(store); | 1841 FixedArray* parameter_map = FixedArray::cast(store); |
| 1749 uint32_t length = parameter_map->length() - 2; | 1842 uint32_t length = parameter_map->length() - 2; |
| 1750 if (entry < length) { | 1843 if (entry < length) { |
| 1751 Object* probe = parameter_map->get(entry + 2); | 1844 Object* probe = parameter_map->get(entry + 2); |
| 1752 Context* context = Context::cast(parameter_map->get(0)); | 1845 Context* context = Context::cast(parameter_map->get(0)); |
| 1753 int context_entry = Smi::cast(probe)->value(); | 1846 int context_entry = Smi::cast(probe)->value(); |
| 1754 DCHECK(!context->get(context_entry)->IsTheHole()); | 1847 DCHECK(!context->get(context_entry)->IsTheHole()); |
| 1755 context->set(context_entry, value); | 1848 context->set(context_entry, value); |
| 1756 } else { | 1849 } else { |
| 1757 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 1850 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2217 | 2310 |
| 2218 | 2311 |
| 2219 void ElementsAccessor::TearDown() { | 2312 void ElementsAccessor::TearDown() { |
| 2220 if (elements_accessors_ == NULL) return; | 2313 if (elements_accessors_ == NULL) return; |
| 2221 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; | 2314 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; |
| 2222 ELEMENTS_LIST(ACCESSOR_DELETE) | 2315 ELEMENTS_LIST(ACCESSOR_DELETE) |
| 2223 #undef ACCESSOR_DELETE | 2316 #undef ACCESSOR_DELETE |
| 2224 elements_accessors_ = NULL; | 2317 elements_accessors_ = NULL; |
| 2225 } | 2318 } |
| 2226 | 2319 |
| 2227 | |
| 2228 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 2320 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
| 2229 } // namespace internal | 2321 } // namespace internal |
| 2230 } // namespace v8 | 2322 } // namespace v8 |
| OLD | NEW |