OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
784 __ push(receiver); | 784 __ push(receiver); |
785 __ push(holder); | 785 __ push(holder); |
786 } | 786 } |
787 | 787 |
788 | 788 |
789 static void CompileCallLoadPropertyWithInterceptor( | 789 static void CompileCallLoadPropertyWithInterceptor( |
790 MacroAssembler* masm, | 790 MacroAssembler* masm, |
791 Register receiver, | 791 Register receiver, |
792 Register holder, | 792 Register holder, |
793 Register name, | 793 Register name, |
794 Handle<JSObject> holder_obj) { | 794 Handle<JSObject> holder_obj, |
| 795 IC::UtilityId id) { |
795 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); | 796 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); |
796 | 797 __ CallExternalReference( |
797 ExternalReference ref = | 798 ExternalReference(IC_Utility(id), masm->isolate()), |
798 ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorOnly), | 799 StubCache::kInterceptorArgsLength); |
799 masm->isolate()); | |
800 __ mov(r0, Operand(StubCache::kInterceptorArgsLength)); | |
801 __ mov(r1, Operand(ref)); | |
802 | |
803 CEntryStub stub(1); | |
804 __ CallStub(&stub); | |
805 } | 800 } |
806 | 801 |
807 | 802 |
808 static const int kFastApiCallArguments = FunctionCallbackArguments::kArgsLength; | 803 static const int kFastApiCallArguments = FunctionCallbackArguments::kArgsLength; |
809 | 804 |
810 // Reserves space for the extra arguments to API function in the | 805 // Reserves space for the extra arguments to API function in the |
811 // caller's frame. | 806 // caller's frame. |
812 // | 807 // |
813 // These arguments are set by CheckPrototypes and GenerateFastApiDirectCall. | 808 // These arguments are set by CheckPrototypes and GenerateFastApiDirectCall. |
814 static void ReserveSpaceForFastApiCall(MacroAssembler* masm, | 809 static void ReserveSpaceForFastApiCall(MacroAssembler* masm, |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 Label* miss_label) { | 1094 Label* miss_label) { |
1100 Register holder = | 1095 Register holder = |
1101 stub_compiler_->CheckPrototypes( | 1096 stub_compiler_->CheckPrototypes( |
1102 IC::CurrentTypeOf(object, masm->isolate()), receiver, | 1097 IC::CurrentTypeOf(object, masm->isolate()), receiver, |
1103 interceptor_holder, scratch1, scratch2, scratch3, name, miss_label); | 1098 interceptor_holder, scratch1, scratch2, scratch3, name, miss_label); |
1104 | 1099 |
1105 // Call a runtime function to load the interceptor property. | 1100 // Call a runtime function to load the interceptor property. |
1106 FrameScope scope(masm, StackFrame::INTERNAL); | 1101 FrameScope scope(masm, StackFrame::INTERNAL); |
1107 // Save the name_ register across the call. | 1102 // Save the name_ register across the call. |
1108 __ push(name_); | 1103 __ push(name_); |
1109 PushInterceptorArguments(masm, receiver, holder, name_, interceptor_holder); | 1104 |
1110 __ CallExternalReference( | 1105 CompileCallLoadPropertyWithInterceptor( |
1111 ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorForCall), | 1106 masm, receiver, holder, name_, interceptor_holder, |
1112 masm->isolate()), | 1107 IC::kLoadPropertyWithInterceptorForCall); |
1113 StubCache::kInterceptorArgsLength); | 1108 |
1114 // Restore the name_ register. | 1109 // Restore the name_ register. |
1115 __ pop(name_); | 1110 __ pop(name_); |
1116 // Leave the internal frame. | 1111 // Leave the internal frame. |
1117 } | 1112 } |
1118 | 1113 |
1119 void LoadWithInterceptor(MacroAssembler* masm, | 1114 void LoadWithInterceptor(MacroAssembler* masm, |
1120 Register receiver, | 1115 Register receiver, |
1121 Register holder, | 1116 Register holder, |
1122 Handle<JSObject> holder_obj, | 1117 Handle<JSObject> holder_obj, |
1123 Register scratch, | 1118 Register scratch, |
1124 Label* interceptor_succeeded) { | 1119 Label* interceptor_succeeded) { |
1125 { | 1120 { |
1126 FrameScope scope(masm, StackFrame::INTERNAL); | 1121 FrameScope scope(masm, StackFrame::INTERNAL); |
1127 __ Push(holder, name_); | 1122 __ Push(holder, name_); |
1128 CompileCallLoadPropertyWithInterceptor(masm, | 1123 CompileCallLoadPropertyWithInterceptor( |
1129 receiver, | 1124 masm, receiver, holder, name_, holder_obj, |
1130 holder, | 1125 IC::kLoadPropertyWithInterceptorOnly); |
1131 name_, | |
1132 holder_obj); | |
1133 __ pop(name_); // Restore the name. | 1126 __ pop(name_); // Restore the name. |
1134 __ pop(receiver); // Restore the holder. | 1127 __ pop(receiver); // Restore the holder. |
1135 } | 1128 } |
1136 // If interceptor returns no-result sentinel, call the constant function. | 1129 // If interceptor returns no-result sentinel, call the constant function. |
1137 __ LoadRoot(scratch, Heap::kNoInterceptorResultSentinelRootIndex); | 1130 __ LoadRoot(scratch, Heap::kNoInterceptorResultSentinelRootIndex); |
1138 __ cmp(r0, scratch); | 1131 __ cmp(r0, scratch); |
1139 __ b(ne, interceptor_succeeded); | 1132 __ b(ne, interceptor_succeeded); |
1140 } | 1133 } |
1141 | 1134 |
1142 StubCompiler* stub_compiler_; | 1135 StubCompiler* stub_compiler_; |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1489 { | 1482 { |
1490 FrameScope frame_scope(masm(), StackFrame::INTERNAL); | 1483 FrameScope frame_scope(masm(), StackFrame::INTERNAL); |
1491 if (must_preserve_receiver_reg) { | 1484 if (must_preserve_receiver_reg) { |
1492 __ Push(receiver(), holder_reg, this->name()); | 1485 __ Push(receiver(), holder_reg, this->name()); |
1493 } else { | 1486 } else { |
1494 __ Push(holder_reg, this->name()); | 1487 __ Push(holder_reg, this->name()); |
1495 } | 1488 } |
1496 // Invoke an interceptor. Note: map checks from receiver to | 1489 // Invoke an interceptor. Note: map checks from receiver to |
1497 // interceptor's holder has been compiled before (see a caller | 1490 // interceptor's holder has been compiled before (see a caller |
1498 // of this method.) | 1491 // of this method.) |
1499 CompileCallLoadPropertyWithInterceptor(masm(), | 1492 CompileCallLoadPropertyWithInterceptor( |
1500 receiver(), | 1493 masm(), receiver(), holder_reg, this->name(), interceptor_holder, |
1501 holder_reg, | 1494 IC::kLoadPropertyWithInterceptorOnly); |
1502 this->name(), | 1495 |
1503 interceptor_holder); | |
1504 // Check if interceptor provided a value for property. If it's | 1496 // Check if interceptor provided a value for property. If it's |
1505 // the case, return immediately. | 1497 // the case, return immediately. |
1506 Label interceptor_failed; | 1498 Label interceptor_failed; |
1507 __ LoadRoot(scratch1(), Heap::kNoInterceptorResultSentinelRootIndex); | 1499 __ LoadRoot(scratch1(), Heap::kNoInterceptorResultSentinelRootIndex); |
1508 __ cmp(r0, scratch1()); | 1500 __ cmp(r0, scratch1()); |
1509 __ b(eq, &interceptor_failed); | 1501 __ b(eq, &interceptor_failed); |
1510 frame_scope.GenerateLeaveFrame(); | 1502 frame_scope.GenerateLeaveFrame(); |
1511 __ Ret(); | 1503 __ Ret(); |
1512 | 1504 |
1513 __ bind(&interceptor_failed); | 1505 __ bind(&interceptor_failed); |
(...skipping 1440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2954 // ----------------------------------- | 2946 // ----------------------------------- |
2955 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); | 2947 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); |
2956 } | 2948 } |
2957 | 2949 |
2958 | 2950 |
2959 #undef __ | 2951 #undef __ |
2960 | 2952 |
2961 } } // namespace v8::internal | 2953 } } // namespace v8::internal |
2962 | 2954 |
2963 #endif // V8_TARGET_ARCH_ARM | 2955 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |