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..d00bede2a20ef23e1b9ae63e38277c467abd2828 100644 |
| --- a/src/builtins/builtins-array.cc |
| +++ b/src/builtins/builtins-array.cc |
| @@ -2301,6 +2301,8 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
| assembler->Bind(&if_isgeneric); |
| { |
| + Label if_wasfastarray(assembler); |
| + |
| Node* length = nullptr; |
| { |
| Variable var_length(assembler, MachineRepresentation::kTagged); |
| @@ -2314,7 +2316,33 @@ 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()), |
|
Camillo Bruni
2016/11/09 12:03:49
nit: assembler->IsUndefined(orig_map)
|
| + &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); |
| + assembler->StoreObjectField(cell, Cell::kValueOffset, invalid); |
| + assembler->Goto(&done); |
| + } |
| } |
| assembler->Bind(&if_isnotarray); |
| @@ -2377,6 +2405,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); |
| } |