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

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

Issue 2405253006: [builtins] implement Array.prototype[@@iterator] in TFJ builtins (Closed)
Patch Set: remove apparently redundant var bindings and fix other bugs 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
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 } 91 }
92 92
93 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length 93 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length
94 void Builtins::Generate_TypedArrayPrototypeLength( 94 void Builtins::Generate_TypedArrayPrototypeLength(
95 CodeStubAssembler* assembler) { 95 CodeStubAssembler* assembler) {
96 Generate_TypedArrayProtoypeGetter(assembler, 96 Generate_TypedArrayProtoypeGetter(assembler,
97 "get TypedArray.prototype.length", 97 "get TypedArray.prototype.length",
98 JSTypedArray::kLengthOffset); 98 JSTypedArray::kLengthOffset);
99 } 99 }
100 100
101 namespace {
102
103 template <IterationKind kIterationKind>
104 void Generate_TypedArrayPrototypeIterationMethod(CodeStubAssembler* assembler,
105 const char* operation) {
Benedikt Meurer 2016/10/14 03:46:51 Nit: s/operation/method_name/ for consistenvy
106 typedef compiler::Node Node;
107 typedef CodeStubAssembler::Label Label;
108 typedef CodeStubAssembler::Variable Variable;
109
110 Node* receiver = assembler->Parameter(0);
111 Node* context = assembler->Parameter(3);
112
113 Label throw_bad_receiver(assembler, Label::kDeferred);
114 Label throw_typeerror(assembler, Label::kDeferred);
115
116 assembler->GotoIf(assembler->TaggedIsSmi(receiver), &throw_bad_receiver);
117
118 Node* map = assembler->LoadMap(receiver);
119 Node* instance_type = assembler->LoadMapInstanceType(map);
120 assembler->GotoIf(
121 assembler->Word32NotEqual(instance_type,
122 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)),
123 &throw_bad_receiver);
124
125 // Check if the {receiver}'s JSArrayBuffer was neutered.
126 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.
127 assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset);
128 Node* receiver_buffer_bit_field = assembler->LoadObjectField(
129 receiver_buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32());
130 Label if_receiverisneutered(assembler, Label::kDeferred);
131 assembler->GotoUnless(
132 assembler->Word32Equal(
133 assembler->Word32And(
134 receiver_buffer_bit_field,
135 assembler->Int32Constant(JSArrayBuffer::WasNeutered::kMask)),
136 assembler->Int32Constant(0)),
137 &if_receiverisneutered);
138
139 assembler->Return(assembler->CreateArrayIterator(receiver, map, instance_type,
140 context, kIterationKind));
141
142 Variable var_message(assembler, MachineRepresentation::kTagged);
143 assembler->Bind(&throw_bad_receiver);
144 var_message.Bind(
145 assembler->SmiConstant(Smi::FromInt(MessageTemplate::kNotTypedArray)));
146 assembler->Goto(&throw_typeerror);
147
148 assembler->Bind(&if_receiverisneutered);
149 var_message.Bind(assembler->SmiConstant(
150 Smi::FromInt(MessageTemplate::kDetachedOperation)));
151 assembler->Goto(&throw_typeerror);
152
153 assembler->Bind(&throw_typeerror);
154 {
155 Node* arg1 = assembler->HeapConstant(
156 assembler->isolate()->factory()->NewStringFromAsciiChecked(operation,
157 TENURED));
158 Node* result = assembler->CallRuntime(Runtime::kThrowTypeError, context,
159 var_message.value(), arg1);
160 assembler->Return(result);
161 }
162 }
163 } // namespace
164
165 void Builtins::Generate_TypedArrayPrototypeValues(
166 CodeStubAssembler* assembler) {
167 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kValues>(
168 assembler, "%TypedArray%.prototype.values()");
169 }
170
171 void Builtins::Generate_TypedArrayPrototypeEntries(
172 CodeStubAssembler* assembler) {
173 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kEntries>(
174 assembler, "%TypedArray%.prototype.entries()");
175 }
176
177 void Builtins::Generate_TypedArrayPrototypeKeys(CodeStubAssembler* assembler) {
178 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kKeys>(
179 assembler, "%TypedArray%.prototype.keys()");
180 }
181
101 } // namespace internal 182 } // namespace internal
102 } // namespace v8 183 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698