Chromium Code Reviews| Index: src/builtins/builtins-typedarray.cc |
| diff --git a/src/builtins/builtins-typedarray.cc b/src/builtins/builtins-typedarray.cc |
| index d63affe3ba62a62721af14a66e39bf7655d401f7..9faee40b4eff649416a340c3de5e2480e85938de 100644 |
| --- a/src/builtins/builtins-typedarray.cc |
| +++ b/src/builtins/builtins-typedarray.cc |
| @@ -98,5 +98,86 @@ void Builtins::Generate_TypedArrayPrototypeLength( |
| JSTypedArray::kLengthOffset); |
| } |
| +namespace { |
| + |
| +template <IterationKind kIterationKind> |
| +void Generate_TypedArrayPrototypeIterationMethod(CodeStubAssembler* assembler, |
| + const char* operation) { |
|
Benedikt Meurer
2016/10/14 03:46:51
Nit: s/operation/method_name/ for consistenvy
|
| + typedef compiler::Node Node; |
| + typedef CodeStubAssembler::Label Label; |
| + typedef CodeStubAssembler::Variable Variable; |
| + |
| + Node* receiver = assembler->Parameter(0); |
| + Node* context = assembler->Parameter(3); |
| + |
| + Label throw_bad_receiver(assembler, Label::kDeferred); |
| + Label throw_typeerror(assembler, Label::kDeferred); |
| + |
| + assembler->GotoIf(assembler->TaggedIsSmi(receiver), &throw_bad_receiver); |
| + |
| + Node* map = assembler->LoadMap(receiver); |
| + Node* instance_type = assembler->LoadMapInstanceType(map); |
| + assembler->GotoIf( |
| + assembler->Word32NotEqual(instance_type, |
| + assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)), |
| + &throw_bad_receiver); |
| + |
| + // Check if the {receiver}'s JSArrayBuffer was neutered. |
| + Node* receiver_buffer = |
|
Benedikt Meurer
2016/10/14 03:46:51
Can you extract this into a helper, it's also used
caitp
2016/10/14 03:57:15
Acknowledged.
|
| + assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset); |
| + Node* receiver_buffer_bit_field = assembler->LoadObjectField( |
| + receiver_buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); |
| + Label if_receiverisneutered(assembler, Label::kDeferred); |
| + assembler->GotoUnless( |
| + assembler->Word32Equal( |
| + assembler->Word32And( |
| + receiver_buffer_bit_field, |
| + assembler->Int32Constant(JSArrayBuffer::WasNeutered::kMask)), |
| + assembler->Int32Constant(0)), |
| + &if_receiverisneutered); |
| + |
| + assembler->Return(assembler->CreateArrayIterator(receiver, map, instance_type, |
| + context, kIterationKind)); |
| + |
| + Variable var_message(assembler, MachineRepresentation::kTagged); |
| + assembler->Bind(&throw_bad_receiver); |
| + var_message.Bind( |
| + assembler->SmiConstant(Smi::FromInt(MessageTemplate::kNotTypedArray))); |
| + assembler->Goto(&throw_typeerror); |
| + |
| + assembler->Bind(&if_receiverisneutered); |
| + var_message.Bind(assembler->SmiConstant( |
| + Smi::FromInt(MessageTemplate::kDetachedOperation))); |
| + assembler->Goto(&throw_typeerror); |
| + |
| + assembler->Bind(&throw_typeerror); |
| + { |
| + Node* arg1 = assembler->HeapConstant( |
| + assembler->isolate()->factory()->NewStringFromAsciiChecked(operation, |
| + TENURED)); |
| + Node* result = assembler->CallRuntime(Runtime::kThrowTypeError, context, |
| + var_message.value(), arg1); |
| + assembler->Return(result); |
| + } |
| +} |
| +} // namespace |
| + |
| +void Builtins::Generate_TypedArrayPrototypeValues( |
| + CodeStubAssembler* assembler) { |
| + Generate_TypedArrayPrototypeIterationMethod<IterationKind::kValues>( |
| + assembler, "%TypedArray%.prototype.values()"); |
| +} |
| + |
| +void Builtins::Generate_TypedArrayPrototypeEntries( |
| + CodeStubAssembler* assembler) { |
| + Generate_TypedArrayPrototypeIterationMethod<IterationKind::kEntries>( |
| + assembler, "%TypedArray%.prototype.entries()"); |
| +} |
| + |
| +void Builtins::Generate_TypedArrayPrototypeKeys(CodeStubAssembler* assembler) { |
| + Generate_TypedArrayPrototypeIterationMethod<IterationKind::kKeys>( |
| + assembler, "%TypedArray%.prototype.keys()"); |
| +} |
| + |
| } // namespace internal |
| } // namespace v8 |