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 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 Code* code = masm->isolate()->builtins()->builtin( | 761 Code* code = masm->isolate()->builtins()->builtin( |
762 Builtins::kKeyedLoadIC_MissForceGeneric); | 762 Builtins::kKeyedLoadIC_MissForceGeneric); |
763 Handle<Code> ic(code); | 763 Handle<Code> ic(code); |
764 __ Jump(ic, RelocInfo::CODE_TARGET); | 764 __ Jump(ic, RelocInfo::CODE_TARGET); |
765 } | 765 } |
766 | 766 |
767 | 767 |
768 // Both name_reg and receiver_reg are preserved on jumps to miss_label, | 768 // Both name_reg and receiver_reg are preserved on jumps to miss_label, |
769 // but may be destroyed if store is successful. | 769 // but may be destroyed if store is successful. |
770 void StubCompiler::GenerateStoreField(MacroAssembler* masm, | 770 void StubCompiler::GenerateStoreField(MacroAssembler* masm, |
771 JSObject* object, | 771 Handle<JSObject> object, |
772 int index, | 772 int index, |
773 Map* transition, | 773 Handle<Map> transition, |
774 Register receiver_reg, | 774 Register receiver_reg, |
775 Register name_reg, | 775 Register name_reg, |
776 Register scratch, | 776 Register scratch, |
777 Label* miss_label) { | 777 Label* miss_label) { |
778 // Check that the object isn't a smi. | 778 // Check that the object isn't a smi. |
779 __ JumpIfSmi(receiver_reg, miss_label); | 779 __ JumpIfSmi(receiver_reg, miss_label); |
780 | 780 |
781 // Check that the map of the object hasn't changed. | 781 // Check that the map of the object hasn't changed. |
782 __ Cmp(FieldOperand(receiver_reg, HeapObject::kMapOffset), | 782 __ Cmp(FieldOperand(receiver_reg, HeapObject::kMapOffset), |
783 Handle<Map>(object->map())); | 783 Handle<Map>(object->map())); |
784 __ j(not_equal, miss_label); | 784 __ j(not_equal, miss_label); |
785 | 785 |
786 // Perform global security token check if needed. | 786 // Perform global security token check if needed. |
787 if (object->IsJSGlobalProxy()) { | 787 if (object->IsJSGlobalProxy()) { |
788 __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label); | 788 __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label); |
789 } | 789 } |
790 | 790 |
791 // Stub never generated for non-global objects that require access | 791 // Stub never generated for non-global objects that require access |
792 // checks. | 792 // checks. |
793 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); | 793 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); |
794 | 794 |
795 // Perform map transition for the receiver if necessary. | 795 // Perform map transition for the receiver if necessary. |
796 if ((transition != NULL) && (object->map()->unused_property_fields() == 0)) { | 796 if (!transition.is_null() && (object->map()->unused_property_fields() == 0)) { |
797 // The properties must be extended before we can store the value. | 797 // The properties must be extended before we can store the value. |
798 // We jump to a runtime call that extends the properties array. | 798 // We jump to a runtime call that extends the properties array. |
799 __ pop(scratch); // Return address. | 799 __ pop(scratch); // Return address. |
800 __ push(receiver_reg); | 800 __ push(receiver_reg); |
801 __ Push(Handle<Map>(transition)); | 801 __ Push(transition); |
802 __ push(rax); | 802 __ push(rax); |
803 __ push(scratch); | 803 __ push(scratch); |
804 __ TailCallExternalReference( | 804 __ TailCallExternalReference( |
805 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), | 805 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), |
806 masm->isolate()), | 806 masm->isolate()), |
807 3, | 807 3, |
808 1); | 808 1); |
809 return; | 809 return; |
810 } | 810 } |
811 | 811 |
812 if (transition != NULL) { | 812 if (!transition.is_null()) { |
813 // Update the map of the object; no write barrier updating is | 813 // Update the map of the object; no write barrier updating is |
814 // needed because the map is never in new space. | 814 // needed because the map is never in new space. |
815 __ Move(FieldOperand(receiver_reg, HeapObject::kMapOffset), | 815 __ Move(FieldOperand(receiver_reg, HeapObject::kMapOffset), transition); |
816 Handle<Map>(transition)); | |
817 } | 816 } |
818 | 817 |
819 // Adjust for the number of properties stored in the object. Even in the | 818 // Adjust for the number of properties stored in the object. Even in the |
820 // face of a transition we can use the old map here because the size of the | 819 // face of a transition we can use the old map here because the size of the |
821 // object and the number of in-object properties is not going to change. | 820 // object and the number of in-object properties is not going to change. |
822 index -= object->map()->inobject_properties(); | 821 index -= object->map()->inobject_properties(); |
823 | 822 |
824 if (index < 0) { | 823 if (index < 0) { |
825 // Set the property straight into the object. | 824 // Set the property straight into the object. |
826 int offset = object->map()->instance_size() + (index * kPointerSize); | 825 int offset = object->map()->instance_size() + (index * kPointerSize); |
(...skipping 1735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2562 __ bind(&miss); | 2561 __ bind(&miss); |
2563 __ IncrementCounter(counters->call_global_inline_miss(), 1); | 2562 __ IncrementCounter(counters->call_global_inline_miss(), 1); |
2564 MaybeObject* maybe_result = TryGenerateMissBranch(); | 2563 MaybeObject* maybe_result = TryGenerateMissBranch(); |
2565 if (maybe_result->IsFailure()) return maybe_result; | 2564 if (maybe_result->IsFailure()) return maybe_result; |
2566 | 2565 |
2567 // Return the generated code. | 2566 // Return the generated code. |
2568 return TryGetCode(NORMAL, name); | 2567 return TryGetCode(NORMAL, name); |
2569 } | 2568 } |
2570 | 2569 |
2571 | 2570 |
2572 MaybeObject* StoreStubCompiler::CompileStoreField(JSObject* object, | 2571 Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
2573 int index, | 2572 int index, |
2574 Map* transition, | 2573 Handle<Map> transition, |
2575 String* name) { | 2574 Handle<String> name) { |
2576 // ----------- S t a t e ------------- | 2575 // ----------- S t a t e ------------- |
2577 // -- rax : value | 2576 // -- rax : value |
2578 // -- rcx : name | 2577 // -- rcx : name |
2579 // -- rdx : receiver | 2578 // -- rdx : receiver |
2580 // -- rsp[0] : return address | 2579 // -- rsp[0] : return address |
2581 // ----------------------------------- | 2580 // ----------------------------------- |
2582 Label miss; | 2581 Label miss; |
2583 | 2582 |
2584 // Generate store field code. Preserves receiver and name on jump to miss. | 2583 // Generate store field code. Preserves receiver and name on jump to miss. |
2585 GenerateStoreField(masm(), | 2584 GenerateStoreField(masm(), object, index, transition, rdx, rcx, rbx, &miss); |
2586 object, | |
2587 index, | |
2588 transition, | |
2589 rdx, rcx, rbx, | |
2590 &miss); | |
2591 | 2585 |
2592 // Handle store cache miss. | 2586 // Handle store cache miss. |
2593 __ bind(&miss); | 2587 __ bind(&miss); |
2594 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2588 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2595 __ Jump(ic, RelocInfo::CODE_TARGET); | 2589 __ Jump(ic, RelocInfo::CODE_TARGET); |
2596 | 2590 |
2597 // Return the generated code. | 2591 // Return the generated code. |
2598 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name); | 2592 return GetCode(transition.is_null() ? FIELD : MAP_TRANSITION, name); |
2599 } | 2593 } |
2600 | 2594 |
2601 | 2595 |
2602 MaybeObject* StoreStubCompiler::CompileStoreCallback(JSObject* object, | 2596 MaybeObject* StoreStubCompiler::CompileStoreCallback(JSObject* object, |
2603 AccessorInfo* callback, | 2597 AccessorInfo* callback, |
2604 String* name) { | 2598 String* name) { |
2605 // ----------- S t a t e ------------- | 2599 // ----------- S t a t e ------------- |
2606 // -- rax : value | 2600 // -- rax : value |
2607 // -- rcx : name | 2601 // -- rcx : name |
2608 // -- rdx : receiver | 2602 // -- rdx : receiver |
(...skipping 29 matching lines...) Expand all Loading... |
2638 ExternalReference store_callback_property = | 2632 ExternalReference store_callback_property = |
2639 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); | 2633 ExternalReference(IC_Utility(IC::kStoreCallbackProperty), isolate()); |
2640 __ TailCallExternalReference(store_callback_property, 4, 1); | 2634 __ TailCallExternalReference(store_callback_property, 4, 1); |
2641 | 2635 |
2642 // Handle store cache miss. | 2636 // Handle store cache miss. |
2643 __ bind(&miss); | 2637 __ bind(&miss); |
2644 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2638 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2645 __ Jump(ic, RelocInfo::CODE_TARGET); | 2639 __ Jump(ic, RelocInfo::CODE_TARGET); |
2646 | 2640 |
2647 // Return the generated code. | 2641 // Return the generated code. |
2648 return GetCode(CALLBACKS, name); | 2642 return TryGetCode(CALLBACKS, name); |
2649 } | 2643 } |
2650 | 2644 |
2651 | 2645 |
2652 MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, | 2646 MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, |
2653 String* name) { | 2647 String* name) { |
2654 // ----------- S t a t e ------------- | 2648 // ----------- S t a t e ------------- |
2655 // -- rax : value | 2649 // -- rax : value |
2656 // -- rcx : name | 2650 // -- rcx : name |
2657 // -- rdx : receiver | 2651 // -- rdx : receiver |
2658 // -- rsp[0] : return address | 2652 // -- rsp[0] : return address |
(...skipping 28 matching lines...) Expand all Loading... |
2687 ExternalReference store_ic_property = | 2681 ExternalReference store_ic_property = |
2688 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); | 2682 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty), isolate()); |
2689 __ TailCallExternalReference(store_ic_property, 4, 1); | 2683 __ TailCallExternalReference(store_ic_property, 4, 1); |
2690 | 2684 |
2691 // Handle store cache miss. | 2685 // Handle store cache miss. |
2692 __ bind(&miss); | 2686 __ bind(&miss); |
2693 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2687 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2694 __ Jump(ic, RelocInfo::CODE_TARGET); | 2688 __ Jump(ic, RelocInfo::CODE_TARGET); |
2695 | 2689 |
2696 // Return the generated code. | 2690 // Return the generated code. |
2697 return GetCode(INTERCEPTOR, name); | 2691 return TryGetCode(INTERCEPTOR, name); |
2698 } | 2692 } |
2699 | 2693 |
2700 | 2694 |
2701 MaybeObject* StoreStubCompiler::CompileStoreGlobal(GlobalObject* object, | 2695 Handle<Code> StoreStubCompiler::CompileStoreGlobal( |
2702 JSGlobalPropertyCell* cell, | 2696 Handle<GlobalObject> object, |
2703 String* name) { | 2697 Handle<JSGlobalPropertyCell> cell, |
| 2698 Handle<String> name) { |
2704 // ----------- S t a t e ------------- | 2699 // ----------- S t a t e ------------- |
2705 // -- rax : value | 2700 // -- rax : value |
2706 // -- rcx : name | 2701 // -- rcx : name |
2707 // -- rdx : receiver | 2702 // -- rdx : receiver |
2708 // -- rsp[0] : return address | 2703 // -- rsp[0] : return address |
2709 // ----------------------------------- | 2704 // ----------------------------------- |
2710 Label miss; | 2705 Label miss; |
2711 | 2706 |
2712 // Check that the map of the global has not changed. | 2707 // Check that the map of the global has not changed. |
2713 __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset), | 2708 __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset), |
2714 Handle<Map>(object->map())); | 2709 Handle<Map>(object->map())); |
2715 __ j(not_equal, &miss); | 2710 __ j(not_equal, &miss); |
2716 | 2711 |
2717 // Compute the cell operand to use. | 2712 // Compute the cell operand to use. |
2718 __ Move(rbx, Handle<JSGlobalPropertyCell>(cell)); | 2713 __ Move(rbx, cell); |
2719 Operand cell_operand = FieldOperand(rbx, JSGlobalPropertyCell::kValueOffset); | 2714 Operand cell_operand = FieldOperand(rbx, JSGlobalPropertyCell::kValueOffset); |
2720 | 2715 |
2721 // Check that the value in the cell is not the hole. If it is, this | 2716 // Check that the value in the cell is not the hole. If it is, this |
2722 // cell could have been deleted and reintroducing the global needs | 2717 // cell could have been deleted and reintroducing the global needs |
2723 // to update the property details in the property dictionary of the | 2718 // to update the property details in the property dictionary of the |
2724 // global object. We bail out to the runtime system to do that. | 2719 // global object. We bail out to the runtime system to do that. |
2725 __ CompareRoot(cell_operand, Heap::kTheHoleValueRootIndex); | 2720 __ CompareRoot(cell_operand, Heap::kTheHoleValueRootIndex); |
2726 __ j(equal, &miss); | 2721 __ j(equal, &miss); |
2727 | 2722 |
2728 // Store the value in the cell. | 2723 // Store the value in the cell. |
(...skipping 23 matching lines...) Expand all Loading... |
2752 __ bind(&miss); | 2747 __ bind(&miss); |
2753 __ IncrementCounter(counters->named_store_global_inline_miss(), 1); | 2748 __ IncrementCounter(counters->named_store_global_inline_miss(), 1); |
2754 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); | 2749 Handle<Code> ic = isolate()->builtins()->StoreIC_Miss(); |
2755 __ Jump(ic, RelocInfo::CODE_TARGET); | 2750 __ Jump(ic, RelocInfo::CODE_TARGET); |
2756 | 2751 |
2757 // Return the generated code. | 2752 // Return the generated code. |
2758 return GetCode(NORMAL, name); | 2753 return GetCode(NORMAL, name); |
2759 } | 2754 } |
2760 | 2755 |
2761 | 2756 |
2762 MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, | 2757 Handle<Code> KeyedStoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
2763 int index, | 2758 int index, |
2764 Map* transition, | 2759 Handle<Map> transition, |
2765 String* name) { | 2760 Handle<String> name) { |
2766 // ----------- S t a t e ------------- | 2761 // ----------- S t a t e ------------- |
2767 // -- rax : value | 2762 // -- rax : value |
2768 // -- rcx : key | 2763 // -- rcx : key |
2769 // -- rdx : receiver | 2764 // -- rdx : receiver |
2770 // -- rsp[0] : return address | 2765 // -- rsp[0] : return address |
2771 // ----------------------------------- | 2766 // ----------------------------------- |
2772 Label miss; | 2767 Label miss; |
2773 | 2768 |
2774 Counters* counters = isolate()->counters(); | 2769 Counters* counters = isolate()->counters(); |
2775 __ IncrementCounter(counters->keyed_store_field(), 1); | 2770 __ IncrementCounter(counters->keyed_store_field(), 1); |
2776 | 2771 |
2777 // Check that the name has not changed. | 2772 // Check that the name has not changed. |
2778 __ Cmp(rcx, Handle<String>(name)); | 2773 __ Cmp(rcx, name); |
2779 __ j(not_equal, &miss); | 2774 __ j(not_equal, &miss); |
2780 | 2775 |
2781 // Generate store field code. Preserves receiver and name on jump to miss. | 2776 // Generate store field code. Preserves receiver and name on jump to miss. |
2782 GenerateStoreField(masm(), | 2777 GenerateStoreField(masm(), object, index, transition, rdx, rcx, rbx, &miss); |
2783 object, | |
2784 index, | |
2785 transition, | |
2786 rdx, rcx, rbx, | |
2787 &miss); | |
2788 | 2778 |
2789 // Handle store cache miss. | 2779 // Handle store cache miss. |
2790 __ bind(&miss); | 2780 __ bind(&miss); |
2791 __ DecrementCounter(counters->keyed_store_field(), 1); | 2781 __ DecrementCounter(counters->keyed_store_field(), 1); |
2792 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2782 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2793 __ Jump(ic, RelocInfo::CODE_TARGET); | 2783 __ Jump(ic, RelocInfo::CODE_TARGET); |
2794 | 2784 |
2795 // Return the generated code. | 2785 // Return the generated code. |
2796 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION, name); | 2786 return GetCode(transition.is_null() ? FIELD : MAP_TRANSITION, name); |
2797 } | 2787 } |
2798 | 2788 |
2799 | 2789 |
2800 MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { | 2790 Handle<Code> KeyedStoreStubCompiler::CompileStoreElement( |
| 2791 Handle<Map> receiver_map) { |
2801 // ----------- S t a t e ------------- | 2792 // ----------- S t a t e ------------- |
2802 // -- rax : value | 2793 // -- rax : value |
2803 // -- rcx : key | 2794 // -- rcx : key |
2804 // -- rdx : receiver | 2795 // -- rdx : receiver |
2805 // -- rsp[0] : return address | 2796 // -- rsp[0] : return address |
2806 // ----------------------------------- | 2797 // ----------------------------------- |
2807 Code* stub; | 2798 |
2808 ElementsKind elements_kind = receiver_map->elements_kind(); | 2799 ElementsKind elements_kind = receiver_map->elements_kind(); |
2809 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; | 2800 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
2810 MaybeObject* maybe_stub = | 2801 Handle<Code> stub = |
2811 KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode(); | 2802 KeyedStoreElementStub(is_js_array, elements_kind).GetCode(); |
2812 if (!maybe_stub->To(&stub)) return maybe_stub; | 2803 |
2813 __ DispatchMap(rdx, | 2804 __ DispatchMap(rdx, receiver_map, stub, DO_SMI_CHECK); |
2814 Handle<Map>(receiver_map), | |
2815 Handle<Code>(stub), | |
2816 DO_SMI_CHECK); | |
2817 | 2805 |
2818 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2806 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2819 __ jmp(ic, RelocInfo::CODE_TARGET); | 2807 __ jmp(ic, RelocInfo::CODE_TARGET); |
2820 | 2808 |
2821 // Return the generated code. | 2809 // Return the generated code. |
2822 return GetCode(NORMAL, NULL); | 2810 return GetCode(NORMAL, factory()->empty_string()); |
2823 } | 2811 } |
2824 | 2812 |
2825 | 2813 |
2826 MaybeObject* KeyedStoreStubCompiler::CompileStorePolymorphic( | 2814 Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic( |
2827 MapList* receiver_maps, | 2815 MapHandleList* receiver_maps, |
2828 CodeList* handler_stubs, | 2816 CodeHandleList* handler_stubs, |
2829 MapList* transitioned_maps) { | 2817 MapHandleList* transitioned_maps) { |
2830 // ----------- S t a t e ------------- | 2818 // ----------- S t a t e ------------- |
2831 // -- rax : value | 2819 // -- rax : value |
2832 // -- rcx : key | 2820 // -- rcx : key |
2833 // -- rdx : receiver | 2821 // -- rdx : receiver |
2834 // -- rsp[0] : return address | 2822 // -- rsp[0] : return address |
2835 // ----------------------------------- | 2823 // ----------------------------------- |
2836 Label miss; | 2824 Label miss; |
2837 __ JumpIfSmi(rdx, &miss, Label::kNear); | 2825 __ JumpIfSmi(rdx, &miss, Label::kNear); |
2838 | 2826 |
2839 __ movq(rdi, FieldOperand(rdx, HeapObject::kMapOffset)); | 2827 __ movq(rdi, FieldOperand(rdx, HeapObject::kMapOffset)); |
2840 int receiver_count = receiver_maps->length(); | 2828 int receiver_count = receiver_maps->length(); |
2841 for (int i = 0; i < receiver_count; ++i) { | 2829 for (int i = 0; i < receiver_count; ++i) { |
2842 // Check map and tail call if there's a match | 2830 // Check map and tail call if there's a match |
2843 Handle<Map> map(receiver_maps->at(i)); | 2831 __ Cmp(rdi, receiver_maps->at(i)); |
2844 __ Cmp(rdi, map); | 2832 if (transitioned_maps->at(i).is_null()) { |
2845 if (transitioned_maps->at(i) == NULL) { | 2833 __ j(equal, handler_stubs->at(i), RelocInfo::CODE_TARGET); |
2846 __ j(equal, Handle<Code>(handler_stubs->at(i)), RelocInfo::CODE_TARGET); | |
2847 } else { | 2834 } else { |
2848 Label next_map; | 2835 Label next_map; |
2849 __ j(not_equal, &next_map, Label::kNear); | 2836 __ j(not_equal, &next_map, Label::kNear); |
2850 __ movq(rbx, | 2837 __ movq(rbx, transitioned_maps->at(i), RelocInfo::EMBEDDED_OBJECT); |
2851 Handle<Map>(transitioned_maps->at(i)), | 2838 __ jmp(handler_stubs->at(i), RelocInfo::CODE_TARGET); |
2852 RelocInfo::EMBEDDED_OBJECT); | |
2853 __ jmp(Handle<Code>(handler_stubs->at(i)), RelocInfo::CODE_TARGET); | |
2854 __ bind(&next_map); | 2839 __ bind(&next_map); |
2855 } | 2840 } |
2856 } | 2841 } |
2857 | 2842 |
2858 __ bind(&miss); | 2843 __ bind(&miss); |
2859 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); | 2844 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
2860 __ jmp(ic, RelocInfo::CODE_TARGET); | 2845 __ jmp(ic, RelocInfo::CODE_TARGET); |
2861 | 2846 |
2862 // Return the generated code. | 2847 // Return the generated code. |
2863 return GetCode(NORMAL, NULL, MEGAMORPHIC); | 2848 return GetCode(NORMAL, factory()->empty_string(), MEGAMORPHIC); |
2864 } | 2849 } |
2865 | 2850 |
2866 | 2851 |
2867 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name, | 2852 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name, |
2868 Handle<JSObject> object, | 2853 Handle<JSObject> object, |
2869 Handle<JSObject> last) { | 2854 Handle<JSObject> last) { |
2870 // ----------- S t a t e ------------- | 2855 // ----------- S t a t e ------------- |
2871 // -- rax : receiver | 2856 // -- rax : receiver |
2872 // -- rcx : name | 2857 // -- rcx : name |
2873 // -- rsp[0] : return address | 2858 // -- rsp[0] : return address |
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4019 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4004 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); |
4020 __ jmp(ic_miss, RelocInfo::CODE_TARGET); | 4005 __ jmp(ic_miss, RelocInfo::CODE_TARGET); |
4021 } | 4006 } |
4022 | 4007 |
4023 | 4008 |
4024 #undef __ | 4009 #undef __ |
4025 | 4010 |
4026 } } // namespace v8::internal | 4011 } } // namespace v8::internal |
4027 | 4012 |
4028 #endif // V8_TARGET_ARCH_X64 | 4013 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |