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 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 __ push(receiver); | 398 __ push(receiver); |
399 __ push(holder); | 399 __ push(holder); |
400 } | 400 } |
401 | 401 |
402 | 402 |
403 static void CompileCallLoadPropertyWithInterceptor( | 403 static void CompileCallLoadPropertyWithInterceptor( |
404 MacroAssembler* masm, | 404 MacroAssembler* masm, |
405 Register receiver, | 405 Register receiver, |
406 Register holder, | 406 Register holder, |
407 Register name, | 407 Register name, |
408 Handle<JSObject> holder_obj) { | 408 Handle<JSObject> holder_obj, |
| 409 IC::UtilityId id) { |
409 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); | 410 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); |
410 __ CallExternalReference( | 411 __ CallExternalReference( |
411 ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorOnly), | 412 ExternalReference(IC_Utility(id), masm->isolate()), |
412 masm->isolate()), | |
413 StubCache::kInterceptorArgsLength); | 413 StubCache::kInterceptorArgsLength); |
414 } | 414 } |
415 | 415 |
416 | 416 |
417 // Number of pointers to be reserved on stack for fast API call. | 417 // Number of pointers to be reserved on stack for fast API call. |
418 static const int kFastApiCallArguments = FunctionCallbackArguments::kArgsLength; | 418 static const int kFastApiCallArguments = FunctionCallbackArguments::kArgsLength; |
419 | 419 |
420 | 420 |
421 // Reserves space for the extra arguments to API function in the | 421 // Reserves space for the extra arguments to API function in the |
422 // caller's frame. | 422 // caller's frame. |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 Label* miss_label) { | 790 Label* miss_label) { |
791 Register holder = | 791 Register holder = |
792 stub_compiler_->CheckPrototypes( | 792 stub_compiler_->CheckPrototypes( |
793 IC::CurrentTypeOf(object, masm->isolate()), receiver, | 793 IC::CurrentTypeOf(object, masm->isolate()), receiver, |
794 interceptor_holder, scratch1, scratch2, scratch3, name, miss_label); | 794 interceptor_holder, scratch1, scratch2, scratch3, name, miss_label); |
795 | 795 |
796 FrameScope scope(masm, StackFrame::INTERNAL); | 796 FrameScope scope(masm, StackFrame::INTERNAL); |
797 // Save the name_ register across the call. | 797 // Save the name_ register across the call. |
798 __ push(name_); | 798 __ push(name_); |
799 | 799 |
800 PushInterceptorArguments(masm, receiver, holder, name_, interceptor_holder); | 800 CompileCallLoadPropertyWithInterceptor( |
801 | 801 masm, receiver, holder, name_, interceptor_holder, |
802 __ CallExternalReference( | 802 IC::kLoadPropertyWithInterceptorForCall); |
803 ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorForCall), | |
804 masm->isolate()), | |
805 StubCache::kInterceptorArgsLength); | |
806 | 803 |
807 // Restore the name_ register. | 804 // Restore the name_ register. |
808 __ pop(name_); | 805 __ pop(name_); |
809 | 806 |
810 // Leave the internal frame. | 807 // Leave the internal frame. |
811 } | 808 } |
812 | 809 |
813 void LoadWithInterceptor(MacroAssembler* masm, | 810 void LoadWithInterceptor(MacroAssembler* masm, |
814 Register receiver, | 811 Register receiver, |
815 Register holder, | 812 Register holder, |
816 Handle<JSObject> holder_obj, | 813 Handle<JSObject> holder_obj, |
817 Label* interceptor_succeeded) { | 814 Label* interceptor_succeeded) { |
818 { | 815 { |
819 FrameScope scope(masm, StackFrame::INTERNAL); | 816 FrameScope scope(masm, StackFrame::INTERNAL); |
820 __ push(holder); // Save the holder. | 817 __ push(holder); // Save the holder. |
821 __ push(name_); // Save the name. | 818 __ push(name_); // Save the name. |
822 | 819 |
823 CompileCallLoadPropertyWithInterceptor(masm, | 820 CompileCallLoadPropertyWithInterceptor( |
824 receiver, | 821 masm, receiver, holder, name_, holder_obj, |
825 holder, | 822 IC::kLoadPropertyWithInterceptorOnly); |
826 name_, | |
827 holder_obj); | |
828 | 823 |
829 __ pop(name_); // Restore the name. | 824 __ pop(name_); // Restore the name. |
830 __ pop(receiver); // Restore the holder. | 825 __ pop(receiver); // Restore the holder. |
831 // Leave the internal frame. | 826 // Leave the internal frame. |
832 } | 827 } |
833 | 828 |
834 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); | 829 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); |
835 __ j(not_equal, interceptor_succeeded); | 830 __ j(not_equal, interceptor_succeeded); |
836 } | 831 } |
837 | 832 |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1546 | 1541 |
1547 if (must_preserve_receiver_reg) { | 1542 if (must_preserve_receiver_reg) { |
1548 __ push(receiver()); | 1543 __ push(receiver()); |
1549 } | 1544 } |
1550 __ push(holder_reg); | 1545 __ push(holder_reg); |
1551 __ push(this->name()); | 1546 __ push(this->name()); |
1552 | 1547 |
1553 // Invoke an interceptor. Note: map checks from receiver to | 1548 // Invoke an interceptor. Note: map checks from receiver to |
1554 // interceptor's holder has been compiled before (see a caller | 1549 // interceptor's holder has been compiled before (see a caller |
1555 // of this method.) | 1550 // of this method.) |
1556 CompileCallLoadPropertyWithInterceptor(masm(), | 1551 CompileCallLoadPropertyWithInterceptor( |
1557 receiver(), | 1552 masm(), receiver(), holder_reg, this->name(), interceptor_holder, |
1558 holder_reg, | 1553 IC::kLoadPropertyWithInterceptorOnly); |
1559 this->name(), | |
1560 interceptor_holder); | |
1561 | 1554 |
1562 // Check if interceptor provided a value for property. If it's | 1555 // Check if interceptor provided a value for property. If it's |
1563 // the case, return immediately. | 1556 // the case, return immediately. |
1564 Label interceptor_failed; | 1557 Label interceptor_failed; |
1565 __ cmp(eax, factory()->no_interceptor_result_sentinel()); | 1558 __ cmp(eax, factory()->no_interceptor_result_sentinel()); |
1566 __ j(equal, &interceptor_failed); | 1559 __ j(equal, &interceptor_failed); |
1567 frame_scope.GenerateLeaveFrame(); | 1560 frame_scope.GenerateLeaveFrame(); |
1568 __ ret(0); | 1561 __ ret(0); |
1569 | 1562 |
1570 // Clobber registers when generating debug-code to provoke errors. | 1563 // Clobber registers when generating debug-code to provoke errors. |
(...skipping 1500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3071 // ----------------------------------- | 3064 // ----------------------------------- |
3072 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); | 3065 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); |
3073 } | 3066 } |
3074 | 3067 |
3075 | 3068 |
3076 #undef __ | 3069 #undef __ |
3077 | 3070 |
3078 } } // namespace v8::internal | 3071 } } // namespace v8::internal |
3079 | 3072 |
3080 #endif // V8_TARGET_ARCH_IA32 | 3073 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |