| 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/ast/ast.h" |
| 5 #include "src/builtins/builtins-constructor.h" | 6 #include "src/builtins/builtins-constructor.h" |
| 6 #include "src/ast/ast.h" | 7 #include "src/builtins/builtins-utils-gen.h" |
| 7 #include "src/builtins/builtins-utils.h" | |
| 8 #include "src/builtins/builtins.h" | 8 #include "src/builtins/builtins.h" |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/code-stub-assembler.h" | 10 #include "src/code-stub-assembler.h" |
| 11 #include "src/counters.h" | 11 #include "src/counters.h" |
| 12 #include "src/interface-descriptors.h" | 12 #include "src/interface-descriptors.h" |
| 13 #include "src/objects-inl.h" | 13 #include "src/objects-inl.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 | 17 |
| 18 typedef compiler::Node Node; | 18 typedef compiler::Node Node; |
| 19 | 19 |
| 20 Node* ConstructorBuiltinsAssembler::EmitFastNewClosure(Node* shared_info, | 20 Node* ConstructorBuiltinsAssembler::EmitFastNewClosure(Node* shared_info, |
| 21 Node* feedback_vector, | 21 Node* feedback_vector, |
| 22 Node* slot, | 22 Node* slot, |
| 23 Node* context) { | 23 Node* context) { |
| 24 typedef compiler::CodeAssembler::Label Label; | |
| 25 typedef compiler::CodeAssembler::Variable Variable; | |
| 26 | |
| 27 Isolate* isolate = this->isolate(); | 24 Isolate* isolate = this->isolate(); |
| 28 Factory* factory = isolate->factory(); | 25 Factory* factory = isolate->factory(); |
| 29 IncrementCounter(isolate->counters()->fast_new_closure_total(), 1); | 26 IncrementCounter(isolate->counters()->fast_new_closure_total(), 1); |
| 30 | 27 |
| 31 // Create a new closure from the given function info in new space | 28 // Create a new closure from the given function info in new space |
| 32 Node* result = Allocate(JSFunction::kSize); | 29 Node* result = Allocate(JSFunction::kSize); |
| 33 | 30 |
| 34 // Calculate the index of the map we should install on the function based on | 31 // Calculate the index of the map we should install on the function based on |
| 35 // the FunctionKind and LanguageMode of the function. | 32 // the FunctionKind and LanguageMode of the function. |
| 36 // Note: Must be kept in sync with Context::FunctionMapIndex | 33 // Note: Must be kept in sync with Context::FunctionMapIndex |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 Goto(&end); | 201 Goto(&end); |
| 205 | 202 |
| 206 Bind(&call_runtime); | 203 Bind(&call_runtime); |
| 207 var_obj.Bind(CallRuntime(Runtime::kNewObject, context, target, new_target)); | 204 var_obj.Bind(CallRuntime(Runtime::kNewObject, context, target, new_target)); |
| 208 Goto(&end); | 205 Goto(&end); |
| 209 | 206 |
| 210 Bind(&end); | 207 Bind(&end); |
| 211 return var_obj.value(); | 208 return var_obj.value(); |
| 212 } | 209 } |
| 213 | 210 |
| 214 Node* ConstructorBuiltinsAssembler::EmitFastNewObject( | 211 Node* ConstructorBuiltinsAssembler::EmitFastNewObject(Node* context, |
| 215 Node* context, Node* target, Node* new_target, | 212 Node* target, |
| 216 CodeAssemblerLabel* call_runtime) { | 213 Node* new_target, |
| 214 Label* call_runtime) { |
| 217 CSA_ASSERT(this, HasInstanceType(target, JS_FUNCTION_TYPE)); | 215 CSA_ASSERT(this, HasInstanceType(target, JS_FUNCTION_TYPE)); |
| 218 CSA_ASSERT(this, IsJSReceiver(new_target)); | 216 CSA_ASSERT(this, IsJSReceiver(new_target)); |
| 219 | 217 |
| 220 // Verify that the new target is a JSFunction. | 218 // Verify that the new target is a JSFunction. |
| 221 Label fast(this), end(this); | 219 Label fast(this), end(this); |
| 222 GotoIf(HasInstanceType(new_target, JS_FUNCTION_TYPE), &fast); | 220 GotoIf(HasInstanceType(new_target, JS_FUNCTION_TYPE), &fast); |
| 223 Goto(call_runtime); | 221 Goto(call_runtime); |
| 224 | 222 |
| 225 Bind(&fast); | 223 Bind(&fast); |
| 226 | 224 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 } | 394 } |
| 397 | 395 |
| 398 TF_BUILTIN(FastNewFunctionContextFunction, ConstructorBuiltinsAssembler) { | 396 TF_BUILTIN(FastNewFunctionContextFunction, ConstructorBuiltinsAssembler) { |
| 399 Node* function = Parameter(FastNewFunctionContextDescriptor::kFunction); | 397 Node* function = Parameter(FastNewFunctionContextDescriptor::kFunction); |
| 400 Node* slots = Parameter(FastNewFunctionContextDescriptor::kSlots); | 398 Node* slots = Parameter(FastNewFunctionContextDescriptor::kSlots); |
| 401 Node* context = Parameter(FastNewFunctionContextDescriptor::kContext); | 399 Node* context = Parameter(FastNewFunctionContextDescriptor::kContext); |
| 402 Return(EmitFastNewFunctionContext(function, slots, context, | 400 Return(EmitFastNewFunctionContext(function, slots, context, |
| 403 ScopeType::FUNCTION_SCOPE)); | 401 ScopeType::FUNCTION_SCOPE)); |
| 404 } | 402 } |
| 405 | 403 |
| 406 Handle<Code> Builtins::NewFunctionContext(ScopeType scope_type) { | |
| 407 switch (scope_type) { | |
| 408 case ScopeType::EVAL_SCOPE: | |
| 409 return FastNewFunctionContextEval(); | |
| 410 case ScopeType::FUNCTION_SCOPE: | |
| 411 return FastNewFunctionContextFunction(); | |
| 412 default: | |
| 413 UNREACHABLE(); | |
| 414 } | |
| 415 return Handle<Code>::null(); | |
| 416 } | |
| 417 | |
| 418 Node* ConstructorBuiltinsAssembler::EmitFastCloneRegExp(Node* closure, | 404 Node* ConstructorBuiltinsAssembler::EmitFastCloneRegExp(Node* closure, |
| 419 Node* literal_index, | 405 Node* literal_index, |
| 420 Node* pattern, | 406 Node* pattern, |
| 421 Node* flags, | 407 Node* flags, |
| 422 Node* context) { | 408 Node* context) { |
| 423 typedef CodeStubAssembler::Label Label; | 409 typedef CodeStubAssembler::Label Label; |
| 424 typedef CodeStubAssembler::Variable Variable; | 410 typedef CodeStubAssembler::Variable Variable; |
| 425 typedef compiler::Node Node; | 411 typedef compiler::Node Node; |
| 426 | 412 |
| 427 Label call_runtime(this, Label::kDeferred), end(this); | 413 Label call_runtime(this, Label::kDeferred), end(this); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 | 480 |
| 495 Comment("copy boilerplate elements"); | 481 Comment("copy boilerplate elements"); |
| 496 CopyFixedArrayElements(kind, boilerplate_elements, elements, length, | 482 CopyFixedArrayElements(kind, boilerplate_elements, elements, length, |
| 497 SKIP_WRITE_BARRIER, param_mode); | 483 SKIP_WRITE_BARRIER, param_mode); |
| 498 IncrementCounter(isolate()->counters()->inlined_copied_elements(), 1); | 484 IncrementCounter(isolate()->counters()->inlined_copied_elements(), 1); |
| 499 | 485 |
| 500 return array; | 486 return array; |
| 501 } | 487 } |
| 502 | 488 |
| 503 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowArray( | 489 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowArray( |
| 504 Node* closure, Node* literal_index, Node* context, | 490 Node* closure, Node* literal_index, Node* context, Label* call_runtime, |
| 505 CodeAssemblerLabel* call_runtime, AllocationSiteMode allocation_site_mode) { | 491 AllocationSiteMode allocation_site_mode) { |
| 506 typedef CodeStubAssembler::Label Label; | |
| 507 typedef CodeStubAssembler::Variable Variable; | |
| 508 typedef compiler::Node Node; | |
| 509 | |
| 510 Label zero_capacity(this), cow_elements(this), fast_elements(this), | 492 Label zero_capacity(this), cow_elements(this), fast_elements(this), |
| 511 return_result(this); | 493 return_result(this); |
| 512 Variable result(this, MachineRepresentation::kTagged); | 494 Variable result(this, MachineRepresentation::kTagged); |
| 513 | 495 |
| 514 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); | 496 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); |
| 515 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); | 497 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); |
| 516 Node* allocation_site = LoadFixedArrayElement( | 498 Node* allocation_site = LoadFixedArrayElement( |
| 517 feedback_vector, literal_index, 0, CodeStubAssembler::SMI_PARAMETERS); | 499 feedback_vector, literal_index, 0, CodeStubAssembler::SMI_PARAMETERS); |
| 518 | 500 |
| 519 GotoIf(IsUndefined(allocation_site), call_runtime); | 501 GotoIf(IsUndefined(allocation_site), call_runtime); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 } | 616 } |
| 635 | 617 |
| 636 TF_BUILTIN(FastCloneShallowArrayTrack, ConstructorBuiltinsAssembler) { | 618 TF_BUILTIN(FastCloneShallowArrayTrack, ConstructorBuiltinsAssembler) { |
| 637 CreateFastCloneShallowArrayBuiltin(TRACK_ALLOCATION_SITE); | 619 CreateFastCloneShallowArrayBuiltin(TRACK_ALLOCATION_SITE); |
| 638 } | 620 } |
| 639 | 621 |
| 640 TF_BUILTIN(FastCloneShallowArrayDontTrack, ConstructorBuiltinsAssembler) { | 622 TF_BUILTIN(FastCloneShallowArrayDontTrack, ConstructorBuiltinsAssembler) { |
| 641 CreateFastCloneShallowArrayBuiltin(DONT_TRACK_ALLOCATION_SITE); | 623 CreateFastCloneShallowArrayBuiltin(DONT_TRACK_ALLOCATION_SITE); |
| 642 } | 624 } |
| 643 | 625 |
| 644 Handle<Code> Builtins::NewCloneShallowArray( | |
| 645 AllocationSiteMode allocation_mode) { | |
| 646 switch (allocation_mode) { | |
| 647 case TRACK_ALLOCATION_SITE: | |
| 648 return FastCloneShallowArrayTrack(); | |
| 649 case DONT_TRACK_ALLOCATION_SITE: | |
| 650 return FastCloneShallowArrayDontTrack(); | |
| 651 default: | |
| 652 UNREACHABLE(); | |
| 653 } | |
| 654 return Handle<Code>::null(); | |
| 655 } | |
| 656 | |
| 657 // static | 626 // static |
| 658 int ConstructorBuiltinsAssembler::FastCloneShallowObjectPropertiesCount( | 627 int ConstructorBuiltinsAssembler::FastCloneShallowObjectPropertiesCount( |
| 659 int literal_length) { | 628 int literal_length) { |
| 660 // This heuristic of setting empty literals to have | 629 // This heuristic of setting empty literals to have |
| 661 // kInitialGlobalObjectUnusedPropertiesCount must remain in-sync with the | 630 // kInitialGlobalObjectUnusedPropertiesCount must remain in-sync with the |
| 662 // runtime. | 631 // runtime. |
| 663 // TODO(verwaest): Unify this with the heuristic in the runtime. | 632 // TODO(verwaest): Unify this with the heuristic in the runtime. |
| 664 return literal_length == 0 | 633 return literal_length == 0 |
| 665 ? JSObject::kInitialGlobalObjectUnusedPropertiesCount | 634 ? JSObject::kInitialGlobalObjectUnusedPropertiesCount |
| 666 : literal_length; | 635 : literal_length; |
| 667 } | 636 } |
| 668 | 637 |
| 669 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( | 638 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( |
| 670 CodeAssemblerLabel* call_runtime, Node* closure, Node* literals_index, | 639 Label* call_runtime, Node* closure, Node* literals_index, |
| 671 Node* properties_count) { | 640 Node* properties_count) { |
| 672 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); | 641 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); |
| 673 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); | 642 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); |
| 674 Node* allocation_site = LoadFixedArrayElement( | 643 Node* allocation_site = LoadFixedArrayElement( |
| 675 feedback_vector, literals_index, 0, CodeStubAssembler::SMI_PARAMETERS); | 644 feedback_vector, literals_index, 0, CodeStubAssembler::SMI_PARAMETERS); |
| 676 GotoIf(IsUndefined(allocation_site), call_runtime); | 645 GotoIf(IsUndefined(allocation_site), call_runtime); |
| 677 | 646 |
| 678 // Calculate the object and allocation size based on the properties count. | 647 // Calculate the object and allocation size based on the properties count. |
| 679 Node* object_size = IntPtrAdd(WordShl(properties_count, kPointerSizeLog2), | 648 Node* object_size = IntPtrAdd(WordShl(properties_count, kPointerSizeLog2), |
| 680 IntPtrConstant(JSObject::kHeaderSize)); | 649 IntPtrConstant(JSObject::kHeaderSize)); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 } | 730 } |
| 762 | 731 |
| 763 SHALLOW_OBJECT_BUILTIN(0); | 732 SHALLOW_OBJECT_BUILTIN(0); |
| 764 SHALLOW_OBJECT_BUILTIN(1); | 733 SHALLOW_OBJECT_BUILTIN(1); |
| 765 SHALLOW_OBJECT_BUILTIN(2); | 734 SHALLOW_OBJECT_BUILTIN(2); |
| 766 SHALLOW_OBJECT_BUILTIN(3); | 735 SHALLOW_OBJECT_BUILTIN(3); |
| 767 SHALLOW_OBJECT_BUILTIN(4); | 736 SHALLOW_OBJECT_BUILTIN(4); |
| 768 SHALLOW_OBJECT_BUILTIN(5); | 737 SHALLOW_OBJECT_BUILTIN(5); |
| 769 SHALLOW_OBJECT_BUILTIN(6); | 738 SHALLOW_OBJECT_BUILTIN(6); |
| 770 | 739 |
| 771 Handle<Code> Builtins::NewCloneShallowObject(int length) { | |
| 772 switch (length) { | |
| 773 case 0: | |
| 774 return FastCloneShallowObject0(); | |
| 775 case 1: | |
| 776 return FastCloneShallowObject1(); | |
| 777 case 2: | |
| 778 return FastCloneShallowObject2(); | |
| 779 case 3: | |
| 780 return FastCloneShallowObject3(); | |
| 781 case 4: | |
| 782 return FastCloneShallowObject4(); | |
| 783 case 5: | |
| 784 return FastCloneShallowObject5(); | |
| 785 case 6: | |
| 786 return FastCloneShallowObject6(); | |
| 787 default: | |
| 788 UNREACHABLE(); | |
| 789 } | |
| 790 return Handle<Code>::null(); | |
| 791 } | |
| 792 | |
| 793 } // namespace internal | 740 } // namespace internal |
| 794 } // namespace v8 | 741 } // namespace v8 |
| OLD | NEW |