| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/builtins/builtins.h" | 5 #include "src/builtins/builtins.h" |
| 6 #include "src/builtins/builtins-utils.h" | 6 #include "src/builtins/builtins-utils.h" |
| 7 | 7 |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/contexts.h" | 9 #include "src/contexts.h" |
| 10 #include "src/elements.h" | 10 #include "src/elements.h" |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 // during iteration. | 450 // during iteration. |
| 451 // This shouldn't happen in anything but pathological cases. | 451 // This shouldn't happen in anything but pathological cases. |
| 452 SetDictionaryMode(); | 452 SetDictionaryMode(); |
| 453 // Fall-through to dictionary mode. | 453 // Fall-through to dictionary mode. |
| 454 } | 454 } |
| 455 DCHECK(!fast_elements()); | 455 DCHECK(!fast_elements()); |
| 456 Handle<SeededNumberDictionary> dict( | 456 Handle<SeededNumberDictionary> dict( |
| 457 SeededNumberDictionary::cast(*storage_)); | 457 SeededNumberDictionary::cast(*storage_)); |
| 458 // The object holding this backing store has just been allocated, so | 458 // The object holding this backing store has just been allocated, so |
| 459 // it cannot yet be used as a prototype. | 459 // it cannot yet be used as a prototype. |
| 460 Handle<SeededNumberDictionary> result = | 460 Handle<JSObject> not_a_prototype_holder; |
| 461 SeededNumberDictionary::AtNumberPut(dict, index, elm, false); | 461 Handle<SeededNumberDictionary> result = SeededNumberDictionary::AtNumberPut( |
| 462 dict, index, elm, not_a_prototype_holder); |
| 462 if (!result.is_identical_to(dict)) { | 463 if (!result.is_identical_to(dict)) { |
| 463 // Dictionary needed to grow. | 464 // Dictionary needed to grow. |
| 464 clear_storage(); | 465 clear_storage(); |
| 465 set_storage(*result); | 466 set_storage(*result); |
| 466 } | 467 } |
| 467 return true; | 468 return true; |
| 468 } | 469 } |
| 469 | 470 |
| 470 void increase_index_offset(uint32_t delta) { | 471 void increase_index_offset(uint32_t delta) { |
| 471 if (JSObject::kMaxElementCount - index_offset_ < delta) { | 472 if (JSObject::kMaxElementCount - index_offset_ < delta) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 Handle<FixedArray> current_storage = storage_fixed_array(); | 519 Handle<FixedArray> current_storage = storage_fixed_array(); |
| 519 Handle<SeededNumberDictionary> slow_storage( | 520 Handle<SeededNumberDictionary> slow_storage( |
| 520 SeededNumberDictionary::New(isolate_, current_storage->length())); | 521 SeededNumberDictionary::New(isolate_, current_storage->length())); |
| 521 uint32_t current_length = static_cast<uint32_t>(current_storage->length()); | 522 uint32_t current_length = static_cast<uint32_t>(current_storage->length()); |
| 522 FOR_WITH_HANDLE_SCOPE( | 523 FOR_WITH_HANDLE_SCOPE( |
| 523 isolate_, uint32_t, i = 0, i, i < current_length, i++, { | 524 isolate_, uint32_t, i = 0, i, i < current_length, i++, { |
| 524 Handle<Object> element(current_storage->get(i), isolate_); | 525 Handle<Object> element(current_storage->get(i), isolate_); |
| 525 if (!element->IsTheHole(isolate_)) { | 526 if (!element->IsTheHole(isolate_)) { |
| 526 // The object holding this backing store has just been allocated, so | 527 // The object holding this backing store has just been allocated, so |
| 527 // it cannot yet be used as a prototype. | 528 // it cannot yet be used as a prototype. |
| 529 Handle<JSObject> not_a_prototype_holder; |
| 528 Handle<SeededNumberDictionary> new_storage = | 530 Handle<SeededNumberDictionary> new_storage = |
| 529 SeededNumberDictionary::AtNumberPut(slow_storage, i, element, | 531 SeededNumberDictionary::AtNumberPut(slow_storage, i, element, |
| 530 false); | 532 not_a_prototype_holder); |
| 531 if (!new_storage.is_identical_to(slow_storage)) { | 533 if (!new_storage.is_identical_to(slow_storage)) { |
| 532 slow_storage = loop_scope.CloseAndEscape(new_storage); | 534 slow_storage = loop_scope.CloseAndEscape(new_storage); |
| 533 } | 535 } |
| 534 } | 536 } |
| 535 }); | 537 }); |
| 536 clear_storage(); | 538 clear_storage(); |
| 537 set_storage(*slow_storage); | 539 set_storage(*slow_storage); |
| 538 set_fast_elements(false); | 540 set_fast_elements(false); |
| 539 } | 541 } |
| 540 | 542 |
| (...skipping 2071 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2612 Runtime::kThrowIncompatibleMethodReceiver, context, | 2614 Runtime::kThrowIncompatibleMethodReceiver, context, |
| 2613 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( | 2615 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( |
| 2614 "Array Iterator.prototype.next", TENURED)), | 2616 "Array Iterator.prototype.next", TENURED)), |
| 2615 iterator); | 2617 iterator); |
| 2616 assembler.Return(result); | 2618 assembler.Return(result); |
| 2617 } | 2619 } |
| 2618 } | 2620 } |
| 2619 | 2621 |
| 2620 } // namespace internal | 2622 } // namespace internal |
| 2621 } // namespace v8 | 2623 } // namespace v8 |
| OLD | NEW |