Index: src/builtins/builtins-array.cc |
diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc |
index 1df0477bfdfc02cfb98d5cf94b26677f43c86e3d..82171d36acf771ecdcd92be931ade1014d0e72b0 100644 |
--- a/src/builtins/builtins-array.cc |
+++ b/src/builtins/builtins-array.cc |
@@ -2277,6 +2277,10 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
typedef CodeStubAssembler::Variable Variable; |
CodeStubAssembler assembler(state); |
+ Node* operation = |
+ assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( |
Benedikt Meurer
2017/01/03 18:09:39
The CodeStubAssembler generates a schedule immedia
caitp
2017/01/03 18:18:40
Good point, done
|
+ "Array Iterator.prototype.next", TENURED)); |
+ |
Node* iterator = assembler.Parameter(0); |
Node* context = assembler.Parameter(3); |
@@ -2318,7 +2322,8 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
iterator, JSArrayIterator::kIteratedObjectMapOffset); |
Node* array_map = assembler.LoadMap(array); |
- Label if_isfastarray(&assembler), if_isnotfastarray(&assembler); |
+ Label if_isfastarray(&assembler), if_isnotfastarray(&assembler), |
+ if_isdetached(&assembler, Label::kDeferred); |
assembler.Branch(assembler.WordEqual(orig_map, array_map), &if_isfastarray, |
&if_isnotfastarray); |
@@ -2529,35 +2534,13 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
assembler.Bind(&if_istypedarray); |
{ |
- Node* length = nullptr; |
- { |
- Variable var_length(&assembler, MachineRepresentation::kTagged); |
- Label if_isdetached(&assembler, Label::kDeferred), |
- if_isnotdetached(&assembler), done(&assembler); |
- |
- Node* buffer = |
- assembler.LoadObjectField(array, JSTypedArray::kBufferOffset); |
- assembler.Branch(assembler.IsDetachedBuffer(buffer), &if_isdetached, |
- &if_isnotdetached); |
- |
- assembler.Bind(&if_isnotdetached); |
- { |
- var_length.Bind( |
- assembler.LoadObjectField(array, JSTypedArray::kLengthOffset)); |
- assembler.Goto(&done); |
- } |
+ Node* buffer = |
+ assembler.LoadObjectField(array, JSTypedArray::kBufferOffset); |
+ assembler.GotoIf(assembler.IsDetachedBuffer(buffer), &if_isdetached); |
- 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); |
- } |
+ Node* length = |
+ assembler.LoadObjectField(array, JSTypedArray::kLengthOffset); |
- assembler.Bind(&done); |
- length = var_length.value(); |
- } |
CSA_ASSERT(&assembler, assembler.TaggedIsSmi(length)); |
CSA_ASSERT(&assembler, assembler.TaggedIsSmi(index)); |
@@ -2753,11 +2736,17 @@ void Builtins::Generate_ArrayIteratorPrototypeNext( |
assembler.Bind(&throw_bad_receiver); |
{ |
// The {receiver} is not a valid JSArrayIterator. |
- Node* result = assembler.CallRuntime( |
- Runtime::kThrowIncompatibleMethodReceiver, context, |
- assembler.HeapConstant(assembler.factory()->NewStringFromAsciiChecked( |
- "Array Iterator.prototype.next", TENURED)), |
- iterator); |
+ Node* result = |
+ assembler.CallRuntime(Runtime::kThrowIncompatibleMethodReceiver, |
+ context, operation, iterator); |
+ assembler.Return(result); |
+ } |
+ |
+ assembler.Bind(&if_isdetached); |
+ { |
+ Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); |
+ Node* result = assembler.CallRuntime(Runtime::kThrowTypeError, context, |
+ message, operation, array); |
assembler.Return(result); |
} |
} |