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

Side by Side Diff: src/builtins/builtins-array-gen.cc

Issue 2846963003: Array.prototype.map write error. (Closed)
Patch Set: Better nit repair! Created 3 years, 7 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 | « no previous file | 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 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 19 fully_spec_compliant_(this, {&k_, &a_, &to_}) {}
20 typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm)>
21 BuiltinResultGenerator;
22 20
23 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)> 21 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)>
24 BuiltinResultIndexInitializer; 22 BuiltinResultGenerator;
25 23
26 typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm, 24 typedef std::function<Node*(ArrayBuiltinCodeStubAssembler* masm,
27 Node* k_value, Node* k)> 25 Node* k_value, Node* k)>
28 CallResultProcessor; 26 CallResultProcessor;
29 27
30 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)> 28 typedef std::function<void(ArrayBuiltinCodeStubAssembler* masm)>
31 PostLoopAction; 29 PostLoopAction;
32 30
33 Node* ForEachResultGenerator() { return UndefinedConstant(); } 31 void ForEachResultGenerator() { a_.Bind(UndefinedConstant()); }
34 32
35 Node* ForEachProcessor(Node* k_value, Node* k) { 33 Node* ForEachProcessor(Node* k_value, Node* k) {
36 CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), this_arg(), 34 CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), this_arg(),
37 k_value, k, o()); 35 k_value, k, o());
38 return a(); 36 return a();
39 } 37 }
40 38
41 Node* SomeResultGenerator() { return FalseConstant(); } 39 void SomeResultGenerator() { a_.Bind(FalseConstant()); }
42 40
43 Node* SomeProcessor(Node* k_value, Node* k) { 41 Node* SomeProcessor(Node* k_value, Node* k) {
44 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), 42 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(),
45 this_arg(), k_value, k, o()); 43 this_arg(), k_value, k, o());
46 Label false_continue(this), return_true(this); 44 Label false_continue(this), return_true(this);
47 BranchIfToBooleanIsTrue(value, &return_true, &false_continue); 45 BranchIfToBooleanIsTrue(value, &return_true, &false_continue);
48 BIND(&return_true); 46 BIND(&return_true);
49 ReturnFromBuiltin(TrueConstant()); 47 ReturnFromBuiltin(TrueConstant());
50 BIND(&false_continue); 48 BIND(&false_continue);
51 return a(); 49 return a();
52 } 50 }
53 51
54 Node* EveryResultGenerator() { return TrueConstant(); } 52 void EveryResultGenerator() { a_.Bind(TrueConstant()); }
55 53
56 Node* EveryProcessor(Node* k_value, Node* k) { 54 Node* EveryProcessor(Node* k_value, Node* k) {
57 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), 55 Node* value = CallJS(CodeFactory::Call(isolate()), context(), callbackfn(),
58 this_arg(), k_value, k, o()); 56 this_arg(), k_value, k, o());
59 Label true_continue(this), return_false(this); 57 Label true_continue(this), return_false(this);
60 BranchIfToBooleanIsTrue(value, &true_continue, &return_false); 58 BranchIfToBooleanIsTrue(value, &true_continue, &return_false);
61 BIND(&return_false); 59 BIND(&return_false);
62 ReturnFromBuiltin(FalseConstant()); 60 ReturnFromBuiltin(FalseConstant());
63 BIND(&true_continue); 61 BIND(&true_continue);
64 return a(); 62 return a();
65 } 63 }
66 64
67 Node* ReduceResultGenerator() { return this_arg(); } 65 void ReduceResultGenerator() { return a_.Bind(this_arg()); }
68 66
69 Node* ReduceProcessor(Node* k_value, Node* k) { 67 Node* ReduceProcessor(Node* k_value, Node* k) {
70 VARIABLE(result, MachineRepresentation::kTagged); 68 VARIABLE(result, MachineRepresentation::kTagged);
71 Label done(this, {&result}), initial(this); 69 Label done(this, {&result}), initial(this);
72 GotoIf(WordEqual(a(), TheHoleConstant()), &initial); 70 GotoIf(WordEqual(a(), TheHoleConstant()), &initial);
73 result.Bind(CallJS(CodeFactory::Call(isolate()), context(), callbackfn(), 71 result.Bind(CallJS(CodeFactory::Call(isolate()), context(), callbackfn(),
74 UndefinedConstant(), a(), k_value, k, o())); 72 UndefinedConstant(), a(), k_value, k, o()));
75 Goto(&done); 73 Goto(&done);
76 74
77 BIND(&initial); 75 BIND(&initial);
78 result.Bind(k_value); 76 result.Bind(k_value);
79 Goto(&done); 77 Goto(&done);
80 78
81 BIND(&done); 79 BIND(&done);
82 return result.value(); 80 return result.value();
83 } 81 }
84 82
85 void ReducePostLoopAction() { 83 void ReducePostLoopAction() {
86 Label ok(this); 84 Label ok(this);
87 GotoIf(WordNotEqual(a(), TheHoleConstant()), &ok); 85 GotoIf(WordNotEqual(a(), TheHoleConstant()), &ok);
88 CallRuntime(Runtime::kThrowTypeError, context(), 86 CallRuntime(Runtime::kThrowTypeError, context(),
89 SmiConstant(MessageTemplate::kReduceNoInitial)); 87 SmiConstant(MessageTemplate::kReduceNoInitial));
90 Unreachable(); 88 Unreachable();
91 BIND(&ok); 89 BIND(&ok);
92 } 90 }
93 91
94 Node* FilterResultGenerator() { 92 void FilterResultGenerator() {
95 // 7. Let A be ArraySpeciesCreate(O, 0). 93 // 7. Let A be ArraySpeciesCreate(O, 0).
96 return ArraySpeciesCreate(context(), o(), SmiConstant(0)); 94 a_.Bind(ArraySpeciesCreate(context(), o(), SmiConstant(0)));
97 } 95 }
98 96
99 Node* FilterProcessor(Node* k_value, Node* k) { 97 Node* FilterProcessor(Node* k_value, Node* k) {
100 // ii. Let selected be ToBoolean(? Call(callbackfn, T, kValue, k, O)). 98 // ii. Let selected be ToBoolean(? Call(callbackfn, T, kValue, k, O)).
101 Node* selected = CallJS(CodeFactory::Call(isolate()), context(), 99 Node* selected = CallJS(CodeFactory::Call(isolate()), context(),
102 callbackfn(), this_arg(), k_value, k, o()); 100 callbackfn(), this_arg(), k_value, k, o());
103 Label true_continue(this, &to_), false_continue(this); 101 Label true_continue(this, &to_), false_continue(this);
104 BranchIfToBooleanIsTrue(selected, &true_continue, &false_continue); 102 BranchIfToBooleanIsTrue(selected, &true_continue, &false_continue);
105 BIND(&true_continue); 103 BIND(&true_continue);
106 // iii. If selected is true, then... 104 // iii. If selected is true, then...
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 { 153 {
156 // 2. Increase to by 1. 154 // 2. Increase to by 1.
157 to_.Bind(NumberInc(to_.value())); 155 to_.Bind(NumberInc(to_.value()));
158 Goto(&false_continue); 156 Goto(&false_continue);
159 } 157 }
160 } 158 }
161 BIND(&false_continue); 159 BIND(&false_continue);
162 return a(); 160 return a();
163 } 161 }
164 162
165 Node* MapResultGenerator() { 163 void MapResultGenerator() {
166 // 5. Let A be ? ArraySpeciesCreate(O, len). 164 Label runtime(this), done(this, {&a_});
167 return ArraySpeciesCreate(context(), o(), len_); 165 GotoIf(DoesntHaveInstanceType(o(), JS_ARRAY_TYPE), &runtime);
166 Node* o_map = LoadMap(o());
167 Node* const initial_array_prototype = LoadContextElement(
168 LoadNativeContext(context()), Context::INITIAL_ARRAY_PROTOTYPE_INDEX);
169 Node* proto = LoadMapPrototype(o_map);
170 GotoIf(WordNotEqual(proto, initial_array_prototype), &runtime);
171
172 Node* species_protector = SpeciesProtectorConstant();
173 Node* value = LoadObjectField(species_protector, Cell::kValueOffset);
174 Node* const protector_invalid = SmiConstant(Isolate::kProtectorInvalid);
175 GotoIf(WordEqual(value, protector_invalid), &runtime);
176
177 Node* const initial_array_constructor = LoadContextElement(
178 LoadNativeContext(context()), Context::ARRAY_FUNCTION_INDEX);
179 a_.Bind(ConstructJS(CodeFactory::Construct(isolate()), context(),
180 initial_array_constructor, len_));
181 Goto(&done);
182
183 BIND(&runtime);
184 {
185 // 5. Let A be ? ArraySpeciesCreate(O, len).
186 Node* constructor =
187 CallRuntime(Runtime::kArraySpeciesConstructor, context(), o());
188 a_.Bind(ConstructJS(CodeFactory::Construct(isolate()), context(),
189 constructor, len_));
190 Goto(&fully_spec_compliant_);
191 }
192 BIND(&done);
168 } 193 }
169 194
170 Node* MapProcessor(Node* k_value, Node* k) { 195 Node* SpecCompliantMapProcessor(Node* k_value, Node* k) {
171 // i. Let kValue be ? Get(O, Pk). Performed by the caller of MapProcessor. 196 // i. Let kValue be ? Get(O, Pk). Performed by the caller of
197 // SpecCompliantMapProcessor.
172 // ii. Let mappedValue be ? Call(callbackfn, T, kValue, k, O). 198 // ii. Let mappedValue be ? Call(callbackfn, T, kValue, k, O).
173 Node* mappedValue = CallJS(CodeFactory::Call(isolate()), context(), 199 Node* mappedValue = CallJS(CodeFactory::Call(isolate()), context(),
174 callbackfn(), this_arg(), k_value, k, o()); 200 callbackfn(), this_arg(), k_value, k, o());
201
202 // iii. Perform ? CreateDataPropertyOrThrow(A, Pk, mappedValue).
203 CallRuntime(Runtime::kCreateDataProperty, context(), a(), k, mappedValue);
204 return a();
205 }
206
207 Node* FastMapProcessor(Node* k_value, Node* k) {
208 // i. Let kValue be ? Get(O, Pk). Performed by the caller of
209 // FastMapProcessor.
210 // ii. Let mappedValue be ? Call(callbackfn, T, kValue, k, O).
211 Node* mappedValue = CallJS(CodeFactory::Call(isolate()), context(),
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.
182 ParameterMode mode = SMI_PARAMETERS; 220 ParameterMode mode = SMI_PARAMETERS;
183 Label fast(this); 221 Label fast(this);
184 Label runtime(this); 222 Label runtime(this);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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();
1182 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant()); 1220 Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
1183 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant()); 1221 Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
1184 1222
1185 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg, 1223 InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
1186 new_target, argc); 1224 new_target, argc);
1187 1225
1188 GenerateIteratingArrayBuiltinBody( 1226 GenerateIteratingArrayBuiltinBody(
1189 "Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator, 1227 "Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator,
1190 &ArrayBuiltinCodeStubAssembler::MapProcessor, 1228 &ArrayBuiltinCodeStubAssembler::FastMapProcessor,
1191 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction, 1229 &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
1192 Builtins::CallableFor(isolate(), Builtins::kArrayMapLoopContinuation)); 1230 Builtins::CallableFor(isolate(), Builtins::kArrayMapLoopContinuation));
1193 } 1231 }
1194 1232
1195 TF_BUILTIN(ArrayIsArray, CodeStubAssembler) { 1233 TF_BUILTIN(ArrayIsArray, CodeStubAssembler) {
1196 Node* object = Parameter(Descriptor::kArg); 1234 Node* object = Parameter(Descriptor::kArg);
1197 Node* context = Parameter(Descriptor::kContext); 1235 Node* context = Parameter(Descriptor::kContext);
1198 1236
1199 Label call_runtime(this), return_true(this), return_false(this); 1237 Label call_runtime(this), return_true(this), return_false(this);
1200 1238
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW
« no previous file with comments | « no previous file | src/code-stub-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698