Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: src/builtins/builtins-array.cc

Issue 2484003002: [builtins] implement JSBuiltinReducer for ArrayIteratorNext() (Closed)
Patch Set: Remove whitespace change that snuck in Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/bootstrapper.cc ('k') | src/code-stub-assembler.h » ('j') | src/compiler/access-builder.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698