OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 __ j(not_zero, &done); | 583 __ j(not_zero, &done); |
584 __ pop(ebx); | 584 __ pop(ebx); |
585 __ push(Immediate(factory->undefined_value())); | 585 __ push(Immediate(factory->undefined_value())); |
586 __ push(ebx); | 586 __ push(ebx); |
587 __ inc(eax); | 587 __ inc(eax); |
588 __ bind(&done); | 588 __ bind(&done); |
589 } | 589 } |
590 | 590 |
591 // 2. Get the function to call (passed as receiver) from the stack, check | 591 // 2. Get the function to call (passed as receiver) from the stack, check |
592 // if it is a function. | 592 // if it is a function. |
593 Label non_function; | 593 Label slow, non_function; |
594 // 1 ~ return address. | 594 // 1 ~ return address. |
595 __ mov(edi, Operand(esp, eax, times_4, 1 * kPointerSize)); | 595 __ mov(edi, Operand(esp, eax, times_4, 1 * kPointerSize)); |
596 __ JumpIfSmi(edi, &non_function); | 596 __ JumpIfSmi(edi, &non_function); |
597 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); | 597 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); |
598 __ j(not_equal, &non_function); | 598 __ j(not_equal, &slow); |
599 | 599 |
600 | 600 |
601 // 3a. Patch the first argument if necessary when calling a function. | 601 // 3a. Patch the first argument if necessary when calling a function. |
602 Label shift_arguments; | 602 Label shift_arguments; |
| 603 __ Set(edx, Immediate(0)); // indicate regular JS_FUNCTION |
603 { Label convert_to_object, use_global_receiver, patch_receiver; | 604 { Label convert_to_object, use_global_receiver, patch_receiver; |
604 // Change context eagerly in case we need the global receiver. | 605 // Change context eagerly in case we need the global receiver. |
605 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 606 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
606 | 607 |
607 // Do not transform the receiver for strict mode functions. | 608 // Do not transform the receiver for strict mode functions. |
608 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 609 __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); |
609 __ test_b(FieldOperand(ebx, SharedFunctionInfo::kStrictModeByteOffset), | 610 __ test_b(FieldOperand(ebx, SharedFunctionInfo::kStrictModeByteOffset), |
610 1 << SharedFunctionInfo::kStrictModeBitWithinByte); | 611 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
611 __ j(not_equal, &shift_arguments); | 612 __ j(not_equal, &shift_arguments); |
612 | 613 |
(...skipping 17 matching lines...) Expand all Loading... |
630 __ j(above_equal, &shift_arguments); | 631 __ j(above_equal, &shift_arguments); |
631 | 632 |
632 __ bind(&convert_to_object); | 633 __ bind(&convert_to_object); |
633 __ EnterInternalFrame(); // In order to preserve argument count. | 634 __ EnterInternalFrame(); // In order to preserve argument count. |
634 __ SmiTag(eax); | 635 __ SmiTag(eax); |
635 __ push(eax); | 636 __ push(eax); |
636 | 637 |
637 __ push(ebx); | 638 __ push(ebx); |
638 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); | 639 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); |
639 __ mov(ebx, eax); | 640 __ mov(ebx, eax); |
| 641 __ Set(edx, Immediate(0)); // restore |
640 | 642 |
641 __ pop(eax); | 643 __ pop(eax); |
642 __ SmiUntag(eax); | 644 __ SmiUntag(eax); |
643 __ LeaveInternalFrame(); | 645 __ LeaveInternalFrame(); |
644 // Restore the function to edi. | 646 // Restore the function to edi. |
645 __ mov(edi, Operand(esp, eax, times_4, 1 * kPointerSize)); | 647 __ mov(edi, Operand(esp, eax, times_4, 1 * kPointerSize)); |
646 __ jmp(&patch_receiver); | 648 __ jmp(&patch_receiver); |
647 | 649 |
648 // Use the global receiver object from the called function as the | 650 // Use the global receiver object from the called function as the |
649 // receiver. | 651 // receiver. |
650 __ bind(&use_global_receiver); | 652 __ bind(&use_global_receiver); |
651 const int kGlobalIndex = | 653 const int kGlobalIndex = |
652 Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize; | 654 Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize; |
653 __ mov(ebx, FieldOperand(esi, kGlobalIndex)); | 655 __ mov(ebx, FieldOperand(esi, kGlobalIndex)); |
654 __ mov(ebx, FieldOperand(ebx, GlobalObject::kGlobalContextOffset)); | 656 __ mov(ebx, FieldOperand(ebx, GlobalObject::kGlobalContextOffset)); |
655 __ mov(ebx, FieldOperand(ebx, kGlobalIndex)); | 657 __ mov(ebx, FieldOperand(ebx, kGlobalIndex)); |
656 __ mov(ebx, FieldOperand(ebx, GlobalObject::kGlobalReceiverOffset)); | 658 __ mov(ebx, FieldOperand(ebx, GlobalObject::kGlobalReceiverOffset)); |
657 | 659 |
658 __ bind(&patch_receiver); | 660 __ bind(&patch_receiver); |
659 __ mov(Operand(esp, eax, times_4, 0), ebx); | 661 __ mov(Operand(esp, eax, times_4, 0), ebx); |
660 | 662 |
661 __ jmp(&shift_arguments); | 663 __ jmp(&shift_arguments); |
662 } | 664 } |
663 | 665 |
664 // 3b. Patch the first argument when calling a non-function. The | 666 // 3b. Check for function proxy. |
| 667 __ bind(&slow); |
| 668 __ Set(edx, Immediate(1)); // indicate function proxy |
| 669 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); |
| 670 __ j(equal, &shift_arguments); |
| 671 __ bind(&non_function); |
| 672 __ Set(edx, Immediate(2)); // indicate non-function |
| 673 |
| 674 // 3c. Patch the first argument when calling a non-function. The |
665 // CALL_NON_FUNCTION builtin expects the non-function callee as | 675 // CALL_NON_FUNCTION builtin expects the non-function callee as |
666 // receiver, so overwrite the first argument which will ultimately | 676 // receiver, so overwrite the first argument which will ultimately |
667 // become the receiver. | 677 // become the receiver. |
668 __ bind(&non_function); | |
669 __ mov(Operand(esp, eax, times_4, 0), edi); | 678 __ mov(Operand(esp, eax, times_4, 0), edi); |
670 // Clear edi to indicate a non-function being called. | |
671 __ Set(edi, Immediate(0)); | |
672 | 679 |
673 // 4. Shift arguments and return address one slot down on the stack | 680 // 4. Shift arguments and return address one slot down on the stack |
674 // (overwriting the original receiver). Adjust argument count to make | 681 // (overwriting the original receiver). Adjust argument count to make |
675 // the original first argument the new receiver. | 682 // the original first argument the new receiver. |
676 __ bind(&shift_arguments); | 683 __ bind(&shift_arguments); |
677 { Label loop; | 684 { Label loop; |
678 __ mov(ecx, eax); | 685 __ mov(ecx, eax); |
679 __ bind(&loop); | 686 __ bind(&loop); |
680 __ mov(ebx, Operand(esp, ecx, times_4, 0)); | 687 __ mov(ebx, Operand(esp, ecx, times_4, 0)); |
681 __ mov(Operand(esp, ecx, times_4, kPointerSize), ebx); | 688 __ mov(Operand(esp, ecx, times_4, kPointerSize), ebx); |
682 __ dec(ecx); | 689 __ dec(ecx); |
683 __ j(not_sign, &loop); // While non-negative (to copy return address). | 690 __ j(not_sign, &loop); // While non-negative (to copy return address). |
684 __ pop(ebx); // Discard copy of return address. | 691 __ pop(ebx); // Discard copy of return address. |
685 __ dec(eax); // One fewer argument (first argument is new receiver). | 692 __ dec(eax); // One fewer argument (first argument is new receiver). |
686 } | 693 } |
687 | 694 |
688 // 5a. Call non-function via tail call to CALL_NON_FUNCTION builtin. | 695 // 5a. Call non-function via tail call to CALL_NON_FUNCTION builtin, |
689 { Label function; | 696 // or a function proxy via CALL_FUNCTION_PROXY. |
690 __ test(edi, Operand(edi)); | 697 { Label function, non_proxy; |
691 __ j(not_zero, &function); | 698 __ test(edx, Operand(edx)); |
| 699 __ j(zero, &function); |
692 __ Set(ebx, Immediate(0)); | 700 __ Set(ebx, Immediate(0)); |
| 701 __ SetCallKind(ecx, CALL_AS_METHOD); |
| 702 __ cmp(Operand(edx), Immediate(1)); |
| 703 __ j(not_equal, &non_proxy); |
| 704 |
| 705 __ pop(edx); // return address |
| 706 __ push(edi); // re-add proxy object as additional argument |
| 707 __ push(edx); |
| 708 __ inc(eax); |
| 709 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY); |
| 710 __ jmp(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
| 711 RelocInfo::CODE_TARGET); |
| 712 |
| 713 __ bind(&non_proxy); |
693 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); | 714 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); |
694 __ SetCallKind(ecx, CALL_AS_METHOD); | |
695 __ jmp(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), | 715 __ jmp(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
696 RelocInfo::CODE_TARGET); | 716 RelocInfo::CODE_TARGET); |
697 __ bind(&function); | 717 __ bind(&function); |
698 } | 718 } |
699 | 719 |
700 // 5b. Get the code to call from the function and check that the number of | 720 // 5b. Get the code to call from the function and check that the number of |
701 // expected arguments matches what we're providing. If so, jump | 721 // expected arguments matches what we're providing. If so, jump |
702 // (tail-call) to the code in register edx without checking arguments. | 722 // (tail-call) to the code in register edx without checking arguments. |
703 __ mov(edx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 723 __ mov(edx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); |
704 __ mov(ebx, | 724 __ mov(ebx, |
705 FieldOperand(edx, SharedFunctionInfo::kFormalParameterCountOffset)); | 725 FieldOperand(edx, SharedFunctionInfo::kFormalParameterCountOffset)); |
706 __ mov(edx, FieldOperand(edi, JSFunction::kCodeEntryOffset)); | 726 __ mov(edx, FieldOperand(edi, JSFunction::kCodeEntryOffset)); |
707 __ SmiUntag(ebx); | 727 __ SmiUntag(ebx); |
708 __ SetCallKind(ecx, CALL_AS_METHOD); | 728 __ SetCallKind(ecx, CALL_AS_METHOD); |
709 __ cmp(eax, Operand(ebx)); | 729 __ cmp(eax, Operand(ebx)); |
710 __ j(not_equal, | 730 __ j(not_equal, |
711 masm->isolate()->builtins()->ArgumentsAdaptorTrampoline()); | 731 masm->isolate()->builtins()->ArgumentsAdaptorTrampoline()); |
712 | 732 |
713 ParameterCount expected(0); | 733 ParameterCount expected(0); |
714 __ InvokeCode(Operand(edx), expected, expected, JUMP_FUNCTION, | 734 __ InvokeCode(Operand(edx), expected, expected, JUMP_FUNCTION, |
715 NullCallWrapper(), CALL_AS_METHOD); | 735 NullCallWrapper(), CALL_AS_METHOD); |
716 } | 736 } |
717 | 737 |
718 | 738 |
719 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { | 739 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { |
| 740 static const int kArgumentsOffset = 2 * kPointerSize; |
| 741 static const int kReceiverOffset = 3 * kPointerSize; |
| 742 static const int kFunctionOffset = 4 * kPointerSize; |
| 743 |
720 __ EnterInternalFrame(); | 744 __ EnterInternalFrame(); |
721 | 745 |
722 __ push(Operand(ebp, 4 * kPointerSize)); // push this | 746 __ push(Operand(ebp, kFunctionOffset)); // push this |
723 __ push(Operand(ebp, 2 * kPointerSize)); // push arguments | 747 __ push(Operand(ebp, kArgumentsOffset)); // push arguments |
724 __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); | 748 __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); |
725 | 749 |
726 // Check the stack for overflow. We are not trying need to catch | 750 // Check the stack for overflow. We are not trying to catch |
727 // interruptions (e.g. debug break and preemption) here, so the "real stack | 751 // interruptions (e.g. debug break and preemption) here, so the "real stack |
728 // limit" is checked. | 752 // limit" is checked. |
729 Label okay; | 753 Label okay; |
730 ExternalReference real_stack_limit = | 754 ExternalReference real_stack_limit = |
731 ExternalReference::address_of_real_stack_limit(masm->isolate()); | 755 ExternalReference::address_of_real_stack_limit(masm->isolate()); |
732 __ mov(edi, Operand::StaticVariable(real_stack_limit)); | 756 __ mov(edi, Operand::StaticVariable(real_stack_limit)); |
733 // Make ecx the space we have left. The stack might already be overflowed | 757 // Make ecx the space we have left. The stack might already be overflowed |
734 // here which will cause ecx to become negative. | 758 // here which will cause ecx to become negative. |
735 __ mov(ecx, Operand(esp)); | 759 __ mov(ecx, Operand(esp)); |
736 __ sub(ecx, Operand(edi)); | 760 __ sub(ecx, Operand(edi)); |
(...skipping 12 matching lines...) Expand all Loading... |
749 __ bind(&okay); | 773 __ bind(&okay); |
750 // End of stack check. | 774 // End of stack check. |
751 | 775 |
752 // Push current index and limit. | 776 // Push current index and limit. |
753 const int kLimitOffset = | 777 const int kLimitOffset = |
754 StandardFrameConstants::kExpressionsOffset - 1 * kPointerSize; | 778 StandardFrameConstants::kExpressionsOffset - 1 * kPointerSize; |
755 const int kIndexOffset = kLimitOffset - 1 * kPointerSize; | 779 const int kIndexOffset = kLimitOffset - 1 * kPointerSize; |
756 __ push(eax); // limit | 780 __ push(eax); // limit |
757 __ push(Immediate(0)); // index | 781 __ push(Immediate(0)); // index |
758 | 782 |
759 // Change context eagerly to get the right global object if | 783 // Get the receiver. |
760 // necessary. | 784 __ mov(ebx, Operand(ebp, kReceiverOffset)); |
761 __ mov(edi, Operand(ebp, 4 * kPointerSize)); | 785 |
| 786 // Check that the function is a JS function (otherwise it must be a proxy). |
| 787 Label push_receiver; |
| 788 __ mov(edi, Operand(ebp, kFunctionOffset)); |
| 789 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); |
| 790 __ j(not_equal, &push_receiver); |
| 791 |
| 792 // Change context eagerly to get the right global object if necessary. |
762 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 793 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
763 | 794 |
764 // Compute the receiver. | 795 // Compute the receiver. |
765 Label call_to_object, use_global_receiver, push_receiver; | |
766 __ mov(ebx, Operand(ebp, 3 * kPointerSize)); | |
767 | |
768 // Do not transform the receiver for strict mode functions. | 796 // Do not transform the receiver for strict mode functions. |
| 797 Label call_to_object, use_global_receiver; |
769 __ mov(ecx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); | 798 __ mov(ecx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset)); |
770 __ test_b(FieldOperand(ecx, SharedFunctionInfo::kStrictModeByteOffset), | 799 __ test_b(FieldOperand(ecx, SharedFunctionInfo::kStrictModeByteOffset), |
771 1 << SharedFunctionInfo::kStrictModeBitWithinByte); | 800 1 << SharedFunctionInfo::kStrictModeBitWithinByte); |
772 __ j(not_equal, &push_receiver); | 801 __ j(not_equal, &push_receiver); |
773 | 802 |
774 Factory* factory = masm->isolate()->factory(); | 803 Factory* factory = masm->isolate()->factory(); |
775 | 804 |
776 // Do not transform the receiver for natives (shared already in ecx). | 805 // Do not transform the receiver for natives (shared already in ecx). |
777 __ test_b(FieldOperand(ecx, SharedFunctionInfo::kNativeByteOffset), | 806 __ test_b(FieldOperand(ecx, SharedFunctionInfo::kNativeByteOffset), |
778 1 << SharedFunctionInfo::kNativeBitWithinByte); | 807 1 << SharedFunctionInfo::kNativeBitWithinByte); |
(...skipping 28 matching lines...) Expand all Loading... |
807 | 836 |
808 // Push the receiver. | 837 // Push the receiver. |
809 __ bind(&push_receiver); | 838 __ bind(&push_receiver); |
810 __ push(ebx); | 839 __ push(ebx); |
811 | 840 |
812 // Copy all arguments from the array to the stack. | 841 // Copy all arguments from the array to the stack. |
813 Label entry, loop; | 842 Label entry, loop; |
814 __ mov(eax, Operand(ebp, kIndexOffset)); | 843 __ mov(eax, Operand(ebp, kIndexOffset)); |
815 __ jmp(&entry); | 844 __ jmp(&entry); |
816 __ bind(&loop); | 845 __ bind(&loop); |
817 __ mov(edx, Operand(ebp, 2 * kPointerSize)); // load arguments | 846 __ mov(edx, Operand(ebp, kArgumentsOffset)); // load arguments |
818 | 847 |
819 // Use inline caching to speed up access to arguments. | 848 // Use inline caching to speed up access to arguments. |
820 Handle<Code> ic = masm->isolate()->builtins()->KeyedLoadIC_Initialize(); | 849 Handle<Code> ic = masm->isolate()->builtins()->KeyedLoadIC_Initialize(); |
821 __ call(ic, RelocInfo::CODE_TARGET); | 850 __ call(ic, RelocInfo::CODE_TARGET); |
822 // It is important that we do not have a test instruction after the | 851 // It is important that we do not have a test instruction after the |
823 // call. A test instruction after the call is used to indicate that | 852 // call. A test instruction after the call is used to indicate that |
824 // we have generated an inline version of the keyed load. In this | 853 // we have generated an inline version of the keyed load. In this |
825 // case, we know that we are not generating a test instruction next. | 854 // case, we know that we are not generating a test instruction next. |
826 | 855 |
827 // Push the nth argument. | 856 // Push the nth argument. |
828 __ push(eax); | 857 __ push(eax); |
829 | 858 |
830 // Update the index on the stack and in register eax. | 859 // Update the index on the stack and in register eax. |
831 __ mov(eax, Operand(ebp, kIndexOffset)); | 860 __ mov(eax, Operand(ebp, kIndexOffset)); |
832 __ add(Operand(eax), Immediate(1 << kSmiTagSize)); | 861 __ add(Operand(eax), Immediate(1 << kSmiTagSize)); |
833 __ mov(Operand(ebp, kIndexOffset), eax); | 862 __ mov(Operand(ebp, kIndexOffset), eax); |
834 | 863 |
835 __ bind(&entry); | 864 __ bind(&entry); |
836 __ cmp(eax, Operand(ebp, kLimitOffset)); | 865 __ cmp(eax, Operand(ebp, kLimitOffset)); |
837 __ j(not_equal, &loop); | 866 __ j(not_equal, &loop); |
838 | 867 |
839 // Invoke the function. | 868 // Invoke the function. |
| 869 Label call_proxy; |
840 ParameterCount actual(eax); | 870 ParameterCount actual(eax); |
841 __ SmiUntag(eax); | 871 __ SmiUntag(eax); |
842 __ mov(edi, Operand(ebp, 4 * kPointerSize)); | 872 __ mov(edi, Operand(ebp, kFunctionOffset)); |
| 873 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); |
| 874 __ j(not_equal, &call_proxy); |
843 __ InvokeFunction(edi, actual, CALL_FUNCTION, | 875 __ InvokeFunction(edi, actual, CALL_FUNCTION, |
844 NullCallWrapper(), CALL_AS_METHOD); | 876 NullCallWrapper(), CALL_AS_METHOD); |
845 | 877 |
846 __ LeaveInternalFrame(); | 878 __ LeaveInternalFrame(); |
847 __ ret(3 * kPointerSize); // remove this, receiver, and arguments | 879 __ ret(3 * kPointerSize); // remove this, receiver, and arguments |
| 880 |
| 881 // Invoke the function proxy. |
| 882 __ bind(&call_proxy); |
| 883 __ push(edi); // add function proxy as last argument |
| 884 __ inc(eax); |
| 885 __ Set(ebx, Immediate(0)); |
| 886 __ SetCallKind(ecx, CALL_AS_METHOD); |
| 887 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY); |
| 888 __ call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
| 889 RelocInfo::CODE_TARGET); |
| 890 |
| 891 __ LeaveInternalFrame(); |
| 892 __ ret(3 * kPointerSize); // remove this, receiver, and arguments |
848 } | 893 } |
849 | 894 |
850 | 895 |
851 // Number of empty elements to allocate for an empty array. | 896 // Number of empty elements to allocate for an empty array. |
852 static const int kPreallocatedArrayElements = 4; | 897 static const int kPreallocatedArrayElements = 4; |
853 | 898 |
854 | 899 |
855 // Allocate an empty JSArray. The allocated array is put into the result | 900 // Allocate an empty JSArray. The allocated array is put into the result |
856 // register. If the parameter initial_capacity is larger than zero an elements | 901 // register. If the parameter initial_capacity is larger than zero an elements |
857 // backing store is allocated with this size and filled with the hole values. | 902 // backing store is allocated with this size and filled with the hole values. |
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1607 Deoptimizer::EntryGenerator generator(masm, Deoptimizer::OSR); | 1652 Deoptimizer::EntryGenerator generator(masm, Deoptimizer::OSR); |
1608 generator.Generate(); | 1653 generator.Generate(); |
1609 } | 1654 } |
1610 | 1655 |
1611 | 1656 |
1612 #undef __ | 1657 #undef __ |
1613 } | 1658 } |
1614 } // namespace v8::internal | 1659 } // namespace v8::internal |
1615 | 1660 |
1616 #endif // V8_TARGET_ARCH_IA32 | 1661 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |