| 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 485 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 496       length = fixed_array_base->length(); | 496       length = fixed_array_base->length(); | 
| 497     } | 497     } | 
| 498     ElementsAccessorSubclass::ValidateContents(holder, length); | 498     ElementsAccessorSubclass::ValidateContents(holder, length); | 
| 499   } | 499   } | 
| 500 | 500 | 
| 501   void Validate(Handle<JSObject> holder) final { | 501   void Validate(Handle<JSObject> holder) final { | 
| 502     DisallowHeapAllocation no_gc; | 502     DisallowHeapAllocation no_gc; | 
| 503     ElementsAccessorSubclass::ValidateImpl(holder); | 503     ElementsAccessorSubclass::ValidateImpl(holder); | 
| 504   } | 504   } | 
| 505 | 505 | 
| 506   bool IsPacked(Handle<JSObject> holder, Handle<FixedArrayBase> backing_store, |  | 
| 507                 uint32_t start, uint32_t end) final { |  | 
| 508     return ElementsAccessorSubclass::IsPackedImpl(holder, backing_store, start, |  | 
| 509                                                   end); |  | 
| 510   } |  | 
| 511 |  | 
| 512   static bool IsPackedImpl(Handle<JSObject> holder, | 506   static bool IsPackedImpl(Handle<JSObject> holder, | 
| 513                            Handle<FixedArrayBase> backing_store, uint32_t start, | 507                            Handle<FixedArrayBase> backing_store, uint32_t start, | 
| 514                            uint32_t end) { | 508                            uint32_t end) { | 
| 515     if (IsFastPackedElementsKind(kind())) return true; | 509     if (IsFastPackedElementsKind(kind())) return true; | 
| 516     for (uint32_t i = start; i < end; i++) { | 510     for (uint32_t i = start; i < end; i++) { | 
| 517       if (!ElementsAccessorSubclass::HasElementImpl(holder, i, backing_store, | 511       if (!ElementsAccessorSubclass::HasElementImpl(holder, i, backing_store, | 
| 518                                                     ALL_PROPERTIES)) { | 512                                                     ALL_PROPERTIES)) { | 
| 519         return false; | 513         return false; | 
| 520       } | 514       } | 
| 521     } | 515     } | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 591     ElementsAccessorSubclass::AddImpl(object, index, value, attributes, | 585     ElementsAccessorSubclass::AddImpl(object, index, value, attributes, | 
| 592                                       new_capacity); | 586                                       new_capacity); | 
| 593   } | 587   } | 
| 594 | 588 | 
| 595   static void AddImpl(Handle<JSObject> object, uint32_t index, | 589   static void AddImpl(Handle<JSObject> object, uint32_t index, | 
| 596                       Handle<Object> value, PropertyAttributes attributes, | 590                       Handle<Object> value, PropertyAttributes attributes, | 
| 597                       uint32_t new_capacity) { | 591                       uint32_t new_capacity) { | 
| 598     UNREACHABLE(); | 592     UNREACHABLE(); | 
| 599   } | 593   } | 
| 600 | 594 | 
| 601   uint32_t Push(Handle<JSArray> receiver, Handle<FixedArrayBase> backing_store, | 595   uint32_t Push(Handle<JSArray> receiver, Arguments* args, | 
| 602                 Arguments* args, uint32_t push_size) final { | 596                 uint32_t push_size) final { | 
| 603     return ElementsAccessorSubclass::PushImpl(receiver, backing_store, args, | 597     return ElementsAccessorSubclass::PushImpl(receiver, args, push_size); | 
| 604                                               push_size); |  | 
| 605   } | 598   } | 
| 606 | 599 | 
| 607   static uint32_t PushImpl(Handle<JSArray> receiver, | 600   static uint32_t PushImpl(Handle<JSArray> receiver, Arguments* args, | 
| 608                            Handle<FixedArrayBase> elms_obj, Arguments* args, |  | 
| 609                            uint32_t push_sized) { | 601                            uint32_t push_sized) { | 
| 610     UNREACHABLE(); | 602     UNREACHABLE(); | 
| 611     return 0; | 603     return 0; | 
| 612   } | 604   } | 
| 613 | 605 | 
| 614   uint32_t Unshift(Handle<JSArray> receiver, | 606   uint32_t Unshift(Handle<JSArray> receiver, Arguments* args, | 
| 615                    Handle<FixedArrayBase> backing_store, Arguments* args, |  | 
| 616                    uint32_t unshift_size) final { | 607                    uint32_t unshift_size) final { | 
| 617     return ElementsAccessorSubclass::UnshiftImpl(receiver, backing_store, args, | 608     return ElementsAccessorSubclass::UnshiftImpl(receiver, args, unshift_size); | 
| 618                                                  unshift_size); |  | 
| 619   } | 609   } | 
| 620 | 610 | 
| 621   static uint32_t UnshiftImpl(Handle<JSArray> receiver, | 611   static uint32_t UnshiftImpl(Handle<JSArray> receiver, Arguments* args, | 
| 622                               Handle<FixedArrayBase> elms_obj, Arguments* args, |  | 
| 623                               uint32_t unshift_size) { | 612                               uint32_t unshift_size) { | 
| 624     UNREACHABLE(); | 613     UNREACHABLE(); | 
| 625     return 0; | 614     return 0; | 
| 626   } | 615   } | 
| 627 | 616 | 
| 628   Handle<JSArray> Slice(Handle<JSObject> receiver, | 617   Handle<JSArray> Slice(Handle<JSObject> receiver, uint32_t start, | 
| 629                         Handle<FixedArrayBase> backing_store, uint32_t start, |  | 
| 630                         uint32_t end) final { | 618                         uint32_t end) final { | 
| 631     return ElementsAccessorSubclass::SliceImpl(receiver, backing_store, start, | 619     return ElementsAccessorSubclass::SliceImpl(receiver, start, end); | 
| 632                                                end); |  | 
| 633   } | 620   } | 
| 634 | 621 | 
| 635   static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, | 622   static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, | 
| 636                                    Handle<FixedArrayBase> backing_store, |  | 
| 637                                    uint32_t start, uint32_t end) { | 623                                    uint32_t start, uint32_t end) { | 
| 638     UNREACHABLE(); | 624     UNREACHABLE(); | 
| 639     return Handle<JSArray>(); | 625     return Handle<JSArray>(); | 
| 640   } | 626   } | 
| 641 | 627 | 
| 642   Handle<JSArray> Splice(Handle<JSArray> receiver, | 628   Handle<JSArray> Splice(Handle<JSArray> receiver, uint32_t start, | 
| 643                          Handle<FixedArrayBase> backing_store, uint32_t start, |  | 
| 644                          uint32_t delete_count, Arguments* args, | 629                          uint32_t delete_count, Arguments* args, | 
| 645                          uint32_t add_count) final { | 630                          uint32_t add_count) final { | 
| 646     return ElementsAccessorSubclass::SpliceImpl(receiver, backing_store, start, | 631     return ElementsAccessorSubclass::SpliceImpl(receiver, start, delete_count, | 
| 647                                                 delete_count, args, add_count); | 632                                                 args, add_count); | 
| 648   } | 633   } | 
| 649 | 634 | 
| 650   static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, | 635   static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, | 
| 651                                     Handle<FixedArrayBase> backing_store, |  | 
| 652                                     uint32_t start, uint32_t delete_count, | 636                                     uint32_t start, uint32_t delete_count, | 
| 653                                     Arguments* args, uint32_t add_count) { | 637                                     Arguments* args, uint32_t add_count) { | 
| 654     UNREACHABLE(); | 638     UNREACHABLE(); | 
| 655     return Handle<JSArray>(); | 639     return Handle<JSArray>(); | 
| 656   } | 640   } | 
| 657 | 641 | 
| 658   Handle<Object> Pop(Handle<JSArray> receiver, | 642   Handle<Object> Pop(Handle<JSArray> receiver) final { | 
| 659                      Handle<FixedArrayBase> backing_store) final { | 643     return ElementsAccessorSubclass::PopImpl(receiver); | 
| 660     return ElementsAccessorSubclass::PopImpl(receiver, backing_store); |  | 
| 661   } | 644   } | 
| 662 | 645 | 
| 663   static Handle<Object> PopImpl(Handle<JSArray> receiver, | 646   static Handle<Object> PopImpl(Handle<JSArray> receiver) { | 
| 664                                 Handle<FixedArrayBase> backing_store) { |  | 
| 665     UNREACHABLE(); | 647     UNREACHABLE(); | 
| 666     return Handle<Object>(); | 648     return Handle<Object>(); | 
| 667   } | 649   } | 
| 668 | 650 | 
| 669   Handle<Object> Shift(Handle<JSArray> receiver, | 651   Handle<Object> Shift(Handle<JSArray> receiver) final { | 
| 670                        Handle<FixedArrayBase> backing_store) final { | 652     return ElementsAccessorSubclass::ShiftImpl(receiver); | 
| 671     return ElementsAccessorSubclass::ShiftImpl(receiver, backing_store); |  | 
| 672   } | 653   } | 
| 673 | 654 | 
| 674   static Handle<Object> ShiftImpl(Handle<JSArray> receiver, | 655   static Handle<Object> ShiftImpl(Handle<JSArray> receiver) { | 
| 675                                   Handle<FixedArrayBase> backing_store) { |  | 
| 676     UNREACHABLE(); | 656     UNREACHABLE(); | 
| 677     return Handle<Object>(); | 657     return Handle<Object>(); | 
| 678   } | 658   } | 
| 679 | 659 | 
| 680   void SetLength(Handle<JSArray> array, uint32_t length) final { | 660   void SetLength(Handle<JSArray> array, uint32_t length) final { | 
| 681     ElementsAccessorSubclass::SetLengthImpl(array->GetIsolate(), array, length, | 661     ElementsAccessorSubclass::SetLengthImpl(array->GetIsolate(), array, length, | 
| 682                                             handle(array->elements())); | 662                                             handle(array->elements())); | 
| 683   } | 663   } | 
| 684 | 664 | 
| 685   static void SetLengthImpl(Isolate* isolate, Handle<JSArray> array, | 665   static void SetLengthImpl(Isolate* isolate, Handle<JSArray> array, | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 697         JSObject::TransitionElementsKind(array, kind); | 677         JSObject::TransitionElementsKind(array, kind); | 
| 698       } | 678       } | 
| 699     } | 679     } | 
| 700 | 680 | 
| 701     // Check whether the backing store should be shrunk. | 681     // Check whether the backing store should be shrunk. | 
| 702     uint32_t capacity = backing_store->length(); | 682     uint32_t capacity = backing_store->length(); | 
| 703     old_length = Min(old_length, capacity); | 683     old_length = Min(old_length, capacity); | 
| 704     if (length == 0) { | 684     if (length == 0) { | 
| 705       array->initialize_elements(); | 685       array->initialize_elements(); | 
| 706     } else if (length <= capacity) { | 686     } else if (length <= capacity) { | 
| 707       if (array->HasFastSmiOrObjectElements()) { | 687       if (IsFastSmiOrObjectElementsKind(kind())) { | 
| 708         JSObject::EnsureWritableFastElements(array); | 688         JSObject::EnsureWritableFastElements(array); | 
| 709         if (array->elements() != *backing_store) { | 689         if (array->elements() != *backing_store) { | 
| 710           backing_store = handle(array->elements(), isolate); | 690           backing_store = handle(array->elements(), isolate); | 
| 711         } | 691         } | 
| 712       } | 692       } | 
| 713       if (2 * length <= capacity) { | 693       if (2 * length <= capacity) { | 
| 714         // If more than half the elements won't be used, trim the array. | 694         // If more than half the elements won't be used, trim the array. | 
| 715         isolate->heap()->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>( | 695         isolate->heap()->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>( | 
| 716             *backing_store, capacity - length); | 696             *backing_store, capacity - length); | 
| 717       } else { | 697       } else { | 
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1351     if (IsFastSmiElementsKind(KindTraits::Kind)) { | 1331     if (IsFastSmiElementsKind(KindTraits::Kind)) { | 
| 1352       for (int i = 0; i < length; i++) { | 1332       for (int i = 0; i < length; i++) { | 
| 1353         DCHECK(BackingStore::get(*backing_store, i, isolate)->IsSmi() || | 1333         DCHECK(BackingStore::get(*backing_store, i, isolate)->IsSmi() || | 
| 1354                (IsFastHoleyElementsKind(KindTraits::Kind) && | 1334                (IsFastHoleyElementsKind(KindTraits::Kind) && | 
| 1355                 backing_store->is_the_hole(i))); | 1335                 backing_store->is_the_hole(i))); | 
| 1356       } | 1336       } | 
| 1357     } | 1337     } | 
| 1358 #endif | 1338 #endif | 
| 1359   } | 1339   } | 
| 1360 | 1340 | 
| 1361   static Handle<Object> PopImpl(Handle<JSArray> receiver, | 1341   static Handle<Object> PopImpl(Handle<JSArray> receiver) { | 
| 1362                                 Handle<FixedArrayBase> backing_store) { | 1342     return FastElementsAccessorSubclass::RemoveElement(receiver, AT_END); | 
| 1363     return FastElementsAccessorSubclass::RemoveElement(receiver, backing_store, |  | 
| 1364                                                        AT_END); |  | 
| 1365   } | 1343   } | 
| 1366 | 1344 | 
| 1367   static Handle<Object> ShiftImpl(Handle<JSArray> receiver, | 1345   static Handle<Object> ShiftImpl(Handle<JSArray> receiver) { | 
| 1368                                   Handle<FixedArrayBase> backing_store) { | 1346     return FastElementsAccessorSubclass::RemoveElement(receiver, AT_START); | 
| 1369     return FastElementsAccessorSubclass::RemoveElement(receiver, backing_store, |  | 
| 1370                                                        AT_START); |  | 
| 1371   } | 1347   } | 
| 1372 | 1348 | 
| 1373   static uint32_t PushImpl(Handle<JSArray> receiver, | 1349   static uint32_t PushImpl(Handle<JSArray> receiver, | 
| 1374                            Handle<FixedArrayBase> backing_store, |  | 
| 1375                            Arguments* args, uint32_t push_size) { | 1350                            Arguments* args, uint32_t push_size) { | 
|  | 1351     Handle<FixedArrayBase> backing_store(receiver->elements()); | 
| 1376     return FastElementsAccessorSubclass::AddArguments(receiver, backing_store, | 1352     return FastElementsAccessorSubclass::AddArguments(receiver, backing_store, | 
| 1377                                                       args, push_size, AT_END); | 1353                                                       args, push_size, AT_END); | 
| 1378   } | 1354   } | 
| 1379 | 1355 | 
| 1380   static uint32_t UnshiftImpl(Handle<JSArray> receiver, | 1356   static uint32_t UnshiftImpl(Handle<JSArray> receiver, | 
| 1381                               Handle<FixedArrayBase> backing_store, |  | 
| 1382                               Arguments* args, uint32_t unshift_size) { | 1357                               Arguments* args, uint32_t unshift_size) { | 
|  | 1358     Handle<FixedArrayBase> backing_store(receiver->elements()); | 
| 1383     return FastElementsAccessorSubclass::AddArguments( | 1359     return FastElementsAccessorSubclass::AddArguments( | 
| 1384         receiver, backing_store, args, unshift_size, AT_START); | 1360         receiver, backing_store, args, unshift_size, AT_START); | 
| 1385   } | 1361   } | 
| 1386 | 1362 | 
| 1387   static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, | 1363   static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, | 
| 1388                            Handle<FixedArrayBase> backing_store, int dst_index, | 1364                            Handle<FixedArrayBase> backing_store, int dst_index, | 
| 1389                            int src_index, int len, int hole_start, | 1365                            int src_index, int len, int hole_start, | 
| 1390                            int hole_end) { | 1366                            int hole_end) { | 
| 1391     UNREACHABLE(); | 1367     UNREACHABLE(); | 
| 1392   } | 1368   } | 
| 1393 | 1369 | 
| 1394   static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, | 1370   static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, | 
| 1395                                    Handle<FixedArrayBase> backing_store, |  | 
| 1396                                    uint32_t start, uint32_t end) { | 1371                                    uint32_t start, uint32_t end) { | 
| 1397     DCHECK(start < end); |  | 
| 1398     Isolate* isolate = receiver->GetIsolate(); | 1372     Isolate* isolate = receiver->GetIsolate(); | 
| 1399     int result_len = end - start; | 1373     Handle<FixedArrayBase> backing_store(receiver->elements(), isolate); | 
|  | 1374     int result_len = end < start ? 0u : end - start; | 
| 1400     Handle<JSArray> result_array = isolate->factory()->NewJSArray( | 1375     Handle<JSArray> result_array = isolate->factory()->NewJSArray( | 
| 1401         KindTraits::Kind, result_len, result_len); | 1376         KindTraits::Kind, result_len, result_len); | 
| 1402     DisallowHeapAllocation no_gc; | 1377     DisallowHeapAllocation no_gc; | 
| 1403     FastElementsAccessorSubclass::CopyElementsImpl( | 1378     FastElementsAccessorSubclass::CopyElementsImpl( | 
| 1404         *backing_store, start, result_array->elements(), KindTraits::Kind, 0, | 1379         *backing_store, start, result_array->elements(), KindTraits::Kind, 0, | 
| 1405         kPackedSizeNotKnown, result_len); | 1380         kPackedSizeNotKnown, result_len); | 
| 1406     FastElementsAccessorSubclass::TryTransitionResultArrayToPacked( | 1381     FastElementsAccessorSubclass::TryTransitionResultArrayToPacked( | 
| 1407         result_array); | 1382         result_array); | 
| 1408     return result_array; | 1383     return result_array; | 
| 1409   } | 1384   } | 
| 1410 | 1385 | 
| 1411   static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, | 1386   static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, | 
| 1412                                     Handle<FixedArrayBase> backing_store, |  | 
| 1413                                     uint32_t start, uint32_t delete_count, | 1387                                     uint32_t start, uint32_t delete_count, | 
| 1414                                     Arguments* args, uint32_t add_count) { | 1388                                     Arguments* args, uint32_t add_count) { | 
| 1415     Isolate* isolate = receiver->GetIsolate(); | 1389     Isolate* isolate = receiver->GetIsolate(); | 
| 1416     Heap* heap = isolate->heap(); | 1390     Heap* heap = isolate->heap(); | 
| 1417     uint32_t length = Smi::cast(receiver->length())->value(); | 1391     uint32_t length = Smi::cast(receiver->length())->value(); | 
| 1418     uint32_t new_length = length - delete_count + add_count; | 1392     uint32_t new_length = length - delete_count + add_count; | 
| 1419 | 1393 | 
|  | 1394     ElementsKind kind = KindTraits::Kind; | 
|  | 1395     if (new_length <= static_cast<uint32_t>(receiver->elements()->length()) && | 
|  | 1396         IsFastSmiOrObjectElementsKind(kind)) { | 
|  | 1397       HandleScope scope(isolate); | 
|  | 1398       JSObject::EnsureWritableFastElements(receiver); | 
|  | 1399     } | 
|  | 1400 | 
|  | 1401     Handle<FixedArrayBase> backing_store(receiver->elements(), isolate); | 
|  | 1402 | 
| 1420     if (new_length == 0) { | 1403     if (new_length == 0) { | 
| 1421       receiver->set_elements(heap->empty_fixed_array()); | 1404       receiver->set_elements(heap->empty_fixed_array()); | 
| 1422       receiver->set_length(Smi::FromInt(0)); | 1405       receiver->set_length(Smi::FromInt(0)); | 
| 1423       return isolate->factory()->NewJSArrayWithElements( | 1406       return isolate->factory()->NewJSArrayWithElements( | 
| 1424           backing_store, KindTraits::Kind, delete_count); | 1407           backing_store, KindTraits::Kind, delete_count); | 
| 1425     } | 1408     } | 
| 1426 | 1409 | 
| 1427     // Construct the result array which holds the deleted elements. | 1410     // Construct the result array which holds the deleted elements. | 
| 1428     Handle<JSArray> deleted_elements = isolate->factory()->NewJSArray( | 1411     Handle<JSArray> deleted_elements = isolate->factory()->NewJSArray( | 
| 1429         KindTraits::Kind, delete_count, delete_count); | 1412         KindTraits::Kind, delete_count, delete_count); | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1494     // Copy the trailing elements after start + delete_count | 1477     // Copy the trailing elements after start + delete_count | 
| 1495     FastElementsAccessorSubclass::CopyElementsImpl( | 1478     FastElementsAccessorSubclass::CopyElementsImpl( | 
| 1496         *backing_store, start + delete_count, *new_elms, KindTraits::Kind, | 1479         *backing_store, start + delete_count, *new_elms, KindTraits::Kind, | 
| 1497         start + add_count, kPackedSizeNotKnown, | 1480         start + add_count, kPackedSizeNotKnown, | 
| 1498         ElementsAccessor::kCopyToEndAndInitializeToHole); | 1481         ElementsAccessor::kCopyToEndAndInitializeToHole); | 
| 1499     receiver->set_elements(*new_elms); | 1482     receiver->set_elements(*new_elms); | 
| 1500     return new_elms; | 1483     return new_elms; | 
| 1501   } | 1484   } | 
| 1502 | 1485 | 
| 1503   static Handle<Object> RemoveElement(Handle<JSArray> receiver, | 1486   static Handle<Object> RemoveElement(Handle<JSArray> receiver, | 
| 1504                                       Handle<FixedArrayBase> backing_store, |  | 
| 1505                                       Where remove_position) { | 1487                                       Where remove_position) { | 
| 1506     Isolate* isolate = receiver->GetIsolate(); | 1488     Isolate* isolate = receiver->GetIsolate(); | 
|  | 1489     ElementsKind kind = KindTraits::Kind; | 
|  | 1490     if (IsFastSmiOrObjectElementsKind(kind)) { | 
|  | 1491       HandleScope scope(isolate); | 
|  | 1492       JSObject::EnsureWritableFastElements(receiver); | 
|  | 1493     } | 
|  | 1494     Handle<FixedArrayBase> backing_store(receiver->elements(), isolate); | 
| 1507     uint32_t length = | 1495     uint32_t length = | 
| 1508         static_cast<uint32_t>(Smi::cast(receiver->length())->value()); | 1496         static_cast<uint32_t>(Smi::cast(receiver->length())->value()); | 
| 1509     DCHECK(length > 0); | 1497     DCHECK(length > 0); | 
| 1510     int new_length = length - 1; | 1498     int new_length = length - 1; | 
| 1511     int remove_index = remove_position == AT_START ? 0 : new_length; | 1499     int remove_index = remove_position == AT_START ? 0 : new_length; | 
| 1512     Handle<Object> result = | 1500     Handle<Object> result = | 
| 1513         FastElementsAccessorSubclass::GetImpl(*backing_store, remove_index); | 1501         FastElementsAccessorSubclass::GetImpl(*backing_store, remove_index); | 
| 1514     if (remove_position == AT_START) { | 1502     if (remove_position == AT_START) { | 
| 1515       FastElementsAccessorSubclass::MoveElements( | 1503       FastElementsAccessorSubclass::MoveElements( | 
| 1516           isolate, receiver, backing_store, 0, 1, new_length, 0, 0); | 1504           isolate, receiver, backing_store, 0, 1, new_length, 0, 0); | 
| 1517     } | 1505     } | 
| 1518     FastElementsAccessorSubclass::SetLengthImpl(isolate, receiver, new_length, | 1506     FastElementsAccessorSubclass::SetLengthImpl(isolate, receiver, new_length, | 
| 1519                                                 backing_store); | 1507                                                 backing_store); | 
| 1520 | 1508 | 
| 1521     if (IsHoleyElementsKind(KindTraits::Kind) && result->IsTheHole()) { | 1509     if (IsHoleyElementsKind(kind) && result->IsTheHole()) { | 
| 1522       return receiver->GetIsolate()->factory()->undefined_value(); | 1510       return isolate->factory()->undefined_value(); | 
| 1523     } | 1511     } | 
| 1524     return result; | 1512     return result; | 
| 1525   } | 1513   } | 
| 1526 | 1514 | 
| 1527   static uint32_t AddArguments(Handle<JSArray> receiver, | 1515   static uint32_t AddArguments(Handle<JSArray> receiver, | 
| 1528                                Handle<FixedArrayBase> backing_store, | 1516                                Handle<FixedArrayBase> backing_store, | 
| 1529                                Arguments* args, uint32_t add_size, | 1517                                Arguments* args, uint32_t add_size, | 
| 1530                                Where remove_position) { | 1518                                Where remove_position) { | 
| 1531     uint32_t length = Smi::cast(receiver->length())->value(); | 1519     uint32_t length = Smi::cast(receiver->length())->value(); | 
| 1532     DCHECK(add_size > 0); | 1520     DCHECK(0 < add_size); | 
| 1533     uint32_t elms_len = backing_store->length(); | 1521     uint32_t elms_len = backing_store->length(); | 
| 1534     // Check we do not overflow the new_length. | 1522     // Check we do not overflow the new_length. | 
| 1535     DCHECK(add_size <= static_cast<uint32_t>(Smi::kMaxValue - length)); | 1523     DCHECK(add_size <= static_cast<uint32_t>(Smi::kMaxValue - length)); | 
| 1536     uint32_t new_length = length + add_size; | 1524     uint32_t new_length = length + add_size; | 
| 1537 | 1525 | 
| 1538     if (new_length > elms_len) { | 1526     if (new_length > elms_len) { | 
| 1539       // New backing storage is needed. | 1527       // New backing storage is needed. | 
| 1540       uint32_t capacity = JSObject::NewElementsCapacity(new_length); | 1528       uint32_t capacity = JSObject::NewElementsCapacity(new_length); | 
| 1541       // If we add arguments to the start we have to shift the existing objects. | 1529       // If we add arguments to the start we have to shift the existing objects. | 
| 1542       int copy_dst_index = remove_position == AT_START ? add_size : 0; | 1530       int copy_dst_index = remove_position == AT_START ? add_size : 0; | 
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1931   static uint32_t GetCapacityImpl(JSObject* holder, | 1919   static uint32_t GetCapacityImpl(JSObject* holder, | 
| 1932                                   FixedArrayBase* backing_store) { | 1920                                   FixedArrayBase* backing_store) { | 
| 1933     JSArrayBufferView* view = JSArrayBufferView::cast(holder); | 1921     JSArrayBufferView* view = JSArrayBufferView::cast(holder); | 
| 1934     if (view->WasNeutered()) return 0; | 1922     if (view->WasNeutered()) return 0; | 
| 1935     return backing_store->length(); | 1923     return backing_store->length(); | 
| 1936   } | 1924   } | 
| 1937 | 1925 | 
| 1938   static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, | 1926   static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, | 
| 1939                                               KeyAccumulator* accumulator, | 1927                                               KeyAccumulator* accumulator, | 
| 1940                                               AddKeyConversion convert) { | 1928                                               AddKeyConversion convert) { | 
| 1941     Handle<FixedArrayBase> elements(receiver->elements(), | 1929     Handle<FixedArrayBase> elements(receiver->elements()); | 
| 1942                                     receiver->GetIsolate()); |  | 
| 1943     uint32_t length = AccessorClass::GetCapacityImpl(*receiver, *elements); | 1930     uint32_t length = AccessorClass::GetCapacityImpl(*receiver, *elements); | 
| 1944     for (uint32_t i = 0; i < length; i++) { | 1931     for (uint32_t i = 0; i < length; i++) { | 
| 1945       Handle<Object> value = AccessorClass::GetImpl(*elements, i); | 1932       Handle<Object> value = AccessorClass::GetImpl(*elements, i); | 
| 1946       accumulator->AddKey(value, convert); | 1933       accumulator->AddKey(value, convert); | 
| 1947     } | 1934     } | 
| 1948   } | 1935   } | 
| 1949 }; | 1936 }; | 
| 1950 | 1937 | 
| 1951 | 1938 | 
| 1952 | 1939 | 
| (...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2680     } | 2667     } | 
| 2681   } | 2668   } | 
| 2682 | 2669 | 
| 2683   DCHECK(j == result_len); | 2670   DCHECK(j == result_len); | 
| 2684   return result_array; | 2671   return result_array; | 
| 2685 } | 2672 } | 
| 2686 | 2673 | 
| 2687 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 2674 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 
| 2688 }  // namespace internal | 2675 }  // namespace internal | 
| 2689 }  // namespace v8 | 2676 }  // namespace v8 | 
| OLD | NEW | 
|---|