OLD | NEW |
---|---|
1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 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-utils-gen.h" | 5 #include "src/builtins/builtins-utils-gen.h" |
6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
7 #include "src/code-stub-assembler.h" | 7 #include "src/code-stub-assembler.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
11 | 11 |
12 class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { | 12 class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler { |
13 public: | 13 public: |
14 explicit ArrayBuiltinCodeStubAssembler(compiler::CodeAssemblerState* state) | 14 explicit ArrayBuiltinCodeStubAssembler(compiler::CodeAssemblerState* state) |
15 : CodeStubAssembler(state), | 15 : CodeStubAssembler(state), |
16 k_(this, MachineRepresentation::kTagged), | 16 k_(this, MachineRepresentation::kTagged), |
17 a_(this, MachineRepresentation::kTagged), | 17 a_(this, MachineRepresentation::kTagged), |
18 to_(this, MachineRepresentation::kTagged, SmiConstant(0)) {} | 18 to_(this, MachineRepresentation::kTagged, SmiConstant(0)), |
19 fully_spec_compliant_(this, {&k_, &a_, &to_}) {} | |
19 | 20 |
20 typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm)> | 21 // A jump to label {slow_elements} allows the result generator to |
danno
2017/05/02 10:58:31
Is this label correct?
mvstanton
2017/05/03 12:19:36
Outdated comment, thanks! Done.
| |
22 // skip the fast path. | |
23 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)> | |
21 BuiltinResultGenerator; | 24 BuiltinResultGenerator; |
22 | 25 |
23 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)> | |
24 BuiltinResultIndexInitializer; | |
25 | |
26 typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm, | 26 typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm, |
27 Node* k_value, Node* k)> | 27 Node* k_value, Node* k)> |
28 CallResultProcessor; | 28 CallResultProcessor; |
29 | 29 |
30 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)> | 30 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)> |
31 PostLoopAction; | 31 PostLoopAction; |
32 | 32 |
33 Node* ForEachResultGenerator() { return UndefinedConstant(); } | 33 void ForEachResultGenerator() { a_.Bind(UndefinedConstant()); } |
34 | 34 |
35 Node* ForEachProcessor(Node* k_value, Node* k) { | 35 Node* ForEachProcessor(Node* k_value, Node* k) { |
36 CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), this_arg(), | 36 CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), this_arg(), |
37 k_value, k, o()); | 37 k_value, k, o()); |
38 return a(); | 38 return a(); |
39 } | 39 } |
40 | 40 |
41 Node* SomeResultGenerator() { return FalseConstant(); } | 41 void SomeResultGenerator() { a_.Bind(FalseConstant()); } |
42 | 42 |
43 Node* SomeProcessor(Node* k_value, Node* k) { | 43 Node* SomeProcessor(Node* k_value, Node* k) { |
44 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), | 44 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), |
45 this_arg(), k_value, k, o()); | 45 this_arg(), k_value, k, o()); |
46 Label false_continue(this), return_true(this); | 46 Label false_continue(this), return_true(this); |
47 BranchIfToBooleanIsTrue(value, &return_true, &false_continue); | 47 BranchIfToBooleanIsTrue(value, &return_true, &false_continue); |
48 BIND(&return_true); | 48 BIND(&return_true); |
49 ReturnFromBuiltin(TrueConstant()); | 49 ReturnFromBuiltin(TrueConstant()); |
50 BIND(&false_continue); | 50 BIND(&false_continue); |
51 return a(); | 51 return a(); |
52 } | 52 } |
53 | 53 |
54 Node* EveryResultGenerator() { return TrueConstant(); } | 54 void EveryResultGenerator() { a_.Bind(TrueConstant()); } |
55 | 55 |
56 Node* EveryProcessor(Node* k_value, Node* k) { | 56 Node* EveryProcessor(Node* k_value, Node* k) { |
57 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), | 57 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), |
58 this_arg(), k_value, k, o()); | 58 this_arg(), k_value, k, o()); |
59 Label true_continue(this), return_false(this); | 59 Label true_continue(this), return_false(this); |
60 BranchIfToBooleanIsTrue(value, &true_continue, &return_false); | 60 BranchIfToBooleanIsTrue(value, &true_continue, &return_false); |
61 BIND(&return_false); | 61 BIND(&return_false); |
62 ReturnFromBuiltin(FalseConstant()); | 62 ReturnFromBuiltin(FalseConstant()); |
63 BIND(&true_continue); | 63 BIND(&true_continue); |
64 return a(); | 64 return a(); |
65 } | 65 } |
66 | 66 |
67 Node* ReduceResultGenerator() { return this_arg(); } | 67 void ReduceResultGenerator() { return a_.Bind(this_arg()); } |
68 | 68 |
69 Node* ReduceProcessor(Node* k_value, Node* k) { | 69 Node* ReduceProcessor(Node* k_value, Node* k) { |
70 VARIABLE(result, MachineRepresentation::kTagged); | 70 VARIABLE(result, MachineRepresentation::kTagged); |
71 Label done(this, {&result}), initial(this); | 71 Label done(this, {&result}), initial(this); |
72 GotoIf(WordEqual(a(), TheHoleConstant()), &initial); | 72 GotoIf(WordEqual(a(), TheHoleConstant()), &initial); |
73 result.Bind(CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), | 73 result.Bind(CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), |
74 UndefinedConstant(), a(), k_value, k, o())); | 74 UndefinedConstant(), a(), k_value, k, o())); |
75 Goto(&done); | 75 Goto(&done); |
76 | 76 |
77 BIND(&initial); | 77 BIND(&initial); |
78 result.Bind(k_value); | 78 result.Bind(k_value); |
79 Goto(&done); | 79 Goto(&done); |
80 | 80 |
81 BIND(&done); | 81 BIND(&done); |
82 return result.value(); | 82 return result.value(); |
83 } | 83 } |
84 | 84 |
85 void ReducePostLoopAction() { | 85 void ReducePostLoopAction() { |
86 Label ok(this); | 86 Label ok(this); |
87 GotoIf(WordNotEqual(a(), TheHoleConstant()), &ok); | 87 GotoIf(WordNotEqual(a(), TheHoleConstant()), &ok); |
88 CallRuntime(Runtime::kThrowTypeError, context(), | 88 CallRuntime(Runtime::kThrowTypeError, context(), |
89 SmiConstant(MessageTemplate::kReduceNoInitial)); | 89 SmiConstant(MessageTemplate::kReduceNoInitial)); |
90 Unreachable(); | 90 Unreachable(); |
91 BIND(&ok); | 91 BIND(&ok); |
92 } | 92 } |
93 | 93 |
94 Node* FilterResultGenerator() { | 94 void FilterResultGenerator() { |
95 // 7. Let A be ArraySpeciesCreate(O, 0). | 95 // 7. Let A be ArraySpeciesCreate(O, 0). |
96 return ArraySpeciesCreate(context(), o(), SmiConstant(0)); | 96 a_.Bind(ArraySpeciesCreate(context(), o(), SmiConstant(0))); |
97 } | 97 } |
98 | 98 |
99 Node* FilterProcessor(Node* k_value, Node* k) { | 99 Node* FilterProcessor(Node* k_value, Node* k) { |
100 // ii. Let selected be ToBoolean(? Call(callbackfn, T, kValue, k, O)). | 100 // ii. Let selected be ToBoolean(? Call(callbackfn, T, kValue, k, O)). |
101 Node* selected = CallJS(CodeFactory::Call(isolate()), context(), | 101 Node* selected = CallJS(CodeFactory::Call(isolate()), context(), |
102 callbackfn(), this_arg(), k_value, k, o()); | 102 callbackfn(), this_arg(), k_value, k, o()); |
103 Label true_continue(this, &to_), false_continue(this); | 103 Label true_continue(this, &to_), false_continue(this); |
104 BranchIfToBooleanIsTrue(selected, &true_continue, &false_continue); | 104 BranchIfToBooleanIsTrue(selected, &true_continue, &false_continue); |
105 BIND(&true_continue); | 105 BIND(&true_continue); |
106 // iii. If selected is true, then... | 106 // iii. If selected is true, then... |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
155 { | 155 { |
156 // 2. Increase to by 1. | 156 // 2. Increase to by 1. |
157 to_.Bind(NumberInc(to_.value())); | 157 to_.Bind(NumberInc(to_.value())); |
158 Goto(&false_continue); | 158 Goto(&false_continue); |
159 } | 159 } |
160 } | 160 } |
161 BIND(&false_continue); | 161 BIND(&false_continue); |
162 return a(); | 162 return a(); |
163 } | 163 } |
164 | 164 |
165 Node* MapResultGenerator() { | 165 void MapResultGenerator() { |
danno
2017/05/02 10:58:31
Perhaps call this FastMapResultGenerator?
mvstanton
2017/05/03 12:19:36
Done.
| |
166 // 5. Let A be ? ArraySpeciesCreate(O, len). | 166 Label runtime(this), done(this, {&a_}); |
167 return ArraySpeciesCreate(context(), o(), len_); | 167 GotoIf(DoesntHaveInstanceType(o(), JS_ARRAY_TYPE), &runtime); |
168 Node* o_map = LoadMap(o()); | |
169 Node* const initial_array_prototype = LoadContextElement( | |
170 LoadNativeContext(context()), Context::INITIAL_ARRAY_PROTOTYPE_INDEX); | |
171 Node* proto = LoadMapPrototype(o_map); | |
172 GotoIf(WordNotEqual(proto, initial_array_prototype), &runtime); | |
173 | |
174 Node* species_protector = SpeciesProtectorConstant(); | |
175 Node* value = LoadObjectField(species_protector, Cell::kValueOffset); | |
176 Node* const protector_invalid = SmiConstant(Isolate::kProtectorInvalid); | |
177 GotoIf(WordEqual(value, protector_invalid), &runtime); | |
178 | |
179 Node* const initial_array_constructor = LoadContextElement( | |
180 LoadNativeContext(context()), Context::ARRAY_FUNCTION_INDEX); | |
181 a_.Bind(ConstructJS(CodeFactory::Construct(isolate()), context(), | |
182 initial_array_constructor, len_)); | |
183 Goto(&done); | |
184 | |
185 BIND(&runtime); | |
186 { | |
187 // 5. Let A be ? ArraySpeciesCreate(O, len). | |
188 Node* constructor = | |
189 CallRuntime(Runtime::kArraySpeciesConstructor, context(), o()); | |
190 a_.Bind(ConstructJS(CodeFactory::Construct(isolate()), context(), | |
191 constructor, len_)); | |
192 Goto(&fully_spec_compliant_); | |
193 } | |
194 BIND(&done); | |
195 } | |
196 | |
197 Node* SpecCompliantMapProcessor(Node* k_value, Node* k) { | |
198 // i. Let kValue be ? Get(O, Pk). Performed by the caller of MapProcessor. | |
199 // ii. Let mappedValue be ? Call(callbackfn, T, kValue, k, O). | |
200 Node* mappedValue = CallJS(CodeFactory::Call(isolate()), context(), | |
201 callbackfn(), this_arg(), k_value, k, o()); | |
202 | |
203 // iii. Perform ? CreateDataPropertyOrThrow(A, Pk, mappedValue). | |
204 CallRuntime(Runtime::kCreateDataProperty, context(), a(), k, mappedValue); | |
205 return a(); | |
168 } | 206 } |
169 | 207 |
170 Node* MapProcessor(Node* k_value, Node* k) { | 208 Node* MapProcessor(Node* k_value, Node* k) { |
171 // i. Let kValue be ? Get(O, Pk). Performed by the caller of MapProcessor. | 209 // i. Let kValue be ? Get(O, Pk). Performed by the caller of MapProcessor. |
172 // ii. Let mappedValue be ? Call(callbackfn, T, kValue, k, O). | 210 // ii. Let mappedValue be ? Call(callbackfn, T, kValue, k, O). |
173 Node* mappedValue = CallJS(CodeFactory::Call(isolate()), context(), | 211 Node* mappedValue = CallJS(CodeFactory::Call(isolate()), context(), |
174 callbackfn(), this_arg(), k_value, k, o()); | 212 callbackfn(), this_arg(), k_value, k, o()); |
175 | 213 |
176 Label finished(this); | 214 Label finished(this); |
177 Node* kind = nullptr; | 215 Node* kind = nullptr; |
178 Node* elements = nullptr; | 216 Node* elements = nullptr; |
179 | 217 |
180 // If a() is a JSArray, we can have a fast path. | 218 // If a() is a JSArray, we can have a fast path. |
181 // mode is SMI_PARAMETERS because k has tagged representation. | 219 // mode is SMI_PARAMETERS because k has tagged representation. |
220 Label runtime(this); | |
221 Label fast(this); | |
danno
2017/05/02 10:58:31
nit: Any particular reason for this change?
mvstanton
2017/05/03 12:19:36
Nope, just a rebase thing - I've restored the orig
| |
182 ParameterMode mode = SMI_PARAMETERS; | 222 ParameterMode mode = SMI_PARAMETERS; |
183 Label fast(this); | |
184 Label runtime(this); | |
185 Label object_push_pre(this), object_push(this), double_push(this); | 223 Label object_push_pre(this), object_push(this), double_push(this); |
186 BranchIfFastJSArray(a(), context(), FastJSArrayAccessMode::ANY_ACCESS, | 224 BranchIfFastJSArray(a(), context(), FastJSArrayAccessMode::ANY_ACCESS, |
187 &fast, &runtime); | 225 &fast, &runtime); |
188 | 226 |
189 BIND(&fast); | 227 BIND(&fast); |
190 { | 228 { |
191 kind = EnsureArrayPushable(a(), &runtime); | 229 kind = EnsureArrayPushable(a(), &runtime); |
192 elements = LoadElements(a()); | 230 elements = LoadElements(a()); |
193 GotoIf(IsElementsKindGreaterThan(kind, FAST_HOLEY_SMI_ELEMENTS), | 231 GotoIf(IsElementsKindGreaterThan(kind, FAST_HOLEY_SMI_ELEMENTS), |
194 &object_push_pre); | 232 &object_push_pre); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
261 callbackfn_ = callbackfn; | 299 callbackfn_ = callbackfn; |
262 this_arg_ = this_arg; | 300 this_arg_ = this_arg; |
263 argc_ = argc; | 301 argc_ = argc; |
264 } | 302 } |
265 | 303 |
266 void GenerateIteratingArrayBuiltinBody( | 304 void GenerateIteratingArrayBuiltinBody( |
267 const char* name, const BuiltinResultGenerator& generator, | 305 const char* name, const BuiltinResultGenerator& generator, |
268 const CallResultProcessor& processor, const PostLoopAction& action, | 306 const CallResultProcessor& processor, const PostLoopAction& action, |
269 const Callable& slow_case_continuation, | 307 const Callable& slow_case_continuation, |
270 ForEachDirection direction = ForEachDirection::kForward) { | 308 ForEachDirection direction = ForEachDirection::kForward) { |
271 Label non_array(this), slow(this, {&k_, &a_, &to_}), | 309 Label non_array(this), array_changes(this, {&k_, &a_, &to_}); |
272 array_changes(this, {&k_, &a_, &to_}); | |
273 | 310 |
274 // TODO(danno): Seriously? Do we really need to throw the exact error | 311 // TODO(danno): Seriously? Do we really need to throw the exact error |
275 // message on null and undefined so that the webkit tests pass? | 312 // message on null and undefined so that the webkit tests pass? |
276 Label throw_null_undefined_exception(this, Label::kDeferred); | 313 Label throw_null_undefined_exception(this, Label::kDeferred); |
277 GotoIf(WordEqual(receiver(), NullConstant()), | 314 GotoIf(WordEqual(receiver(), NullConstant()), |
278 &throw_null_undefined_exception); | 315 &throw_null_undefined_exception); |
279 GotoIf(WordEqual(receiver(), UndefinedConstant()), | 316 GotoIf(WordEqual(receiver(), UndefinedConstant()), |
280 &throw_null_undefined_exception); | 317 &throw_null_undefined_exception); |
281 | 318 |
282 // By the book: taken directly from the ECMAScript 2015 specification | 319 // By the book: taken directly from the ECMAScript 2015 specification |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 // 6. If thisArg was supplied, let T be thisArg; else let T be undefined. | 366 // 6. If thisArg was supplied, let T be thisArg; else let T be undefined. |
330 // [Already done by the arguments adapter] | 367 // [Already done by the arguments adapter] |
331 | 368 |
332 if (direction == ForEachDirection::kForward) { | 369 if (direction == ForEachDirection::kForward) { |
333 // 7. Let k be 0. | 370 // 7. Let k be 0. |
334 k_.Bind(SmiConstant(0)); | 371 k_.Bind(SmiConstant(0)); |
335 } else { | 372 } else { |
336 k_.Bind(NumberDec(len())); | 373 k_.Bind(NumberDec(len())); |
337 } | 374 } |
338 | 375 |
339 a_.Bind(generator(this)); | 376 generator(this); |
340 | 377 |
341 HandleFastElements(processor, action, &slow, direction); | 378 HandleFastElements(processor, action, &fully_spec_compliant_, direction); |
342 | 379 |
343 BIND(&slow); | 380 BIND(&fully_spec_compliant_); |
344 | 381 |
345 Node* result = | 382 Node* result = |
346 CallStub(slow_case_continuation, context(), receiver(), callbackfn(), | 383 CallStub(slow_case_continuation, context(), receiver(), callbackfn(), |
347 this_arg(), a_.value(), o(), k_.value(), len(), to_.value()); | 384 this_arg(), a_.value(), o(), k_.value(), len(), to_.value()); |
348 ReturnFromBuiltin(result); | 385 ReturnFromBuiltin(result); |
349 } | 386 } |
350 | 387 |
351 void InitIteratingArrayBuiltinLoopContinuation(Node* context, Node* receiver, | 388 void InitIteratingArrayBuiltinLoopContinuation(Node* context, Node* receiver, |
352 Node* callbackfn, | 389 Node* callbackfn, |
353 Node* this_arg, Node* a, | 390 Node* this_arg, Node* a, |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
433 label_ptrs.push_back(&label); | 470 label_ptrs.push_back(&label); |
434 } | 471 } |
435 | 472 |
436 BIND(&distinguish_types); | 473 BIND(&distinguish_types); |
437 | 474 |
438 if (direction == ForEachDirection::kForward) { | 475 if (direction == ForEachDirection::kForward) { |
439 k_.Bind(SmiConstant(0)); | 476 k_.Bind(SmiConstant(0)); |
440 } else { | 477 } else { |
441 k_.Bind(NumberDec(len())); | 478 k_.Bind(NumberDec(len())); |
442 } | 479 } |
443 a_.Bind(generator(this)); | 480 generator(this); |
444 Node* elements_type = LoadInstanceType(LoadElements(o_)); | 481 Node* elements_type = LoadInstanceType(LoadElements(o_)); |
445 Switch(elements_type, &unexpected_instance_type, instance_types.data(), | 482 Switch(elements_type, &unexpected_instance_type, instance_types.data(), |
446 label_ptrs.data(), labels.size()); | 483 label_ptrs.data(), labels.size()); |
447 | 484 |
448 for (size_t i = 0; i < labels.size(); ++i) { | 485 for (size_t i = 0; i < labels.size(); ++i) { |
449 BIND(&labels[i]); | 486 BIND(&labels[i]); |
450 Label done(this); | 487 Label done(this); |
451 // TODO(tebbi): Silently cancelling the loop on buffer detachment is a | 488 // TODO(tebbi): Silently cancelling the loop on buffer detachment is a |
452 // spec violation. Should go to &detached and throw a TypeError instead. | 489 // spec violation. Should go to &detached and throw a TypeError instead. |
453 VisitAllTypedArrayElements( | 490 VisitAllTypedArrayElements( |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
683 Node* o_ = nullptr; | 720 Node* o_ = nullptr; |
684 Node* this_arg_ = nullptr; | 721 Node* this_arg_ = nullptr; |
685 Node* len_ = nullptr; | 722 Node* len_ = nullptr; |
686 Node* context_ = nullptr; | 723 Node* context_ = nullptr; |
687 Node* receiver_ = nullptr; | 724 Node* receiver_ = nullptr; |
688 Node* new_target_ = nullptr; | 725 Node* new_target_ = nullptr; |
689 Node* argc_ = nullptr; | 726 Node* argc_ = nullptr; |
690 Variable k_; | 727 Variable k_; |
691 Variable a_; | 728 Variable a_; |
692 Variable to_; | 729 Variable to_; |
730 Label fully_spec_compliant_; | |
693 }; | 731 }; |
694 | 732 |
695 TF_BUILTIN(FastArrayPush, CodeStubAssembler) { | 733 TF_BUILTIN(FastArrayPush, CodeStubAssembler) { |
696 VARIABLE(arg_index, MachineType::PointerRepresentation()); | 734 VARIABLE(arg_index, MachineType::PointerRepresentation()); |
697 Label default_label(this, &arg_index); | 735 Label default_label(this, &arg_index); |
698 Label smi_transition(this); | 736 Label smi_transition(this); |
699 Label object_push_pre(this); | 737 Label object_push_pre(this); |
700 Label object_push(this, &arg_index); | 738 Label object_push(this, &arg_index); |
701 Label double_push(this, &arg_index); | 739 Label double_push(this, &arg_index); |
702 Label double_transition(this); | 740 Label double_transition(this); |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1161 Node* object = Parameter(Descriptor::kObject); | 1199 Node* object = Parameter(Descriptor::kObject); |
1162 Node* initial_k = Parameter(Descriptor::kInitialK); | 1200 Node* initial_k = Parameter(Descriptor::kInitialK); |
1163 Node* len = Parameter(Descriptor::kLength); | 1201 Node* len = Parameter(Descriptor::kLength); |
1164 Node* to = Parameter(Descriptor::kTo); | 1202 Node* to = Parameter(Descriptor::kTo); |
1165 | 1203 |
1166 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, | 1204 InitIteratingArrayBuiltinLoopContinuation(context, receiver, callbackfn, |
1167 this_arg, array, object, initial_k, | 1205 this_arg, array, object, initial_k, |
1168 len, to); | 1206 len, to); |
1169 | 1207 |
1170 GenerateIteratingArrayBuiltinLoopContinuation( | 1208 GenerateIteratingArrayBuiltinLoopContinuation( |
1171 &ArrayBuiltinCodeStubAssembler::MapProcessor, | 1209 &ArrayBuiltinCodeStubAssembler::SpecCompliantMapProcessor, |
1172 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); | 1210 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction); |
1173 } | 1211 } |
1174 | 1212 |
1175 TF_BUILTIN(ArrayMap, ArrayBuiltinCodeStubAssembler) { | 1213 TF_BUILTIN(ArrayMap, ArrayBuiltinCodeStubAssembler) { |
1176 Node* argc = | 1214 Node* argc = |
1177 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); | 1215 ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount)); |
1178 CodeStubArguments args(this, argc); | 1216 CodeStubArguments args(this, argc); |
1179 Node* context = Parameter(BuiltinDescriptor::kContext); | 1217 Node* context = Parameter(BuiltinDescriptor::kContext); |
1180 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); | 1218 Node* new_target = Parameter(BuiltinDescriptor::kNewTarget); |
1181 Node* receiver = args.GetReceiver(); | 1219 Node* receiver = args.GetReceiver(); |
(...skipping 1064 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2246 { | 2284 { |
2247 Node* message = SmiConstant(MessageTemplate::kDetachedOperation); | 2285 Node* message = SmiConstant(MessageTemplate::kDetachedOperation); |
2248 CallRuntime(Runtime::kThrowTypeError, context, message, | 2286 CallRuntime(Runtime::kThrowTypeError, context, message, |
2249 HeapConstant(operation)); | 2287 HeapConstant(operation)); |
2250 Unreachable(); | 2288 Unreachable(); |
2251 } | 2289 } |
2252 } | 2290 } |
2253 | 2291 |
2254 } // namespace internal | 2292 } // namespace internal |
2255 } // namespace v8 | 2293 } // namespace v8 |
OLD | NEW |