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); |
} |