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

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

Issue 2484003002: [builtins] implement JSBuiltinReducer for ArrayIteratorNext() (Closed)
Patch Set: CheckIf() for ArrayBufferWasNeutered() rather than a branch, which hopefully can be eliminated, and… 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 2283 matching lines...) Expand 10 before | Expand all | Expand 10 after
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);
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()),
Camillo Bruni 2016/11/09 12:03:49 nit: assembler->IsUndefined(orig_map)
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 assembler->StoreObjectField(cell, Cell::kValueOffset, invalid);
2344 assembler->Goto(&done);
2345 }
2318 } 2346 }
2319 2347
2320 assembler->Bind(&if_isnotarray); 2348 assembler->Bind(&if_isnotarray);
2321 { 2349 {
2322 Node* length_string = assembler->HeapConstant( 2350 Node* length_string = assembler->HeapConstant(
2323 assembler->isolate()->factory()->length_string()); 2351 assembler->isolate()->factory()->length_string());
2324 Callable get_property = 2352 Callable get_property =
2325 CodeFactory::GetProperty(assembler->isolate()); 2353 CodeFactory::GetProperty(assembler->isolate());
2326 Node* length = 2354 Node* length =
2327 assembler->CallStub(get_property, context, array, length_string); 2355 assembler->CallStub(get_property, context, array, length_string);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2370 2398
2371 assembler->Bind(&if_isnotdetached); 2399 assembler->Bind(&if_isnotdetached);
2372 { 2400 {
2373 var_length.Bind( 2401 var_length.Bind(
2374 assembler->LoadObjectField(array, JSTypedArray::kLengthOffset)); 2402 assembler->LoadObjectField(array, JSTypedArray::kLengthOffset));
2375 assembler->Goto(&done); 2403 assembler->Goto(&done);
2376 } 2404 }
2377 2405
2378 assembler->Bind(&if_isdetached); 2406 assembler->Bind(&if_isdetached);
2379 { 2407 {
2408 // TODO(caitp): If IsDetached(buffer) is true, throw a TypeError, per
2409 // https://github.com/tc39/ecma262/issues/713
2380 var_length.Bind(assembler->SmiConstant(Smi::kZero)); 2410 var_length.Bind(assembler->SmiConstant(Smi::kZero));
2381 assembler->Goto(&done); 2411 assembler->Goto(&done);
2382 } 2412 }
2383 2413
2384 assembler->Bind(&done); 2414 assembler->Bind(&done);
2385 length = var_length.value(); 2415 length = var_length.value();
2386 } 2416 }
2387 assembler->Assert(assembler->TaggedIsSmi(length)); 2417 assembler->Assert(assembler->TaggedIsSmi(length));
2388 assembler->Assert(assembler->TaggedIsSmi(index)); 2418 assembler->Assert(assembler->TaggedIsSmi(index));
2389 2419
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
2583 Runtime::kThrowIncompatibleMethodReceiver, context, 2613 Runtime::kThrowIncompatibleMethodReceiver, context,
2584 assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked( 2614 assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked(
2585 "Array Iterator.prototype.next", TENURED)), 2615 "Array Iterator.prototype.next", TENURED)),
2586 iterator); 2616 iterator);
2587 assembler->Return(result); 2617 assembler->Return(result);
2588 } 2618 }
2589 } 2619 }
2590 2620
2591 } // namespace internal 2621 } // namespace internal
2592 } // namespace v8 2622 } // namespace v8
OLDNEW
« no previous file with comments | « src/bootstrapper.cc ('k') | src/code-stub-assembler.h » ('j') | src/code-stub-assembler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698