Chromium Code Reviews| Index: src/builtins/builtins-array.cc |
| diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc |
| index 7e8c48668ff11cb36852eff96f67df69f7693ba4..152977022acbac9d3104ee9912f9a6afd3ccf265 100644 |
| --- a/src/builtins/builtins-array.cc |
| +++ b/src/builtins/builtins-array.cc |
| @@ -2286,7 +2286,8 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
| assembler->Bind(&if_isnotfastarray); |
| { |
| - Label if_istypedarray(assembler), if_isgeneric(assembler); |
| + Label if_istypedarray(assembler), if_isgeneric(assembler), |
| + invalidate_protector(assembler); |
|
Benedikt Meurer
2016/11/08 05:29:48
The invalidate_protector label is unused.
|
| // If a is undefined, return CreateIterResultObject(undefined, true) |
| assembler->GotoIf( |
| @@ -2301,6 +2302,8 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
| assembler->Bind(&if_isgeneric); |
| { |
| + Label if_wasfastarray(assembler), if_wasnotfastarray(assembler); |
|
Benedikt Meurer
2016/11/08 05:29:48
The if_wasnotfastarray label is unused.
|
| + |
| Node* length = nullptr; |
| { |
| Variable var_length(assembler, MachineRepresentation::kTagged); |
| @@ -2314,7 +2317,40 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
| { |
| var_length.Bind( |
| assembler->LoadObjectField(array, JSArray::kLengthOffset)); |
| - assembler->Goto(&done); |
| + |
| + // Invalidate protector cell if needed |
| + assembler->Branch( |
| + assembler->WordNotEqual(orig_map, assembler->UndefinedConstant()), |
| + &if_wasfastarray, &done); |
| + |
| + assembler->Bind(&if_wasfastarray); |
| + { |
| + Label if_invalid(assembler, Label::kDeferred); |
| + // Invalidate array_iterator_protector cell if needed (Not needed |
| + // for keys iteration, or if already marked as invalid) |
| + assembler->StoreObjectField( |
| + iterator, JSArrayIterator::kIteratedObjectMapOffset, |
| + assembler->UndefinedConstant()); |
| + assembler->GotoIf( |
| + assembler->Uint32LessThanOrEqual( |
| + instance_type, assembler->Int32Constant( |
| + JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE)), |
| + &done); |
| + |
| + Node* invalid = assembler->SmiConstant( |
| + Smi::FromInt(Isolate::kArrayProtectorInvalid)); |
| + Node* cell = |
| + assembler->LoadRoot(Heap::kArrayIteratorProtectorRootIndex); |
| + Node* cell_value = |
| + assembler->LoadObjectField(cell, PropertyCell::kValueOffset); |
| + assembler->Branch(assembler->WordEqual(cell_value, invalid), &done, |
| + &if_invalid); |
| + |
| + assembler->Bind(&if_invalid); |
| + assembler->CallRuntime(Runtime::kInvalidateArrayIteratorProtector, |
| + context); |
| + assembler->Goto(&done); |
| + } |
| } |
| assembler->Bind(&if_isnotarray); |
| @@ -2377,6 +2413,8 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
| assembler->Bind(&if_isdetached); |
| { |
| + // TODO(caitp): If IsDetached(buffer) is true, throw a TypeError, per |
| + // https://github.com/tc39/ecma262/issues/713 |
| var_length.Bind(assembler->SmiConstant(Smi::kZero)); |
| assembler->Goto(&done); |
| } |