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/builtins/builtins-constructor-gen.h" |
| 6 |
5 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
6 #include "src/builtins/builtins-constructor.h" | 8 #include "src/builtins/builtins-constructor.h" |
7 #include "src/builtins/builtins-utils-gen.h" | 9 #include "src/builtins/builtins-utils-gen.h" |
8 #include "src/builtins/builtins.h" | 10 #include "src/builtins/builtins.h" |
9 #include "src/code-factory.h" | 11 #include "src/code-factory.h" |
10 #include "src/code-stub-assembler.h" | 12 #include "src/code-stub-assembler.h" |
11 #include "src/counters.h" | 13 #include "src/counters.h" |
12 #include "src/interface-descriptors.h" | 14 #include "src/interface-descriptors.h" |
13 #include "src/objects-inl.h" | 15 #include "src/objects-inl.h" |
14 | 16 |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 | 325 |
324 Bind(&end); | 326 Bind(&end); |
325 return object; | 327 return object; |
326 } | 328 } |
327 | 329 |
328 Node* ConstructorBuiltinsAssembler::EmitFastNewFunctionContext( | 330 Node* ConstructorBuiltinsAssembler::EmitFastNewFunctionContext( |
329 Node* function, Node* slots, Node* context, ScopeType scope_type) { | 331 Node* function, Node* slots, Node* context, ScopeType scope_type) { |
330 slots = ChangeUint32ToWord(slots); | 332 slots = ChangeUint32ToWord(slots); |
331 | 333 |
332 // TODO(ishell): Use CSA::OptimalParameterMode() here. | 334 // TODO(ishell): Use CSA::OptimalParameterMode() here. |
333 CodeStubAssembler::ParameterMode mode = CodeStubAssembler::INTPTR_PARAMETERS; | 335 ParameterMode mode = INTPTR_PARAMETERS; |
334 Node* min_context_slots = IntPtrConstant(Context::MIN_CONTEXT_SLOTS); | 336 Node* min_context_slots = IntPtrConstant(Context::MIN_CONTEXT_SLOTS); |
335 Node* length = IntPtrAdd(slots, min_context_slots); | 337 Node* length = IntPtrAdd(slots, min_context_slots); |
336 Node* size = GetFixedArrayAllocationSize(length, FAST_ELEMENTS, mode); | 338 Node* size = GetFixedArrayAllocationSize(length, FAST_ELEMENTS, mode); |
337 | 339 |
338 // Create a new closure from the given function info in new space | 340 // Create a new closure from the given function info in new space |
339 Node* function_context = AllocateInNewSpace(size); | 341 Node* function_context = AllocateInNewSpace(size); |
340 | 342 |
341 Heap::RootListIndex context_type; | 343 Heap::RootListIndex context_type; |
342 switch (scope_type) { | 344 switch (scope_type) { |
343 case EVAL_SCOPE: | 345 case EVAL_SCOPE: |
(...skipping 28 matching lines...) Expand all Loading... |
372 function_context, FAST_ELEMENTS, min_context_slots, length, | 374 function_context, FAST_ELEMENTS, min_context_slots, length, |
373 [this, undefined](Node* context, Node* offset) { | 375 [this, undefined](Node* context, Node* offset) { |
374 StoreNoWriteBarrier(MachineRepresentation::kTagged, context, offset, | 376 StoreNoWriteBarrier(MachineRepresentation::kTagged, context, offset, |
375 undefined); | 377 undefined); |
376 }, | 378 }, |
377 mode); | 379 mode); |
378 | 380 |
379 return function_context; | 381 return function_context; |
380 } | 382 } |
381 | 383 |
382 // static | |
383 int ConstructorBuiltinsAssembler::MaximumFunctionContextSlots() { | |
384 return FLAG_test_small_max_function_context_stub_size ? kSmallMaximumSlots | |
385 : kMaximumSlots; | |
386 } | |
387 | |
388 TF_BUILTIN(FastNewFunctionContextEval, ConstructorBuiltinsAssembler) { | 384 TF_BUILTIN(FastNewFunctionContextEval, ConstructorBuiltinsAssembler) { |
389 Node* function = Parameter(FastNewFunctionContextDescriptor::kFunction); | 385 Node* function = Parameter(FastNewFunctionContextDescriptor::kFunction); |
390 Node* slots = Parameter(FastNewFunctionContextDescriptor::kSlots); | 386 Node* slots = Parameter(FastNewFunctionContextDescriptor::kSlots); |
391 Node* context = Parameter(FastNewFunctionContextDescriptor::kContext); | 387 Node* context = Parameter(FastNewFunctionContextDescriptor::kContext); |
392 Return(EmitFastNewFunctionContext(function, slots, context, | 388 Return(EmitFastNewFunctionContext(function, slots, context, |
393 ScopeType::EVAL_SCOPE)); | 389 ScopeType::EVAL_SCOPE)); |
394 } | 390 } |
395 | 391 |
396 TF_BUILTIN(FastNewFunctionContextFunction, ConstructorBuiltinsAssembler) { | 392 TF_BUILTIN(FastNewFunctionContextFunction, ConstructorBuiltinsAssembler) { |
397 Node* function = Parameter(FastNewFunctionContextDescriptor::kFunction); | 393 Node* function = Parameter(FastNewFunctionContextDescriptor::kFunction); |
398 Node* slots = Parameter(FastNewFunctionContextDescriptor::kSlots); | 394 Node* slots = Parameter(FastNewFunctionContextDescriptor::kSlots); |
399 Node* context = Parameter(FastNewFunctionContextDescriptor::kContext); | 395 Node* context = Parameter(FastNewFunctionContextDescriptor::kContext); |
400 Return(EmitFastNewFunctionContext(function, slots, context, | 396 Return(EmitFastNewFunctionContext(function, slots, context, |
401 ScopeType::FUNCTION_SCOPE)); | 397 ScopeType::FUNCTION_SCOPE)); |
402 } | 398 } |
403 | 399 |
404 Node* ConstructorBuiltinsAssembler::EmitFastCloneRegExp(Node* closure, | 400 Node* ConstructorBuiltinsAssembler::EmitFastCloneRegExp(Node* closure, |
405 Node* literal_index, | 401 Node* literal_index, |
406 Node* pattern, | 402 Node* pattern, |
407 Node* flags, | 403 Node* flags, |
408 Node* context) { | 404 Node* context) { |
409 typedef CodeStubAssembler::Label Label; | |
410 typedef CodeStubAssembler::Variable Variable; | |
411 typedef compiler::Node Node; | |
412 | |
413 Label call_runtime(this, Label::kDeferred), end(this); | 405 Label call_runtime(this, Label::kDeferred), end(this); |
414 | 406 |
415 Variable result(this, MachineRepresentation::kTagged); | 407 Variable result(this, MachineRepresentation::kTagged); |
416 | 408 |
417 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); | 409 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); |
418 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); | 410 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); |
419 Node* boilerplate = LoadFixedArrayElement(feedback_vector, literal_index, 0, | 411 Node* boilerplate = LoadFixedArrayElement(feedback_vector, literal_index, 0, |
420 CodeStubAssembler::SMI_PARAMETERS); | 412 CodeStubAssembler::SMI_PARAMETERS); |
421 GotoIf(IsUndefined(boilerplate), &call_runtime); | 413 GotoIf(IsUndefined(boilerplate), &call_runtime); |
422 | 414 |
(...skipping 25 matching lines...) Expand all Loading... |
448 Node* pattern = Parameter(FastCloneRegExpDescriptor::kPattern); | 440 Node* pattern = Parameter(FastCloneRegExpDescriptor::kPattern); |
449 Node* flags = Parameter(FastCloneRegExpDescriptor::kFlags); | 441 Node* flags = Parameter(FastCloneRegExpDescriptor::kFlags); |
450 Node* context = Parameter(FastCloneRegExpDescriptor::kContext); | 442 Node* context = Parameter(FastCloneRegExpDescriptor::kContext); |
451 | 443 |
452 Return(EmitFastCloneRegExp(closure, literal_index, pattern, flags, context)); | 444 Return(EmitFastCloneRegExp(closure, literal_index, pattern, flags, context)); |
453 } | 445 } |
454 | 446 |
455 Node* ConstructorBuiltinsAssembler::NonEmptyShallowClone( | 447 Node* ConstructorBuiltinsAssembler::NonEmptyShallowClone( |
456 Node* boilerplate, Node* boilerplate_map, Node* boilerplate_elements, | 448 Node* boilerplate, Node* boilerplate_map, Node* boilerplate_elements, |
457 Node* allocation_site, Node* capacity, ElementsKind kind) { | 449 Node* allocation_site, Node* capacity, ElementsKind kind) { |
458 typedef CodeStubAssembler::ParameterMode ParameterMode; | |
459 | |
460 ParameterMode param_mode = OptimalParameterMode(); | 450 ParameterMode param_mode = OptimalParameterMode(); |
461 | 451 |
462 Node* length = LoadJSArrayLength(boilerplate); | 452 Node* length = LoadJSArrayLength(boilerplate); |
463 capacity = TaggedToParameter(capacity, param_mode); | 453 capacity = TaggedToParameter(capacity, param_mode); |
464 | 454 |
465 Node *array, *elements; | 455 Node *array, *elements; |
466 std::tie(array, elements) = AllocateUninitializedJSArrayWithElements( | 456 std::tie(array, elements) = AllocateUninitializedJSArrayWithElements( |
467 kind, boilerplate_map, length, allocation_site, capacity, param_mode); | 457 kind, boilerplate_map, length, allocation_site, capacity, param_mode); |
468 | 458 |
469 Comment("copy elements header"); | 459 Comment("copy elements header"); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 result.Bind(array); | 572 result.Bind(array); |
583 Goto(&return_result); | 573 Goto(&return_result); |
584 } | 574 } |
585 | 575 |
586 Bind(&return_result); | 576 Bind(&return_result); |
587 return result.value(); | 577 return result.value(); |
588 } | 578 } |
589 | 579 |
590 void ConstructorBuiltinsAssembler::CreateFastCloneShallowArrayBuiltin( | 580 void ConstructorBuiltinsAssembler::CreateFastCloneShallowArrayBuiltin( |
591 AllocationSiteMode allocation_site_mode) { | 581 AllocationSiteMode allocation_site_mode) { |
592 typedef compiler::Node Node; | |
593 typedef CodeStubAssembler::Label Label; | |
594 | |
595 Node* closure = Parameter(FastCloneShallowArrayDescriptor::kClosure); | 582 Node* closure = Parameter(FastCloneShallowArrayDescriptor::kClosure); |
596 Node* literal_index = | 583 Node* literal_index = |
597 Parameter(FastCloneShallowArrayDescriptor::kLiteralIndex); | 584 Parameter(FastCloneShallowArrayDescriptor::kLiteralIndex); |
598 Node* constant_elements = | 585 Node* constant_elements = |
599 Parameter(FastCloneShallowArrayDescriptor::kConstantElements); | 586 Parameter(FastCloneShallowArrayDescriptor::kConstantElements); |
600 Node* context = Parameter(FastCloneShallowArrayDescriptor::kContext); | 587 Node* context = Parameter(FastCloneShallowArrayDescriptor::kContext); |
601 Label call_runtime(this, Label::kDeferred); | 588 Label call_runtime(this, Label::kDeferred); |
602 Return(EmitFastCloneShallowArray(closure, literal_index, context, | 589 Return(EmitFastCloneShallowArray(closure, literal_index, context, |
603 &call_runtime, allocation_site_mode)); | 590 &call_runtime, allocation_site_mode)); |
604 | 591 |
(...skipping 11 matching lines...) Expand all Loading... |
616 } | 603 } |
617 | 604 |
618 TF_BUILTIN(FastCloneShallowArrayTrack, ConstructorBuiltinsAssembler) { | 605 TF_BUILTIN(FastCloneShallowArrayTrack, ConstructorBuiltinsAssembler) { |
619 CreateFastCloneShallowArrayBuiltin(TRACK_ALLOCATION_SITE); | 606 CreateFastCloneShallowArrayBuiltin(TRACK_ALLOCATION_SITE); |
620 } | 607 } |
621 | 608 |
622 TF_BUILTIN(FastCloneShallowArrayDontTrack, ConstructorBuiltinsAssembler) { | 609 TF_BUILTIN(FastCloneShallowArrayDontTrack, ConstructorBuiltinsAssembler) { |
623 CreateFastCloneShallowArrayBuiltin(DONT_TRACK_ALLOCATION_SITE); | 610 CreateFastCloneShallowArrayBuiltin(DONT_TRACK_ALLOCATION_SITE); |
624 } | 611 } |
625 | 612 |
626 // static | |
627 int ConstructorBuiltinsAssembler::FastCloneShallowObjectPropertiesCount( | |
628 int literal_length) { | |
629 // This heuristic of setting empty literals to have | |
630 // kInitialGlobalObjectUnusedPropertiesCount must remain in-sync with the | |
631 // runtime. | |
632 // TODO(verwaest): Unify this with the heuristic in the runtime. | |
633 return literal_length == 0 | |
634 ? JSObject::kInitialGlobalObjectUnusedPropertiesCount | |
635 : literal_length; | |
636 } | |
637 | |
638 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( | 613 Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( |
639 Label* call_runtime, Node* closure, Node* literals_index, | 614 Label* call_runtime, Node* closure, Node* literals_index, |
640 Node* properties_count) { | 615 Node* properties_count) { |
641 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); | 616 Node* cell = LoadObjectField(closure, JSFunction::kFeedbackVectorOffset); |
642 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); | 617 Node* feedback_vector = LoadObjectField(cell, Cell::kValueOffset); |
643 Node* allocation_site = LoadFixedArrayElement( | 618 Node* allocation_site = LoadFixedArrayElement( |
644 feedback_vector, literals_index, 0, CodeStubAssembler::SMI_PARAMETERS); | 619 feedback_vector, literals_index, 0, CodeStubAssembler::SMI_PARAMETERS); |
645 GotoIf(IsUndefined(allocation_site), call_runtime); | 620 GotoIf(IsUndefined(allocation_site), call_runtime); |
646 | 621 |
647 // Calculate the object and allocation size based on the properties count. | 622 // Calculate the object and allocation size based on the properties count. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 memento_create_count); | 673 memento_create_count); |
699 } | 674 } |
700 | 675 |
701 // TODO(verwaest): Allocate and fill in double boxes. | 676 // TODO(verwaest): Allocate and fill in double boxes. |
702 return copy; | 677 return copy; |
703 } | 678 } |
704 | 679 |
705 void ConstructorBuiltinsAssembler::CreateFastCloneShallowObjectBuiltin( | 680 void ConstructorBuiltinsAssembler::CreateFastCloneShallowObjectBuiltin( |
706 int properties_count) { | 681 int properties_count) { |
707 DCHECK_GE(properties_count, 0); | 682 DCHECK_GE(properties_count, 0); |
708 DCHECK_LE(properties_count, kMaximumClonedShallowObjectProperties); | 683 DCHECK_LE(properties_count, |
| 684 ConstructorBuiltins::kMaximumClonedShallowObjectProperties); |
709 Label call_runtime(this); | 685 Label call_runtime(this); |
710 Node* closure = Parameter(0); | 686 Node* closure = Parameter(0); |
711 Node* literals_index = Parameter(1); | 687 Node* literals_index = Parameter(1); |
712 | 688 |
713 Node* properties_count_node = | 689 Node* properties_count_node = |
714 IntPtrConstant(FastCloneShallowObjectPropertiesCount(properties_count)); | 690 IntPtrConstant(ConstructorBuiltins::FastCloneShallowObjectPropertiesCount( |
| 691 properties_count)); |
715 Node* copy = EmitFastCloneShallowObject( | 692 Node* copy = EmitFastCloneShallowObject( |
716 &call_runtime, closure, literals_index, properties_count_node); | 693 &call_runtime, closure, literals_index, properties_count_node); |
717 Return(copy); | 694 Return(copy); |
718 | 695 |
719 Bind(&call_runtime); | 696 Bind(&call_runtime); |
720 Node* constant_properties = Parameter(2); | 697 Node* constant_properties = Parameter(2); |
721 Node* flags = Parameter(3); | 698 Node* flags = Parameter(3); |
722 Node* context = Parameter(4); | 699 Node* context = Parameter(4); |
723 TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, | 700 TailCallRuntime(Runtime::kCreateObjectLiteral, context, closure, |
724 literals_index, constant_properties, flags); | 701 literals_index, constant_properties, flags); |
725 } | 702 } |
726 | 703 |
727 #define SHALLOW_OBJECT_BUILTIN(props) \ | 704 #define SHALLOW_OBJECT_BUILTIN(props) \ |
728 TF_BUILTIN(FastCloneShallowObject##props, ConstructorBuiltinsAssembler) { \ | 705 TF_BUILTIN(FastCloneShallowObject##props, ConstructorBuiltinsAssembler) { \ |
729 CreateFastCloneShallowObjectBuiltin(props); \ | 706 CreateFastCloneShallowObjectBuiltin(props); \ |
730 } | 707 } |
731 | 708 |
732 SHALLOW_OBJECT_BUILTIN(0); | 709 SHALLOW_OBJECT_BUILTIN(0); |
733 SHALLOW_OBJECT_BUILTIN(1); | 710 SHALLOW_OBJECT_BUILTIN(1); |
734 SHALLOW_OBJECT_BUILTIN(2); | 711 SHALLOW_OBJECT_BUILTIN(2); |
735 SHALLOW_OBJECT_BUILTIN(3); | 712 SHALLOW_OBJECT_BUILTIN(3); |
736 SHALLOW_OBJECT_BUILTIN(4); | 713 SHALLOW_OBJECT_BUILTIN(4); |
737 SHALLOW_OBJECT_BUILTIN(5); | 714 SHALLOW_OBJECT_BUILTIN(5); |
738 SHALLOW_OBJECT_BUILTIN(6); | 715 SHALLOW_OBJECT_BUILTIN(6); |
739 | 716 |
740 } // namespace internal | 717 } // namespace internal |
741 } // namespace v8 | 718 } // namespace v8 |
OLD | NEW |