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 |