OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 __ ldr(dst, FieldMemOperand(src, offset)); | 162 __ ldr(dst, FieldMemOperand(src, offset)); |
163 } else { | 163 } else { |
164 // Calculate the offset into the properties array. | 164 // Calculate the offset into the properties array. |
165 int offset = index * kPointerSize + Array::kHeaderSize; | 165 int offset = index * kPointerSize + Array::kHeaderSize; |
166 __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset)); | 166 __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset)); |
167 __ ldr(dst, FieldMemOperand(dst, offset)); | 167 __ ldr(dst, FieldMemOperand(dst, offset)); |
168 } | 168 } |
169 } | 169 } |
170 | 170 |
171 | 171 |
| 172 void StubCompiler::GenerateLoadField(MacroAssembler* masm, |
| 173 JSObject* object, |
| 174 JSObject* holder, |
| 175 Register receiver, |
| 176 Register scratch1, |
| 177 Register scratch2, |
| 178 int index, |
| 179 Label* miss_label) { |
| 180 // Check that the receiver isn't a smi. |
| 181 __ tst(receiver, Operand(kSmiTagMask)); |
| 182 __ b(eq, miss_label); |
| 183 |
| 184 // Check that the maps haven't changed. |
| 185 Register reg = |
| 186 __ CheckMaps(object, receiver, holder, scratch1, scratch2, miss_label); |
| 187 GenerateFastPropertyLoad(masm, r0, reg, holder, index); |
| 188 __ Ret(); |
| 189 } |
| 190 |
| 191 |
| 192 void StubCompiler::GenerateLoadConstant(MacroAssembler* masm, |
| 193 JSObject* object, |
| 194 JSObject* holder, |
| 195 Register receiver, |
| 196 Register scratch1, |
| 197 Register scratch2, |
| 198 Object* value, |
| 199 Label* miss_label) { |
| 200 // Check that the receiver isn't a smi. |
| 201 __ tst(receiver, Operand(kSmiTagMask)); |
| 202 __ b(eq, miss_label); |
| 203 |
| 204 // Check that the maps haven't changed. |
| 205 Register reg = |
| 206 __ CheckMaps(object, receiver, holder, scratch1, scratch2, miss_label); |
| 207 |
| 208 // Return the constant value. |
| 209 __ mov(r0, Operand(Handle<Object>(value))); |
| 210 __ Ret(); |
| 211 } |
| 212 |
| 213 |
| 214 void StubCompiler::GenerateLoadCallback(MacroAssembler* masm, |
| 215 JSObject* object, |
| 216 JSObject* holder, |
| 217 Register receiver, |
| 218 Register name, |
| 219 Register scratch1, |
| 220 Register scratch2, |
| 221 AccessorInfo* callback, |
| 222 Label* miss_label) { |
| 223 // Check that the receiver isn't a smi. |
| 224 __ tst(receiver, Operand(kSmiTagMask)); |
| 225 __ b(eq, miss_label); |
| 226 |
| 227 // Check that the maps haven't changed. |
| 228 Register reg = |
| 229 __ CheckMaps(object, receiver, holder, scratch1, scratch2, miss_label); |
| 230 |
| 231 // Push the arguments on the JS stack of the caller. |
| 232 __ push(receiver); // receiver |
| 233 __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback data |
| 234 __ push(ip); |
| 235 __ push(name); // name |
| 236 __ push(reg); // holder |
| 237 |
| 238 // Do tail-call to the runtime system. |
| 239 ExternalReference load_callback_property = |
| 240 ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); |
| 241 __ TailCallRuntime(load_callback_property, 4); |
| 242 } |
| 243 |
| 244 |
| 245 void StubCompiler::GenerateLoadInterceptor(MacroAssembler* masm, |
| 246 JSObject* object, |
| 247 JSObject* holder, |
| 248 Register receiver, |
| 249 Register name, |
| 250 Register scratch1, |
| 251 Register scratch2, |
| 252 Label* miss_label) { |
| 253 // Check that the receiver isn't a smi. |
| 254 __ tst(receiver, Operand(kSmiTagMask)); |
| 255 __ b(eq, miss_label); |
| 256 |
| 257 // Check that the maps haven't changed. |
| 258 Register reg = |
| 259 __ CheckMaps(object, receiver, holder, scratch1, scratch2, miss_label); |
| 260 |
| 261 // Push the arguments on the JS stack of the caller. |
| 262 __ push(receiver); // receiver |
| 263 __ push(reg); // holder |
| 264 __ push(name); // name |
| 265 |
| 266 // Do tail-call to the runtime system. |
| 267 ExternalReference load_ic_property = |
| 268 ExternalReference(IC_Utility(IC::kLoadInterceptorProperty)); |
| 269 __ TailCallRuntime(load_ic_property, 3); |
| 270 } |
| 271 |
| 272 |
| 273 void StubCompiler::GenerateLoadArrayLength(MacroAssembler* masm, |
| 274 Register receiver, |
| 275 Register scratch, |
| 276 Label* miss_label) { |
| 277 // Check that the receiver isn't a smi. |
| 278 __ tst(receiver, Operand(kSmiTagMask)); |
| 279 __ b(eq, miss_label); |
| 280 |
| 281 // Check that the object is a JS array. |
| 282 __ ldr(scratch, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
| 283 __ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); |
| 284 __ cmp(scratch, Operand(JS_ARRAY_TYPE)); |
| 285 __ b(ne, miss_label); |
| 286 |
| 287 // Load length directly from the JS array. |
| 288 __ ldr(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| 289 __ Ret(); |
| 290 } |
| 291 |
| 292 |
| 293 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { |
| 294 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); |
| 295 Code* code = NULL; |
| 296 if (kind == Code::LOAD_IC) { |
| 297 code = Builtins::builtin(Builtins::LoadIC_Miss); |
| 298 } else { |
| 299 code = Builtins::builtin(Builtins::KeyedLoadIC_Miss); |
| 300 } |
| 301 |
| 302 Handle<Code> ic(code); |
| 303 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 304 } |
| 305 |
| 306 |
172 #undef __ | 307 #undef __ |
173 | 308 |
174 #define __ masm()-> | 309 #define __ masm()-> |
175 | 310 |
176 | 311 |
177 Object* StubCompiler::CompileLazyCompile(Code::Flags flags) { | 312 Object* StubCompiler::CompileLazyCompile(Code::Flags flags) { |
178 // ----------- S t a t e ------------- | 313 // ----------- S t a t e ------------- |
179 // -- r1: function | 314 // -- r1: function |
180 // -- lr: return address | 315 // -- lr: return address |
181 // ----------------------------------- | 316 // ----------------------------------- |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 // -- r2 : name | 761 // -- r2 : name |
627 // -- lr : return address | 762 // -- lr : return address |
628 // -- [sp] : receiver | 763 // -- [sp] : receiver |
629 // ----------------------------------- | 764 // ----------------------------------- |
630 | 765 |
631 HandleScope scope; | 766 HandleScope scope; |
632 Label miss; | 767 Label miss; |
633 | 768 |
634 __ ldr(r0, MemOperand(sp, 0)); | 769 __ ldr(r0, MemOperand(sp, 0)); |
635 | 770 |
636 // Check that the receiver isn't a smi. | 771 GenerateLoadField(masm(), object, holder, r0, r3, r1, index, &miss); |
637 __ tst(r0, Operand(kSmiTagMask)); | |
638 __ b(eq, &miss); | |
639 | |
640 // Check that the maps haven't changed. | |
641 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); | |
642 GenerateFastPropertyLoad(masm(), r0, reg, holder, index); | |
643 __ Ret(); | |
644 | |
645 // Handle load cache miss. | |
646 __ bind(&miss); | 772 __ bind(&miss); |
647 __ ldr(r0, MemOperand(sp)); // restore receiver | 773 GenerateLoadMiss(masm(), Code::LOAD_IC); |
648 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); | |
649 __ Jump(ic, RelocInfo::CODE_TARGET); | |
650 | 774 |
651 // Return the generated code. | 775 // Return the generated code. |
652 return GetCode(FIELD); | 776 return GetCode(FIELD); |
653 } | 777 } |
654 | 778 |
655 | 779 |
656 Object* LoadStubCompiler::CompileLoadCallback(JSObject* object, | 780 Object* LoadStubCompiler::CompileLoadCallback(JSObject* object, |
657 JSObject* holder, | 781 JSObject* holder, |
658 AccessorInfo* callback) { | 782 AccessorInfo* callback) { |
659 // ----------- S t a t e ------------- | 783 // ----------- S t a t e ------------- |
660 // -- r2 : name | 784 // -- r2 : name |
661 // -- lr : return address | 785 // -- lr : return address |
662 // -- [sp] : receiver | 786 // -- [sp] : receiver |
663 // ----------------------------------- | 787 // ----------------------------------- |
664 | 788 |
665 HandleScope scope; | 789 HandleScope scope; |
666 Label miss; | 790 Label miss; |
667 | 791 |
668 __ ldr(r0, MemOperand(sp, 0)); | 792 __ ldr(r0, MemOperand(sp, 0)); |
669 // Check that the receiver isn't a smi. | 793 GenerateLoadCallback(masm(), object, holder, r0, r2, r3, r1, callback, &miss); |
670 __ tst(r0, Operand(kSmiTagMask)); | |
671 __ b(eq, &miss); | |
672 | |
673 // Check that the maps haven't changed. | |
674 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); | |
675 | |
676 // Push the arguments on the JS stack of the caller. | |
677 __ push(r0); // receiver | |
678 __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback data | |
679 __ push(ip); | |
680 __ push(r2); // name | |
681 __ push(reg); // holder | |
682 | |
683 // Do tail-call to the runtime system. | |
684 ExternalReference load_callback_property = | |
685 ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); | |
686 __ TailCallRuntime(load_callback_property, 4); | |
687 | |
688 // Handle load cache miss. | |
689 __ bind(&miss); | 794 __ bind(&miss); |
690 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); | 795 GenerateLoadMiss(masm(), Code::LOAD_IC); |
691 __ Jump(ic, RelocInfo::CODE_TARGET); | |
692 | 796 |
693 // Return the generated code. | 797 // Return the generated code. |
694 return GetCode(CALLBACKS); | 798 return GetCode(CALLBACKS); |
695 } | 799 } |
696 | 800 |
697 | 801 |
698 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, | 802 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, |
699 JSObject* holder, | 803 JSObject* holder, |
700 Object* value) { | 804 Object* value) { |
701 // ----------- S t a t e ------------- | 805 // ----------- S t a t e ------------- |
702 // -- r2 : name | 806 // -- r2 : name |
703 // -- lr : return address | 807 // -- lr : return address |
704 // -- [sp] : receiver | 808 // -- [sp] : receiver |
705 // ----------------------------------- | 809 // ----------------------------------- |
706 | 810 |
707 HandleScope scope; | 811 HandleScope scope; |
708 Label miss; | 812 Label miss; |
709 | 813 |
710 __ ldr(r0, MemOperand(sp, 0)); | 814 __ ldr(r0, MemOperand(sp, 0)); |
711 // Check that the receiver isn't a smi. | |
712 __ tst(r0, Operand(kSmiTagMask)); | |
713 __ b(eq, &miss); | |
714 | 815 |
715 // Check that the maps haven't changed. | 816 GenerateLoadConstant(masm(), object, holder, r0, r3, r1, value, &miss); |
716 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); | |
717 | |
718 // Return the constant value. | |
719 __ mov(r0, Operand(Handle<Object>(value))); | |
720 __ Ret(); | |
721 | |
722 // Handle load cache miss. | |
723 __ bind(&miss); | 817 __ bind(&miss); |
724 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); | 818 GenerateLoadMiss(masm(), Code::LOAD_IC); |
725 __ Jump(ic, RelocInfo::CODE_TARGET); | |
726 | 819 |
727 // Return the generated code. | 820 // Return the generated code. |
728 return GetCode(CONSTANT_FUNCTION); | 821 return GetCode(CONSTANT_FUNCTION); |
729 } | 822 } |
730 | 823 |
731 | 824 |
732 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object, | 825 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object, |
733 JSObject* holder, | 826 JSObject* holder, |
734 String* name) { | 827 String* name) { |
735 // ----------- S t a t e ------------- | 828 // ----------- S t a t e ------------- |
736 // -- r2 : name | 829 // -- r2 : name |
737 // -- lr : return address | 830 // -- lr : return address |
738 // -- [sp] : receiver | 831 // -- [sp] : receiver |
739 // ----------------------------------- | 832 // ----------------------------------- |
740 | 833 |
741 HandleScope scope; | 834 HandleScope scope; |
742 Label miss; | 835 Label miss; |
743 | 836 |
744 __ ldr(r0, MemOperand(sp, 0)); | 837 __ ldr(r0, MemOperand(sp, 0)); |
745 // Check that the receiver isn't a smi. | |
746 __ tst(r0, Operand(kSmiTagMask)); | |
747 __ b(eq, &miss); | |
748 | 838 |
749 // Check that the maps haven't changed. | 839 GenerateLoadInterceptor(masm(), object, holder, r0, r2, r3, r1, &miss); |
750 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss); | |
751 | |
752 // Push the arguments on the JS stack of the caller. | |
753 __ push(r0); // receiver | |
754 __ push(reg); // holder | |
755 __ push(r2); // name | |
756 | |
757 // Do tail-call to the runtime system. | |
758 ExternalReference load_ic_property = | |
759 ExternalReference(IC_Utility(IC::kLoadInterceptorProperty)); | |
760 __ TailCallRuntime(load_ic_property, 3); | |
761 | |
762 // Handle load cache miss. | |
763 __ bind(&miss); | 840 __ bind(&miss); |
764 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss)); | 841 GenerateLoadMiss(masm(), Code::LOAD_IC); |
765 __ Jump(ic, RelocInfo::CODE_TARGET); | |
766 | 842 |
767 // Return the generated code. | 843 // Return the generated code. |
768 return GetCode(INTERCEPTOR); | 844 return GetCode(INTERCEPTOR); |
769 } | 845 } |
770 | 846 |
771 | 847 |
772 // TODO(1224671): IC stubs for keyed loads have not been implemented | 848 // TODO(1224671): IC stubs for keyed loads have not been implemented |
773 // for ARM. | 849 // for ARM. |
774 Object* KeyedLoadStubCompiler::CompileLoadField(String* name, | 850 Object* KeyedLoadStubCompiler::CompileLoadField(String* name, |
775 JSObject* receiver, | 851 JSObject* receiver, |
776 JSObject* holder, | 852 JSObject* holder, |
777 int index) { | 853 int index) { |
778 UNIMPLEMENTED(); | 854 // ----------- S t a t e ------------- |
779 return Heap::undefined_value(); | 855 // -- lr : return address |
| 856 // -- sp[0] : key |
| 857 // -- sp[4] : receiver |
| 858 // ----------------------------------- |
| 859 HandleScope scope; |
| 860 Label miss; |
| 861 |
| 862 __ ldr(r2, MemOperand(sp, 0)); |
| 863 __ ldr(r0, MemOperand(sp, kPointerSize)); |
| 864 |
| 865 __ cmp(r2, Operand(Handle<String>(name))); |
| 866 __ b(ne, &miss); |
| 867 |
| 868 GenerateLoadField(masm(), receiver, holder, r0, r3, r1, index, &miss); |
| 869 __ bind(&miss); |
| 870 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 871 |
| 872 return GetCode(FIELD); |
780 } | 873 } |
781 | 874 |
782 | 875 |
783 Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name, | 876 Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name, |
784 JSObject* receiver, | 877 JSObject* receiver, |
785 JSObject* holder, | 878 JSObject* holder, |
786 AccessorInfo* callback) { | 879 AccessorInfo* callback) { |
787 UNIMPLEMENTED(); | 880 // ----------- S t a t e ------------- |
788 return Heap::undefined_value(); | 881 // -- lr : return address |
| 882 // -- sp[0] : key |
| 883 // -- sp[4] : receiver |
| 884 // ----------------------------------- |
| 885 HandleScope scope; |
| 886 Label miss; |
| 887 |
| 888 __ ldr(r2, MemOperand(sp, 0)); |
| 889 __ ldr(r0, MemOperand(sp, kPointerSize)); |
| 890 |
| 891 __ cmp(r2, Operand(Handle<String>(name))); |
| 892 __ b(ne, &miss); |
| 893 |
| 894 GenerateLoadCallback(masm(), receiver, holder, r0, r2, r3, |
| 895 r1, callback, &miss); |
| 896 __ bind(&miss); |
| 897 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 898 |
| 899 return GetCode(CALLBACKS); |
789 } | 900 } |
790 | 901 |
791 | 902 |
792 Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name, | 903 Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name, |
793 JSObject* receiver, | 904 JSObject* receiver, |
794 JSObject* holder, | 905 JSObject* holder, |
795 Object* value) { | 906 Object* value) { |
796 UNIMPLEMENTED(); | 907 // ----------- S t a t e ------------- |
797 return Heap::undefined_value(); | 908 // -- lr : return address |
| 909 // -- sp[0] : key |
| 910 // -- sp[4] : receiver |
| 911 // ----------------------------------- |
| 912 HandleScope scope; |
| 913 Label miss; |
| 914 |
| 915 // Check the key is the cached one |
| 916 __ ldr(r2, MemOperand(sp, 0)); |
| 917 __ ldr(r0, MemOperand(sp, kPointerSize)); |
| 918 |
| 919 __ cmp(r2, Operand(Handle<String>(name))); |
| 920 __ b(ne, &miss); |
| 921 |
| 922 GenerateLoadConstant(masm(), receiver, holder, r0, r3, r1, value, &miss); |
| 923 __ bind(&miss); |
| 924 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 925 |
| 926 // Return the generated code. |
| 927 return GetCode(CONSTANT_FUNCTION); |
798 } | 928 } |
799 | 929 |
800 | 930 |
801 Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, | 931 Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, |
802 JSObject* holder, | 932 JSObject* holder, |
803 String* name) { | 933 String* name) { |
804 UNIMPLEMENTED(); | 934 // ----------- S t a t e ------------- |
805 return Heap::undefined_value(); | 935 // -- lr : return address |
| 936 // -- sp[0] : key |
| 937 // -- sp[4] : receiver |
| 938 // ----------------------------------- |
| 939 HandleScope scope; |
| 940 Label miss; |
| 941 |
| 942 // Check the key is the cached one |
| 943 __ ldr(r2, MemOperand(sp, 0)); |
| 944 __ ldr(r0, MemOperand(sp, kPointerSize)); |
| 945 |
| 946 __ cmp(r2, Operand(Handle<String>(name))); |
| 947 __ b(ne, &miss); |
| 948 |
| 949 GenerateLoadInterceptor(masm(), receiver, holder, r0, r2, r3, r1, &miss); |
| 950 __ bind(&miss); |
| 951 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 952 |
| 953 return GetCode(INTERCEPTOR); |
806 } | 954 } |
807 | 955 |
808 | 956 |
809 Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { | 957 Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { |
810 UNIMPLEMENTED(); | 958 // ----------- S t a t e ------------- |
811 return Heap::undefined_value(); | 959 // -- lr : return address |
| 960 // -- sp[0] : key |
| 961 // -- sp[4] : receiver |
| 962 // ----------------------------------- |
| 963 HandleScope scope; |
| 964 Label miss; |
| 965 |
| 966 // Check the key is the cached one |
| 967 __ ldr(r2, MemOperand(sp, 0)); |
| 968 __ ldr(r0, MemOperand(sp, kPointerSize)); |
| 969 |
| 970 __ cmp(r2, Operand(Handle<String>(name))); |
| 971 __ b(ne, &miss); |
| 972 |
| 973 GenerateLoadArrayLength(masm(), r0, r3, &miss); |
| 974 __ bind(&miss); |
| 975 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 976 |
| 977 return GetCode(CALLBACKS); |
812 } | 978 } |
813 | 979 |
814 | 980 |
| 981 // TODO(1224671): implement the fast case. |
815 Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) { | 982 Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) { |
816 UNIMPLEMENTED(); | 983 // ----------- S t a t e ------------- |
817 return Heap::undefined_value(); | 984 // -- lr : return address |
| 985 // -- sp[0] : key |
| 986 // -- sp[4] : receiver |
| 987 // ----------------------------------- |
| 988 HandleScope scope; |
| 989 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 990 |
| 991 return GetCode(CALLBACKS); |
818 } | 992 } |
819 | 993 |
820 | 994 |
| 995 // TODO(1224671): implement the fast case. |
821 Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { | 996 Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { |
822 UNIMPLEMENTED(); | 997 // ----------- S t a t e ------------- |
823 return Heap::undefined_value(); | 998 // -- lr : return address |
| 999 // -- sp[0] : key |
| 1000 // -- sp[4] : receiver |
| 1001 // ----------------------------------- |
| 1002 HandleScope scope; |
| 1003 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1004 |
| 1005 return GetCode(CALLBACKS); |
824 } | 1006 } |
825 | 1007 |
826 | 1008 |
| 1009 // TODO(1224671): implement the fast case. |
827 Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, | 1010 Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, |
828 int index, | 1011 int index, |
829 Map* transition, | 1012 Map* transition, |
830 String* name) { | 1013 String* name) { |
831 UNIMPLEMENTED(); | 1014 // ----------- S t a t e ------------- |
832 return Heap::undefined_value(); | 1015 // -- r0 : value |
| 1016 // -- r2 : name |
| 1017 // -- lr : return address |
| 1018 // -- [sp] : receiver |
| 1019 // ----------------------------------- |
| 1020 HandleScope scope; |
| 1021 Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Miss)); |
| 1022 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 1023 |
| 1024 // Return the generated code. |
| 1025 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION); |
833 } | 1026 } |
834 | 1027 |
835 | 1028 |
836 | |
837 #undef __ | 1029 #undef __ |
838 | 1030 |
839 } } // namespace v8::internal | 1031 } } // namespace v8::internal |
OLD | NEW |