OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |