| 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/code-stub-assembler.h" | 9 #include "src/code-stub-assembler.h" |
| 10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
| (...skipping 2259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2270 Generate_ArrayPrototypeIterationMethod<IterationKind::kKeys>(state); | 2270 Generate_ArrayPrototypeIterationMethod<IterationKind::kKeys>(state); |
| 2271 } | 2271 } |
| 2272 | 2272 |
| 2273 void Builtins::Generate_ArrayIteratorPrototypeNext( | 2273 void Builtins::Generate_ArrayIteratorPrototypeNext( |
| 2274 compiler::CodeAssemblerState* state) { | 2274 compiler::CodeAssemblerState* state) { |
| 2275 typedef compiler::Node Node; | 2275 typedef compiler::Node Node; |
| 2276 typedef CodeStubAssembler::Label Label; | 2276 typedef CodeStubAssembler::Label Label; |
| 2277 typedef CodeStubAssembler::Variable Variable; | 2277 typedef CodeStubAssembler::Variable Variable; |
| 2278 CodeStubAssembler assembler(state); | 2278 CodeStubAssembler assembler(state); |
| 2279 | 2279 |
| 2280 Node* operation = |
| 2281 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( |
| 2282 "Array Iterator.prototype.next", TENURED)); |
| 2283 |
| 2280 Node* iterator = assembler.Parameter(0); | 2284 Node* iterator = assembler.Parameter(0); |
| 2281 Node* context = assembler.Parameter(3); | 2285 Node* context = assembler.Parameter(3); |
| 2282 | 2286 |
| 2283 Variable var_value(&assembler, MachineRepresentation::kTagged); | 2287 Variable var_value(&assembler, MachineRepresentation::kTagged); |
| 2284 Variable var_done(&assembler, MachineRepresentation::kTagged); | 2288 Variable var_done(&assembler, MachineRepresentation::kTagged); |
| 2285 | 2289 |
| 2286 // Required, or else `throw_bad_receiver` fails a DCHECK due to these | 2290 // Required, or else `throw_bad_receiver` fails a DCHECK due to these |
| 2287 // variables not being bound along all paths, despite not being used. | 2291 // variables not being bound along all paths, despite not being used. |
| 2288 var_done.Bind(assembler.TrueConstant()); | 2292 var_done.Bind(assembler.TrueConstant()); |
| 2289 var_value.Bind(assembler.UndefinedConstant()); | 2293 var_value.Bind(assembler.UndefinedConstant()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2311 Node* array = assembler.LoadObjectField( | 2315 Node* array = assembler.LoadObjectField( |
| 2312 iterator, JSArrayIterator::kIteratedObjectOffset); | 2316 iterator, JSArrayIterator::kIteratedObjectOffset); |
| 2313 | 2317 |
| 2314 // Let index be O.[[ArrayIteratorNextIndex]]. | 2318 // Let index be O.[[ArrayIteratorNextIndex]]. |
| 2315 Node* index = | 2319 Node* index = |
| 2316 assembler.LoadObjectField(iterator, JSArrayIterator::kNextIndexOffset); | 2320 assembler.LoadObjectField(iterator, JSArrayIterator::kNextIndexOffset); |
| 2317 Node* orig_map = assembler.LoadObjectField( | 2321 Node* orig_map = assembler.LoadObjectField( |
| 2318 iterator, JSArrayIterator::kIteratedObjectMapOffset); | 2322 iterator, JSArrayIterator::kIteratedObjectMapOffset); |
| 2319 Node* array_map = assembler.LoadMap(array); | 2323 Node* array_map = assembler.LoadMap(array); |
| 2320 | 2324 |
| 2321 Label if_isfastarray(&assembler), if_isnotfastarray(&assembler); | 2325 Label if_isfastarray(&assembler), if_isnotfastarray(&assembler), |
| 2326 if_isdetached(&assembler, Label::kDeferred); |
| 2322 | 2327 |
| 2323 assembler.Branch(assembler.WordEqual(orig_map, array_map), &if_isfastarray, | 2328 assembler.Branch(assembler.WordEqual(orig_map, array_map), &if_isfastarray, |
| 2324 &if_isnotfastarray); | 2329 &if_isnotfastarray); |
| 2325 | 2330 |
| 2326 assembler.Bind(&if_isfastarray); | 2331 assembler.Bind(&if_isfastarray); |
| 2327 { | 2332 { |
| 2328 CSA_ASSERT(&assembler, | 2333 CSA_ASSERT(&assembler, |
| 2329 assembler.Word32Equal(assembler.LoadMapInstanceType(array_map), | 2334 assembler.Word32Equal(assembler.LoadMapInstanceType(array_map), |
| 2330 assembler.Int32Constant(JS_ARRAY_TYPE))); | 2335 assembler.Int32Constant(JS_ARRAY_TYPE))); |
| 2331 | 2336 |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2522 assembler.Bind(&generic_values); | 2527 assembler.Bind(&generic_values); |
| 2523 { | 2528 { |
| 2524 Callable get_property = CodeFactory::GetProperty(assembler.isolate()); | 2529 Callable get_property = CodeFactory::GetProperty(assembler.isolate()); |
| 2525 var_value.Bind(assembler.CallStub(get_property, context, array, index)); | 2530 var_value.Bind(assembler.CallStub(get_property, context, array, index)); |
| 2526 assembler.Goto(&allocate_entry_if_needed); | 2531 assembler.Goto(&allocate_entry_if_needed); |
| 2527 } | 2532 } |
| 2528 } | 2533 } |
| 2529 | 2534 |
| 2530 assembler.Bind(&if_istypedarray); | 2535 assembler.Bind(&if_istypedarray); |
| 2531 { | 2536 { |
| 2532 Node* length = nullptr; | 2537 Node* buffer = |
| 2533 { | 2538 assembler.LoadObjectField(array, JSTypedArray::kBufferOffset); |
| 2534 Variable var_length(&assembler, MachineRepresentation::kTagged); | 2539 assembler.GotoIf(assembler.IsDetachedBuffer(buffer), &if_isdetached); |
| 2535 Label if_isdetached(&assembler, Label::kDeferred), | |
| 2536 if_isnotdetached(&assembler), done(&assembler); | |
| 2537 | 2540 |
| 2538 Node* buffer = | 2541 Node* length = |
| 2539 assembler.LoadObjectField(array, JSTypedArray::kBufferOffset); | 2542 assembler.LoadObjectField(array, JSTypedArray::kLengthOffset); |
| 2540 assembler.Branch(assembler.IsDetachedBuffer(buffer), &if_isdetached, | |
| 2541 &if_isnotdetached); | |
| 2542 | 2543 |
| 2543 assembler.Bind(&if_isnotdetached); | |
| 2544 { | |
| 2545 var_length.Bind( | |
| 2546 assembler.LoadObjectField(array, JSTypedArray::kLengthOffset)); | |
| 2547 assembler.Goto(&done); | |
| 2548 } | |
| 2549 | |
| 2550 assembler.Bind(&if_isdetached); | |
| 2551 { | |
| 2552 // TODO(caitp): If IsDetached(buffer) is true, throw a TypeError, per | |
| 2553 // https://github.com/tc39/ecma262/issues/713 | |
| 2554 var_length.Bind(assembler.SmiConstant(Smi::kZero)); | |
| 2555 assembler.Goto(&done); | |
| 2556 } | |
| 2557 | |
| 2558 assembler.Bind(&done); | |
| 2559 length = var_length.value(); | |
| 2560 } | |
| 2561 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(length)); | 2544 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(length)); |
| 2562 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index)); | 2545 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index)); |
| 2563 | 2546 |
| 2564 assembler.GotoUnless(assembler.SmiBelow(index, length), &set_done); | 2547 assembler.GotoUnless(assembler.SmiBelow(index, length), &set_done); |
| 2565 | 2548 |
| 2566 Node* one = assembler.SmiConstant(1); | 2549 Node* one = assembler.SmiConstant(1); |
| 2567 assembler.StoreObjectFieldNoWriteBarrier( | 2550 assembler.StoreObjectFieldNoWriteBarrier( |
| 2568 iterator, JSArrayIterator::kNextIndexOffset, | 2551 iterator, JSArrayIterator::kNextIndexOffset, |
| 2569 assembler.SmiAdd(index, one)); | 2552 assembler.SmiAdd(index, one)); |
| 2570 var_done.Bind(assembler.FalseConstant()); | 2553 var_done.Bind(assembler.FalseConstant()); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2746 assembler.StoreObjectFieldNoWriteBarrier( | 2729 assembler.StoreObjectFieldNoWriteBarrier( |
| 2747 result, JSIteratorResult::kValueOffset, var_value.value()); | 2730 result, JSIteratorResult::kValueOffset, var_value.value()); |
| 2748 assembler.StoreObjectFieldNoWriteBarrier( | 2731 assembler.StoreObjectFieldNoWriteBarrier( |
| 2749 result, JSIteratorResult::kDoneOffset, var_done.value()); | 2732 result, JSIteratorResult::kDoneOffset, var_done.value()); |
| 2750 assembler.Return(result); | 2733 assembler.Return(result); |
| 2751 } | 2734 } |
| 2752 | 2735 |
| 2753 assembler.Bind(&throw_bad_receiver); | 2736 assembler.Bind(&throw_bad_receiver); |
| 2754 { | 2737 { |
| 2755 // The {receiver} is not a valid JSArrayIterator. | 2738 // The {receiver} is not a valid JSArrayIterator. |
| 2756 Node* result = assembler.CallRuntime( | 2739 Node* result = |
| 2757 Runtime::kThrowIncompatibleMethodReceiver, context, | 2740 assembler.CallRuntime(Runtime::kThrowIncompatibleMethodReceiver, |
| 2758 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( | 2741 context, operation, iterator); |
| 2759 "Array Iterator.prototype.next", TENURED)), | 2742 assembler.Return(result); |
| 2760 iterator); | 2743 } |
| 2744 |
| 2745 assembler.Bind(&if_isdetached); |
| 2746 { |
| 2747 Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); |
| 2748 Node* result = assembler.CallRuntime(Runtime::kThrowTypeError, context, |
| 2749 message, operation, array); |
| 2761 assembler.Return(result); | 2750 assembler.Return(result); |
| 2762 } | 2751 } |
| 2763 } | 2752 } |
| 2764 | 2753 |
| 2765 } // namespace internal | 2754 } // namespace internal |
| 2766 } // namespace v8 | 2755 } // namespace v8 |
| OLD | NEW |