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