Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: src/builtins/builtins-typedarray.cc

Issue 2405253006: [builtins] implement Array.prototype[@@iterator] in TFJ builtins (Closed)
Patch Set: fix JSArrayIteratorVerify() Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins/builtins.h" 5 #include "src/builtins/builtins.h"
6 #include "src/builtins/builtins-utils.h" 6 #include "src/builtins/builtins-utils.h"
7 7
8 namespace v8 { 8 namespace v8 {
9 namespace internal { 9 namespace internal {
10 10
11 // ----------------------------------------------------------------------------- 11 // -----------------------------------------------------------------------------
12 // ES6 section 22.2 TypedArray Objects 12 // ES6 section 22.2 TypedArray Objects
13 13
14 // ES6 section 22.2.3.1 get %TypedArray%.prototype.buffer 14 // ES6 section 22.2.3.1 get %TypedArray%.prototype.buffer
15 BUILTIN(TypedArrayPrototypeBuffer) { 15 BUILTIN(TypedArrayPrototypeBuffer) {
16 HandleScope scope(isolate); 16 HandleScope scope(isolate);
17 CHECK_RECEIVER(JSTypedArray, typed_array, "get TypedArray.prototype.buffer"); 17 CHECK_RECEIVER(JSTypedArray, typed_array, "get TypedArray.prototype.buffer");
18 return *typed_array->GetBuffer(); 18 return *typed_array->GetBuffer();
19 } 19 }
20 20
21 namespace { 21 namespace {
22 22
23 static void GotoIfIsDetachedBuffer(CodeStubAssembler* assembler,
Benedikt Meurer 2016/10/17 04:02:42 Nit: Remove static, it's implicitly static via the
caitp 2016/10/18 00:16:50 I've just removed this helper and added CodeStubAs
24 compiler::Node* buffer,
25 CodeStubAssembler::Label* if_detached) {
26 typedef compiler::Node Node;
27 typedef CodeStubAssembler::Label Label;
28
29 Label if_notdetached(assembler);
30 assembler->Assert(
31 assembler->Word32Equal(assembler->LoadInstanceType(buffer),
32 assembler->Int32Constant(JS_ARRAY_BUFFER_TYPE)));
33 Node* buffer_bit_field = assembler->LoadObjectField(
34 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32());
35 assembler->Branch(
36 assembler->Word32Equal(
37 assembler->Word32And(
38 buffer_bit_field,
39 assembler->Int32Constant(JSArrayBuffer::WasNeutered::kMask)),
40 assembler->Int32Constant(0)),
41 &if_notdetached, if_detached);
42 assembler->Bind(&if_notdetached);
43 }
44
23 void Generate_TypedArrayProtoypeGetter(CodeStubAssembler* assembler, 45 void Generate_TypedArrayProtoypeGetter(CodeStubAssembler* assembler,
24 const char* method_name, 46 const char* method_name,
25 int object_offset) { 47 int object_offset) {
26 typedef CodeStubAssembler::Label Label; 48 typedef CodeStubAssembler::Label Label;
27 typedef compiler::Node Node; 49 typedef compiler::Node Node;
28 50
29 Node* receiver = assembler->Parameter(0); 51 Node* receiver = assembler->Parameter(0);
30 Node* context = assembler->Parameter(3); 52 Node* context = assembler->Parameter(3);
31 53
32 // Check if the {receiver} is actually a JSTypedArray. 54 // Check if the {receiver} is actually a JSTypedArray.
33 Label if_receiverisincompatible(assembler, Label::kDeferred); 55 Label if_receiverisincompatible(assembler, Label::kDeferred);
34 assembler->GotoIf(assembler->TaggedIsSmi(receiver), 56 assembler->GotoIf(assembler->TaggedIsSmi(receiver),
35 &if_receiverisincompatible); 57 &if_receiverisincompatible);
36 Node* receiver_instance_type = assembler->LoadInstanceType(receiver); 58 Node* receiver_instance_type = assembler->LoadInstanceType(receiver);
37 assembler->GotoUnless( 59 assembler->GotoUnless(
38 assembler->Word32Equal(receiver_instance_type, 60 assembler->Word32Equal(receiver_instance_type,
39 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)), 61 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)),
40 &if_receiverisincompatible); 62 &if_receiverisincompatible);
41 63
42 // Check if the {receiver}'s JSArrayBuffer was neutered. 64 // Check if the {receiver}'s JSArrayBuffer was neutered.
43 Node* receiver_buffer = 65 Node* receiver_buffer =
44 assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset); 66 assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset);
45 Node* receiver_buffer_bit_field = assembler->LoadObjectField(
46 receiver_buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32());
47 Label if_receiverisneutered(assembler, Label::kDeferred); 67 Label if_receiverisneutered(assembler, Label::kDeferred);
48 assembler->GotoUnless( 68 GotoIfIsDetachedBuffer(assembler, receiver_buffer, &if_receiverisneutered);
49 assembler->Word32Equal(
50 assembler->Word32And(
51 receiver_buffer_bit_field,
52 assembler->Int32Constant(JSArrayBuffer::WasNeutered::kMask)),
53 assembler->Int32Constant(0)),
54 &if_receiverisneutered);
55 assembler->Return(assembler->LoadObjectField(receiver, object_offset)); 69 assembler->Return(assembler->LoadObjectField(receiver, object_offset));
56 70
57 assembler->Bind(&if_receiverisneutered); 71 assembler->Bind(&if_receiverisneutered);
58 { 72 {
59 // The {receiver}s buffer was neutered, default to zero. 73 // The {receiver}s buffer was neutered, default to zero.
60 assembler->Return(assembler->SmiConstant(0)); 74 assembler->Return(assembler->SmiConstant(0));
61 } 75 }
62 76
63 assembler->Bind(&if_receiverisincompatible); 77 assembler->Bind(&if_receiverisincompatible);
64 { 78 {
(...skipping 26 matching lines...) Expand all
91 } 105 }
92 106
93 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length 107 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length
94 void Builtins::Generate_TypedArrayPrototypeLength( 108 void Builtins::Generate_TypedArrayPrototypeLength(
95 CodeStubAssembler* assembler) { 109 CodeStubAssembler* assembler) {
96 Generate_TypedArrayProtoypeGetter(assembler, 110 Generate_TypedArrayProtoypeGetter(assembler,
97 "get TypedArray.prototype.length", 111 "get TypedArray.prototype.length",
98 JSTypedArray::kLengthOffset); 112 JSTypedArray::kLengthOffset);
99 } 113 }
100 114
115 namespace {
116
117 template <IterationKind kIterationKind>
118 void Generate_TypedArrayPrototypeIterationMethod(CodeStubAssembler* assembler,
119 const char* method_name) {
120 typedef compiler::Node Node;
121 typedef CodeStubAssembler::Label Label;
122 typedef CodeStubAssembler::Variable Variable;
123
124 Node* receiver = assembler->Parameter(0);
125 Node* context = assembler->Parameter(3);
126
127 Label throw_bad_receiver(assembler, Label::kDeferred);
128 Label throw_typeerror(assembler, Label::kDeferred);
129
130 assembler->GotoIf(assembler->TaggedIsSmi(receiver), &throw_bad_receiver);
131
132 Node* map = assembler->LoadMap(receiver);
133 Node* instance_type = assembler->LoadMapInstanceType(map);
134 assembler->GotoIf(
135 assembler->Word32NotEqual(instance_type,
136 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)),
137 &throw_bad_receiver);
138
139 // Check if the {receiver}'s JSArrayBuffer was neutered.
140 Node* receiver_buffer =
141 assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset);
142 Label if_receiverisneutered(assembler, Label::kDeferred);
143 GotoIfIsDetachedBuffer(assembler, receiver_buffer, &if_receiverisneutered);
144
145 assembler->Return(assembler->CreateArrayIterator(receiver, map, instance_type,
146 context, kIterationKind));
147
148 Variable var_message(assembler, MachineRepresentation::kTagged);
149 assembler->Bind(&throw_bad_receiver);
150 var_message.Bind(
151 assembler->SmiConstant(Smi::FromInt(MessageTemplate::kNotTypedArray)));
152 assembler->Goto(&throw_typeerror);
153
154 assembler->Bind(&if_receiverisneutered);
155 var_message.Bind(assembler->SmiConstant(
156 Smi::FromInt(MessageTemplate::kDetachedOperation)));
157 assembler->Goto(&throw_typeerror);
158
159 assembler->Bind(&throw_typeerror);
160 {
161 Node* arg1 = assembler->HeapConstant(
162 assembler->isolate()->factory()->NewStringFromAsciiChecked(method_name,
163 TENURED));
164 Node* result = assembler->CallRuntime(Runtime::kThrowTypeError, context,
165 var_message.value(), arg1);
166 assembler->Return(result);
167 }
168 }
169 } // namespace
170
171 void Builtins::Generate_TypedArrayPrototypeValues(
172 CodeStubAssembler* assembler) {
173 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kValues>(
174 assembler, "%TypedArray%.prototype.values()");
175 }
176
177 void Builtins::Generate_TypedArrayPrototypeEntries(
178 CodeStubAssembler* assembler) {
179 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kEntries>(
180 assembler, "%TypedArray%.prototype.entries()");
181 }
182
183 void Builtins::Generate_TypedArrayPrototypeKeys(CodeStubAssembler* assembler) {
184 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kKeys>(
185 assembler, "%TypedArray%.prototype.keys()");
186 }
187
101 } // namespace internal 188 } // namespace internal
102 } // namespace v8 189 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698