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 2283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2294 &allocate_iterator_result); | 2294 &allocate_iterator_result); |
2295 | 2295 |
2296 Node* array_type = assembler->LoadInstanceType(array); | 2296 Node* array_type = assembler->LoadInstanceType(array); |
2297 assembler->Branch( | 2297 assembler->Branch( |
2298 assembler->Word32Equal(array_type, | 2298 assembler->Word32Equal(array_type, |
2299 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)), | 2299 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)), |
2300 &if_istypedarray, &if_isgeneric); | 2300 &if_istypedarray, &if_isgeneric); |
2301 | 2301 |
2302 assembler->Bind(&if_isgeneric); | 2302 assembler->Bind(&if_isgeneric); |
2303 { | 2303 { |
2304 Label if_wasfastarray(assembler), if_wasnotfastarray(assembler); | |
Benedikt Meurer
2016/11/08 08:30:00
Label if_wasnotfastarray still unused.
caitp
2016/11/08 17:53:06
it's toast
| |
2305 | |
2304 Node* length = nullptr; | 2306 Node* length = nullptr; |
2305 { | 2307 { |
2306 Variable var_length(assembler, MachineRepresentation::kTagged); | 2308 Variable var_length(assembler, MachineRepresentation::kTagged); |
2307 Label if_isarray(assembler), if_isnotarray(assembler), done(assembler); | 2309 Label if_isarray(assembler), if_isnotarray(assembler), done(assembler); |
2308 assembler->Branch( | 2310 assembler->Branch( |
2309 assembler->Word32Equal(array_type, | 2311 assembler->Word32Equal(array_type, |
2310 assembler->Int32Constant(JS_ARRAY_TYPE)), | 2312 assembler->Int32Constant(JS_ARRAY_TYPE)), |
2311 &if_isarray, &if_isnotarray); | 2313 &if_isarray, &if_isnotarray); |
2312 | 2314 |
2313 assembler->Bind(&if_isarray); | 2315 assembler->Bind(&if_isarray); |
2314 { | 2316 { |
2315 var_length.Bind( | 2317 var_length.Bind( |
2316 assembler->LoadObjectField(array, JSArray::kLengthOffset)); | 2318 assembler->LoadObjectField(array, JSArray::kLengthOffset)); |
2317 assembler->Goto(&done); | 2319 |
2320 // Invalidate protector cell if needed | |
2321 assembler->Branch( | |
2322 assembler->WordNotEqual(orig_map, assembler->UndefinedConstant()), | |
2323 &if_wasfastarray, &done); | |
2324 | |
2325 assembler->Bind(&if_wasfastarray); | |
2326 { | |
2327 Label if_invalid(assembler, Label::kDeferred); | |
2328 // Invalidate array_iterator_protector cell if needed (Not needed | |
2329 // for keys iteration, or if already marked as invalid) | |
2330 assembler->StoreObjectField( | |
2331 iterator, JSArrayIterator::kIteratedObjectMapOffset, | |
2332 assembler->UndefinedConstant()); | |
2333 assembler->GotoIf( | |
2334 assembler->Uint32LessThanOrEqual( | |
2335 instance_type, assembler->Int32Constant( | |
2336 JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE)), | |
2337 &done); | |
2338 | |
2339 Node* invalid = assembler->SmiConstant( | |
2340 Smi::FromInt(Isolate::kArrayProtectorInvalid)); | |
2341 Node* cell = | |
2342 assembler->LoadRoot(Heap::kArrayIteratorProtectorRootIndex); | |
2343 Node* cell_value = | |
2344 assembler->LoadObjectField(cell, PropertyCell::kValueOffset); | |
2345 assembler->Branch(assembler->WordEqual(cell_value, invalid), &done, | |
2346 &if_invalid); | |
2347 | |
2348 assembler->Bind(&if_invalid); | |
2349 assembler->CallRuntime(Runtime::kInvalidateArrayIteratorProtector, | |
2350 context); | |
2351 assembler->Goto(&done); | |
2352 } | |
2318 } | 2353 } |
2319 | 2354 |
2320 assembler->Bind(&if_isnotarray); | 2355 assembler->Bind(&if_isnotarray); |
2321 { | 2356 { |
2322 Node* length_string = assembler->HeapConstant( | 2357 Node* length_string = assembler->HeapConstant( |
2323 assembler->isolate()->factory()->length_string()); | 2358 assembler->isolate()->factory()->length_string()); |
2324 Callable get_property = | 2359 Callable get_property = |
2325 CodeFactory::GetProperty(assembler->isolate()); | 2360 CodeFactory::GetProperty(assembler->isolate()); |
2326 Node* length = | 2361 Node* length = |
2327 assembler->CallStub(get_property, context, array, length_string); | 2362 assembler->CallStub(get_property, context, array, length_string); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2370 | 2405 |
2371 assembler->Bind(&if_isnotdetached); | 2406 assembler->Bind(&if_isnotdetached); |
2372 { | 2407 { |
2373 var_length.Bind( | 2408 var_length.Bind( |
2374 assembler->LoadObjectField(array, JSTypedArray::kLengthOffset)); | 2409 assembler->LoadObjectField(array, JSTypedArray::kLengthOffset)); |
2375 assembler->Goto(&done); | 2410 assembler->Goto(&done); |
2376 } | 2411 } |
2377 | 2412 |
2378 assembler->Bind(&if_isdetached); | 2413 assembler->Bind(&if_isdetached); |
2379 { | 2414 { |
2415 // TODO(caitp): If IsDetached(buffer) is true, throw a TypeError, per | |
2416 // https://github.com/tc39/ecma262/issues/713 | |
2380 var_length.Bind(assembler->SmiConstant(Smi::kZero)); | 2417 var_length.Bind(assembler->SmiConstant(Smi::kZero)); |
2381 assembler->Goto(&done); | 2418 assembler->Goto(&done); |
2382 } | 2419 } |
2383 | 2420 |
2384 assembler->Bind(&done); | 2421 assembler->Bind(&done); |
2385 length = var_length.value(); | 2422 length = var_length.value(); |
2386 } | 2423 } |
2387 assembler->Assert(assembler->TaggedIsSmi(length)); | 2424 assembler->Assert(assembler->TaggedIsSmi(length)); |
2388 assembler->Assert(assembler->TaggedIsSmi(index)); | 2425 assembler->Assert(assembler->TaggedIsSmi(index)); |
2389 | 2426 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2583 Runtime::kThrowIncompatibleMethodReceiver, context, | 2620 Runtime::kThrowIncompatibleMethodReceiver, context, |
2584 assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked( | 2621 assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked( |
2585 "Array Iterator.prototype.next", TENURED)), | 2622 "Array Iterator.prototype.next", TENURED)), |
2586 iterator); | 2623 iterator); |
2587 assembler->Return(result); | 2624 assembler->Return(result); |
2588 } | 2625 } |
2589 } | 2626 } |
2590 | 2627 |
2591 } // namespace internal | 2628 } // namespace internal |
2592 } // namespace v8 | 2629 } // namespace v8 |
OLD | NEW |