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

Side by Side Diff: src/elements.cc

Issue 1340033002: builtins.cc return PackedElementsKind where applicable (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: upload Created 5 years, 3 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
« no previous file with comments | « src/builtins.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/builtins.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698