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

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

Issue 2405253006: [builtins] implement Array.prototype[@@iterator] in TFJ builtins (Closed)
Patch Set: latest round 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
« no previous file with comments | « src/builtins/builtins-array.cc ('k') | src/code-stub-assembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 24 matching lines...) Expand all
35 &if_receiverisincompatible); 35 &if_receiverisincompatible);
36 Node* receiver_instance_type = assembler->LoadInstanceType(receiver); 36 Node* receiver_instance_type = assembler->LoadInstanceType(receiver);
37 assembler->GotoUnless( 37 assembler->GotoUnless(
38 assembler->Word32Equal(receiver_instance_type, 38 assembler->Word32Equal(receiver_instance_type,
39 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)), 39 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)),
40 &if_receiverisincompatible); 40 &if_receiverisincompatible);
41 41
42 // Check if the {receiver}'s JSArrayBuffer was neutered. 42 // Check if the {receiver}'s JSArrayBuffer was neutered.
43 Node* receiver_buffer = 43 Node* receiver_buffer =
44 assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset); 44 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); 45 Label if_receiverisneutered(assembler, Label::kDeferred);
48 assembler->GotoUnless( 46 assembler->GotoIf(assembler->IsDetachedBuffer(receiver_buffer),
49 assembler->Word32Equal( 47 &if_receiverisneutered);
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)); 48 assembler->Return(assembler->LoadObjectField(receiver, object_offset));
56 49
57 assembler->Bind(&if_receiverisneutered); 50 assembler->Bind(&if_receiverisneutered);
58 { 51 {
59 // The {receiver}s buffer was neutered, default to zero. 52 // The {receiver}s buffer was neutered, default to zero.
60 assembler->Return(assembler->SmiConstant(0)); 53 assembler->Return(assembler->SmiConstant(0));
61 } 54 }
62 55
63 assembler->Bind(&if_receiverisincompatible); 56 assembler->Bind(&if_receiverisincompatible);
64 { 57 {
(...skipping 26 matching lines...) Expand all
91 } 84 }
92 85
93 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length 86 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length
94 void Builtins::Generate_TypedArrayPrototypeLength( 87 void Builtins::Generate_TypedArrayPrototypeLength(
95 CodeStubAssembler* assembler) { 88 CodeStubAssembler* assembler) {
96 Generate_TypedArrayProtoypeGetter(assembler, 89 Generate_TypedArrayProtoypeGetter(assembler,
97 "get TypedArray.prototype.length", 90 "get TypedArray.prototype.length",
98 JSTypedArray::kLengthOffset); 91 JSTypedArray::kLengthOffset);
99 } 92 }
100 93
94 namespace {
95
96 template <IterationKind kIterationKind>
97 void Generate_TypedArrayPrototypeIterationMethod(CodeStubAssembler* assembler,
98 const char* method_name) {
99 typedef compiler::Node Node;
100 typedef CodeStubAssembler::Label Label;
101 typedef CodeStubAssembler::Variable Variable;
102
103 Node* receiver = assembler->Parameter(0);
104 Node* context = assembler->Parameter(3);
105
106 Label throw_bad_receiver(assembler, Label::kDeferred);
107 Label throw_typeerror(assembler, Label::kDeferred);
108
109 assembler->GotoIf(assembler->TaggedIsSmi(receiver), &throw_bad_receiver);
110
111 Node* map = assembler->LoadMap(receiver);
112 Node* instance_type = assembler->LoadMapInstanceType(map);
113 assembler->GotoIf(
114 assembler->Word32NotEqual(instance_type,
115 assembler->Int32Constant(JS_TYPED_ARRAY_TYPE)),
116 &throw_bad_receiver);
117
118 // Check if the {receiver}'s JSArrayBuffer was neutered.
119 Node* receiver_buffer =
120 assembler->LoadObjectField(receiver, JSTypedArray::kBufferOffset);
121 Label if_receiverisneutered(assembler, Label::kDeferred);
122 assembler->GotoIf(assembler->IsDetachedBuffer(receiver_buffer),
123 &if_receiverisneutered);
124
125 assembler->Return(assembler->CreateArrayIterator(receiver, map, instance_type,
126 context, kIterationKind));
127
128 Variable var_message(assembler, MachineRepresentation::kTagged);
129 assembler->Bind(&throw_bad_receiver);
130 var_message.Bind(
131 assembler->SmiConstant(Smi::FromInt(MessageTemplate::kNotTypedArray)));
132 assembler->Goto(&throw_typeerror);
133
134 assembler->Bind(&if_receiverisneutered);
135 var_message.Bind(assembler->SmiConstant(
136 Smi::FromInt(MessageTemplate::kDetachedOperation)));
137 assembler->Goto(&throw_typeerror);
138
139 assembler->Bind(&throw_typeerror);
140 {
141 Node* arg1 = assembler->HeapConstant(
142 assembler->isolate()->factory()->NewStringFromAsciiChecked(method_name,
143 TENURED));
144 Node* result = assembler->CallRuntime(Runtime::kThrowTypeError, context,
145 var_message.value(), arg1);
146 assembler->Return(result);
147 }
148 }
149 } // namespace
150
151 void Builtins::Generate_TypedArrayPrototypeValues(
152 CodeStubAssembler* assembler) {
153 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kValues>(
154 assembler, "%TypedArray%.prototype.values()");
155 }
156
157 void Builtins::Generate_TypedArrayPrototypeEntries(
158 CodeStubAssembler* assembler) {
159 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kEntries>(
160 assembler, "%TypedArray%.prototype.entries()");
161 }
162
163 void Builtins::Generate_TypedArrayPrototypeKeys(CodeStubAssembler* assembler) {
164 Generate_TypedArrayPrototypeIterationMethod<IterationKind::kKeys>(
165 assembler, "%TypedArray%.prototype.keys()");
166 }
167
101 } // namespace internal 168 } // namespace internal
102 } // namespace v8 169 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins/builtins-array.cc ('k') | src/code-stub-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698