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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 108 return false; | 108 return false; |
| 109 } | 109 } |
| 110 | 110 |
| 111 | 111 |
| 112 MUST_USE_RESULT | 112 MUST_USE_RESULT |
| 113 MaybeHandle<Object> ThrowArrayLengthRangeError(Isolate* isolate) { | 113 MaybeHandle<Object> ThrowArrayLengthRangeError(Isolate* isolate) { |
| 114 THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kInvalidArrayLength), | 114 THROW_NEW_ERROR(isolate, NewRangeError(MessageTemplate::kInvalidArrayLength), |
| 115 Object); | 115 Object); |
| 116 } | 116 } |
| 117 | 117 |
| 118 | |
|
Jakob Kummerow
2015/09/14 15:09:47
nit: keep this
| |
| 119 void CopyObjectToObjectElements(FixedArrayBase* from_base, | 118 void CopyObjectToObjectElements(FixedArrayBase* from_base, |
| 120 ElementsKind from_kind, uint32_t from_start, | 119 ElementsKind from_kind, uint32_t from_start, |
| 121 FixedArrayBase* to_base, ElementsKind to_kind, | 120 FixedArrayBase* to_base, ElementsKind to_kind, |
| 122 uint32_t to_start, int raw_copy_size) { | 121 uint32_t to_start, int raw_copy_size) { |
| 123 DCHECK(to_base->map() != | 122 DCHECK(to_base->map() != |
| 124 from_base->GetIsolate()->heap()->fixed_cow_array_map()); | 123 from_base->GetIsolate()->heap()->fixed_cow_array_map()); |
| 125 DisallowHeapAllocation no_allocation; | 124 DisallowHeapAllocation no_allocation; |
| 126 int copy_size = raw_copy_size; | 125 int copy_size = raw_copy_size; |
| 127 if (raw_copy_size < 0) { | 126 if (raw_copy_size < 0) { |
| 128 DCHECK(raw_copy_size == ElementsAccessor::kCopyToEnd || | 127 DCHECK(raw_copy_size == ElementsAccessor::kCopyToEnd || |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 527 uint32_t end) { | 526 uint32_t end) { |
| 528 if (IsFastPackedElementsKind(kind())) return true; | 527 if (IsFastPackedElementsKind(kind())) return true; |
| 529 for (uint32_t i = start; i < end; i++) { | 528 for (uint32_t i = start; i < end; i++) { |
| 530 if (!ElementsAccessorSubclass::HasElementImpl(holder, i, backing_store)) { | 529 if (!ElementsAccessorSubclass::HasElementImpl(holder, i, backing_store)) { |
| 531 return false; | 530 return false; |
| 532 } | 531 } |
| 533 } | 532 } |
| 534 return true; | 533 return true; |
| 535 } | 534 } |
| 536 | 535 |
| 536 static void TryTransitionResultArrayToPacked(Handle<JSArray> array) { | |
| 537 if (!IsHoleyElementsKind(kind())) return; | |
| 538 int length = Smi::cast(array->length())->value(); | |
| 539 Handle<FixedArrayBase> backing_store(array->elements()); | |
| 540 if (!ElementsAccessorSubclass::IsPackedImpl(array, backing_store, 0, | |
| 541 length)) { | |
| 542 return; | |
| 543 } | |
| 544 ElementsKind packed_kind = GetPackedElementsKind(kind()); | |
| 545 Handle<Map> new_map = | |
| 546 JSObject::GetElementsTransitionMap(array, packed_kind); | |
| 547 JSObject::MigrateToMap(array, new_map); | |
| 548 if (FLAG_trace_elements_transitions) { | |
| 549 JSObject::PrintElementsTransition(stdout, array, kind(), backing_store, | |
| 550 packed_kind, backing_store); | |
| 551 } | |
| 552 } | |
| 553 | |
| 537 virtual bool HasElement(Handle<JSObject> holder, uint32_t index, | 554 virtual bool HasElement(Handle<JSObject> holder, uint32_t index, |
| 538 Handle<FixedArrayBase> backing_store) final { | 555 Handle<FixedArrayBase> backing_store) final { |
| 539 return ElementsAccessorSubclass::HasElementImpl(holder, index, | 556 return ElementsAccessorSubclass::HasElementImpl(holder, index, |
| 540 backing_store); | 557 backing_store); |
| 541 } | 558 } |
| 542 | 559 |
| 543 static bool HasElementImpl(Handle<JSObject> holder, uint32_t index, | 560 static bool HasElementImpl(Handle<JSObject> holder, uint32_t index, |
| 544 Handle<FixedArrayBase> backing_store) { | 561 Handle<FixedArrayBase> backing_store) { |
| 545 return ElementsAccessorSubclass::GetEntryForIndexImpl( | 562 return ElementsAccessorSubclass::GetEntryForIndexImpl( |
| 546 *holder, *backing_store, index) != kMaxUInt32; | 563 *holder, *backing_store, index) != kMaxUInt32; |
| (...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1438 uint32_t start, uint32_t end) { | 1455 uint32_t start, uint32_t end) { |
| 1439 DCHECK(start < end); | 1456 DCHECK(start < end); |
| 1440 Isolate* isolate = receiver->GetIsolate(); | 1457 Isolate* isolate = receiver->GetIsolate(); |
| 1441 int result_len = end - start; | 1458 int result_len = end - start; |
| 1442 Handle<JSArray> result_array = isolate->factory()->NewJSArray( | 1459 Handle<JSArray> result_array = isolate->factory()->NewJSArray( |
| 1443 KindTraits::Kind, result_len, result_len); | 1460 KindTraits::Kind, result_len, result_len); |
| 1444 DisallowHeapAllocation no_gc; | 1461 DisallowHeapAllocation no_gc; |
| 1445 FastElementsAccessorSubclass::CopyElementsImpl( | 1462 FastElementsAccessorSubclass::CopyElementsImpl( |
| 1446 *backing_store, start, result_array->elements(), KindTraits::Kind, 0, | 1463 *backing_store, start, result_array->elements(), KindTraits::Kind, 0, |
| 1447 kPackedSizeNotKnown, result_len); | 1464 kPackedSizeNotKnown, result_len); |
| 1465 FastElementsAccessorSubclass::TryTransitionResultArrayToPacked( | |
| 1466 result_array); | |
| 1448 return result_array; | 1467 return result_array; |
| 1449 } | 1468 } |
| 1450 | 1469 |
| 1451 static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, | 1470 static Handle<JSArray> SpliceImpl(Handle<JSArray> receiver, |
| 1452 Handle<FixedArrayBase> backing_store, | 1471 Handle<FixedArrayBase> backing_store, |
| 1453 uint32_t start, uint32_t delete_count, | 1472 uint32_t start, uint32_t delete_count, |
| 1454 Arguments* args, uint32_t add_count) { | 1473 Arguments* args, uint32_t add_count) { |
| 1455 Isolate* isolate = receiver->GetIsolate(); | 1474 Isolate* isolate = receiver->GetIsolate(); |
| 1456 Heap* heap = isolate->heap(); | 1475 Heap* heap = isolate->heap(); |
| 1457 uint32_t len = Smi::cast(receiver->length())->value(); | 1476 uint32_t len = Smi::cast(receiver->length())->value(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1492 for (uint32_t index = 0; index < add_count; index++) { | 1511 for (uint32_t index = 0; index < add_count; index++) { |
| 1493 Object* object = (*args)[3 + index]; | 1512 Object* object = (*args)[3 + index]; |
| 1494 FastElementsAccessorSubclass::SetImpl(raw_backing_store, index + start, | 1513 FastElementsAccessorSubclass::SetImpl(raw_backing_store, index + start, |
| 1495 object, mode); | 1514 object, mode); |
| 1496 } | 1515 } |
| 1497 | 1516 |
| 1498 if (elms_changed) { | 1517 if (elms_changed) { |
| 1499 receiver->set_elements(*backing_store); | 1518 receiver->set_elements(*backing_store); |
| 1500 } | 1519 } |
| 1501 receiver->set_length(Smi::FromInt(new_length)); | 1520 receiver->set_length(Smi::FromInt(new_length)); |
| 1521 FastElementsAccessorSubclass::TryTransitionResultArrayToPacked( | |
| 1522 deleted_elements); | |
| 1502 return deleted_elements; | 1523 return deleted_elements; |
| 1503 } | 1524 } |
| 1504 | 1525 |
| 1505 private: | 1526 private: |
| 1506 static bool SpliceShrinkStep(Handle<FixedArrayBase>& backing_store, | 1527 static bool SpliceShrinkStep(Handle<FixedArrayBase>& backing_store, |
| 1507 Heap* heap, uint32_t start, | 1528 Heap* heap, uint32_t start, |
| 1508 uint32_t delete_count, uint32_t add_count, | 1529 uint32_t delete_count, uint32_t add_count, |
| 1509 uint32_t len, uint32_t new_length) { | 1530 uint32_t len, uint32_t new_length) { |
| 1510 const int move_left_count = len - delete_count - start; | 1531 const int move_left_count = len - delete_count - start; |
| 1511 const int move_left_dst_index = start + add_count; | 1532 const int move_left_dst_index = start + add_count; |
| (...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2409 } | 2430 } |
| 2410 } | 2431 } |
| 2411 | 2432 |
| 2412 DCHECK(j == result_len); | 2433 DCHECK(j == result_len); |
| 2413 return result_array; | 2434 return result_array; |
| 2414 } | 2435 } |
| 2415 | 2436 |
| 2416 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 2437 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
| 2417 } // namespace internal | 2438 } // namespace internal |
| 2418 } // namespace v8 | 2439 } // namespace v8 |
| OLD | NEW |