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

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

Issue 2846963003: Array.prototype.map write error. (Closed)
Patch Set: REBASE. 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 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
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
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();
(...skipping 1064 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