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 |