Chromium Code Reviews| 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 |