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 Handle<String> operation = assembler.factory()->NewStringFromAsciiChecked( |
| 2281 "Array Iterator.prototype.next", TENURED); |
| 2282 |
2280 Node* iterator = assembler.Parameter(0); | 2283 Node* iterator = assembler.Parameter(0); |
2281 Node* context = assembler.Parameter(3); | 2284 Node* context = assembler.Parameter(3); |
2282 | 2285 |
2283 Variable var_value(&assembler, MachineRepresentation::kTagged); | 2286 Variable var_value(&assembler, MachineRepresentation::kTagged); |
2284 Variable var_done(&assembler, MachineRepresentation::kTagged); | 2287 Variable var_done(&assembler, MachineRepresentation::kTagged); |
2285 | 2288 |
2286 // Required, or else `throw_bad_receiver` fails a DCHECK due to these | 2289 // Required, or else `throw_bad_receiver` fails a DCHECK due to these |
2287 // variables not being bound along all paths, despite not being used. | 2290 // variables not being bound along all paths, despite not being used. |
2288 var_done.Bind(assembler.TrueConstant()); | 2291 var_done.Bind(assembler.TrueConstant()); |
2289 var_value.Bind(assembler.UndefinedConstant()); | 2292 var_value.Bind(assembler.UndefinedConstant()); |
(...skipping 21 matching lines...) Expand all Loading... |
2311 Node* array = assembler.LoadObjectField( | 2314 Node* array = assembler.LoadObjectField( |
2312 iterator, JSArrayIterator::kIteratedObjectOffset); | 2315 iterator, JSArrayIterator::kIteratedObjectOffset); |
2313 | 2316 |
2314 // Let index be O.[[ArrayIteratorNextIndex]]. | 2317 // Let index be O.[[ArrayIteratorNextIndex]]. |
2315 Node* index = | 2318 Node* index = |
2316 assembler.LoadObjectField(iterator, JSArrayIterator::kNextIndexOffset); | 2319 assembler.LoadObjectField(iterator, JSArrayIterator::kNextIndexOffset); |
2317 Node* orig_map = assembler.LoadObjectField( | 2320 Node* orig_map = assembler.LoadObjectField( |
2318 iterator, JSArrayIterator::kIteratedObjectMapOffset); | 2321 iterator, JSArrayIterator::kIteratedObjectMapOffset); |
2319 Node* array_map = assembler.LoadMap(array); | 2322 Node* array_map = assembler.LoadMap(array); |
2320 | 2323 |
2321 Label if_isfastarray(&assembler), if_isnotfastarray(&assembler); | 2324 Label if_isfastarray(&assembler), if_isnotfastarray(&assembler), |
| 2325 if_isdetached(&assembler, Label::kDeferred); |
2322 | 2326 |
2323 assembler.Branch(assembler.WordEqual(orig_map, array_map), &if_isfastarray, | 2327 assembler.Branch(assembler.WordEqual(orig_map, array_map), &if_isfastarray, |
2324 &if_isnotfastarray); | 2328 &if_isnotfastarray); |
2325 | 2329 |
2326 assembler.Bind(&if_isfastarray); | 2330 assembler.Bind(&if_isfastarray); |
2327 { | 2331 { |
2328 CSA_ASSERT(&assembler, | 2332 CSA_ASSERT(&assembler, |
2329 assembler.Word32Equal(assembler.LoadMapInstanceType(array_map), | 2333 assembler.Word32Equal(assembler.LoadMapInstanceType(array_map), |
2330 assembler.Int32Constant(JS_ARRAY_TYPE))); | 2334 assembler.Int32Constant(JS_ARRAY_TYPE))); |
2331 | 2335 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2522 assembler.Bind(&generic_values); | 2526 assembler.Bind(&generic_values); |
2523 { | 2527 { |
2524 Callable get_property = CodeFactory::GetProperty(assembler.isolate()); | 2528 Callable get_property = CodeFactory::GetProperty(assembler.isolate()); |
2525 var_value.Bind(assembler.CallStub(get_property, context, array, index)); | 2529 var_value.Bind(assembler.CallStub(get_property, context, array, index)); |
2526 assembler.Goto(&allocate_entry_if_needed); | 2530 assembler.Goto(&allocate_entry_if_needed); |
2527 } | 2531 } |
2528 } | 2532 } |
2529 | 2533 |
2530 assembler.Bind(&if_istypedarray); | 2534 assembler.Bind(&if_istypedarray); |
2531 { | 2535 { |
2532 Node* length = nullptr; | 2536 Node* buffer = |
2533 { | 2537 assembler.LoadObjectField(array, JSTypedArray::kBufferOffset); |
2534 Variable var_length(&assembler, MachineRepresentation::kTagged); | 2538 assembler.GotoIf(assembler.IsDetachedBuffer(buffer), &if_isdetached); |
2535 Label if_isdetached(&assembler, Label::kDeferred), | |
2536 if_isnotdetached(&assembler), done(&assembler); | |
2537 | 2539 |
2538 Node* buffer = | 2540 Node* length = |
2539 assembler.LoadObjectField(array, JSTypedArray::kBufferOffset); | 2541 assembler.LoadObjectField(array, JSTypedArray::kLengthOffset); |
2540 assembler.Branch(assembler.IsDetachedBuffer(buffer), &if_isdetached, | |
2541 &if_isnotdetached); | |
2542 | 2542 |
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)); | 2543 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(length)); |
2562 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index)); | 2544 CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index)); |
2563 | 2545 |
2564 assembler.GotoUnless(assembler.SmiBelow(index, length), &set_done); | 2546 assembler.GotoUnless(assembler.SmiBelow(index, length), &set_done); |
2565 | 2547 |
2566 Node* one = assembler.SmiConstant(1); | 2548 Node* one = assembler.SmiConstant(1); |
2567 assembler.StoreObjectFieldNoWriteBarrier( | 2549 assembler.StoreObjectFieldNoWriteBarrier( |
2568 iterator, JSArrayIterator::kNextIndexOffset, | 2550 iterator, JSArrayIterator::kNextIndexOffset, |
2569 assembler.SmiAdd(index, one)); | 2551 assembler.SmiAdd(index, one)); |
2570 var_done.Bind(assembler.FalseConstant()); | 2552 var_done.Bind(assembler.FalseConstant()); |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 assembler.StoreObjectFieldNoWriteBarrier( | 2730 assembler.StoreObjectFieldNoWriteBarrier( |
2749 result, JSIteratorResult::kDoneOffset, var_done.value()); | 2731 result, JSIteratorResult::kDoneOffset, var_done.value()); |
2750 assembler.Return(result); | 2732 assembler.Return(result); |
2751 } | 2733 } |
2752 | 2734 |
2753 assembler.Bind(&throw_bad_receiver); | 2735 assembler.Bind(&throw_bad_receiver); |
2754 { | 2736 { |
2755 // The {receiver} is not a valid JSArrayIterator. | 2737 // The {receiver} is not a valid JSArrayIterator. |
2756 Node* result = assembler.CallRuntime( | 2738 Node* result = assembler.CallRuntime( |
2757 Runtime::kThrowIncompatibleMethodReceiver, context, | 2739 Runtime::kThrowIncompatibleMethodReceiver, context, |
2758 assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( | 2740 assembler.HeapConstant(operation), iterator); |
2759 "Array Iterator.prototype.next", TENURED)), | 2741 assembler.Return(result); |
2760 iterator); | 2742 } |
| 2743 |
| 2744 assembler.Bind(&if_isdetached); |
| 2745 { |
| 2746 Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); |
| 2747 Node* result = |
| 2748 assembler.CallRuntime(Runtime::kThrowTypeError, context, message, |
| 2749 assembler.HeapConstant(operation)); |
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 |