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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 __ push(receiver); | 372 __ push(receiver); |
373 __ push(holder); | 373 __ push(holder); |
374 } | 374 } |
375 | 375 |
376 | 376 |
377 static void CompileCallLoadPropertyWithInterceptor( | 377 static void CompileCallLoadPropertyWithInterceptor( |
378 MacroAssembler* masm, | 378 MacroAssembler* masm, |
379 Register receiver, | 379 Register receiver, |
380 Register holder, | 380 Register holder, |
381 Register name, | 381 Register name, |
382 Handle<JSObject> holder_obj) { | 382 Handle<JSObject> holder_obj, |
| 383 IC::UtilityId id) { |
383 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); | 384 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); |
384 | 385 __ CallExternalReference( |
385 ExternalReference ref = | 386 ExternalReference(IC_Utility(id), masm->isolate()), |
386 ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorOnly), | 387 StubCache::kInterceptorArgsLength); |
387 masm->isolate()); | |
388 __ Set(rax, StubCache::kInterceptorArgsLength); | |
389 __ LoadAddress(rbx, ref); | |
390 | |
391 CEntryStub stub(1); | |
392 __ CallStub(&stub); | |
393 } | 388 } |
394 | 389 |
395 | 390 |
396 // Number of pointers to be reserved on stack for fast API call. | 391 // Number of pointers to be reserved on stack for fast API call. |
397 static const int kFastApiCallArguments = FunctionCallbackArguments::kArgsLength; | 392 static const int kFastApiCallArguments = FunctionCallbackArguments::kArgsLength; |
398 | 393 |
399 | 394 |
400 // Reserves space for the extra arguments to API function in the | 395 // Reserves space for the extra arguments to API function in the |
401 // caller's frame. | 396 // caller's frame. |
402 // | 397 // |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 Label* miss_label) { | 782 Label* miss_label) { |
788 Register holder = | 783 Register holder = |
789 stub_compiler_->CheckPrototypes( | 784 stub_compiler_->CheckPrototypes( |
790 IC::CurrentTypeOf(object, masm->isolate()), receiver, | 785 IC::CurrentTypeOf(object, masm->isolate()), receiver, |
791 interceptor_holder, scratch1, scratch2, scratch3, name, miss_label); | 786 interceptor_holder, scratch1, scratch2, scratch3, name, miss_label); |
792 | 787 |
793 FrameScope scope(masm, StackFrame::INTERNAL); | 788 FrameScope scope(masm, StackFrame::INTERNAL); |
794 // Save the name_ register across the call. | 789 // Save the name_ register across the call. |
795 __ push(name_); | 790 __ push(name_); |
796 | 791 |
797 PushInterceptorArguments(masm, receiver, holder, name_, interceptor_holder); | 792 CompileCallLoadPropertyWithInterceptor( |
798 | 793 masm, receiver, holder, name_, interceptor_holder, |
799 __ CallExternalReference( | 794 IC::kLoadPropertyWithInterceptorForCall); |
800 ExternalReference(IC_Utility(IC::kLoadPropertyWithInterceptorForCall), | |
801 masm->isolate()), | |
802 StubCache::kInterceptorArgsLength); | |
803 | 795 |
804 // Restore the name_ register. | 796 // Restore the name_ register. |
805 __ pop(name_); | 797 __ pop(name_); |
806 | 798 |
807 // Leave the internal frame. | 799 // Leave the internal frame. |
808 } | 800 } |
809 | 801 |
810 void LoadWithInterceptor(MacroAssembler* masm, | 802 void LoadWithInterceptor(MacroAssembler* masm, |
811 Register receiver, | 803 Register receiver, |
812 Register holder, | 804 Register holder, |
813 Handle<JSObject> holder_obj, | 805 Handle<JSObject> holder_obj, |
814 Label* interceptor_succeeded) { | 806 Label* interceptor_succeeded) { |
815 { | 807 { |
816 FrameScope scope(masm, StackFrame::INTERNAL); | 808 FrameScope scope(masm, StackFrame::INTERNAL); |
817 __ push(holder); // Save the holder. | 809 __ push(holder); // Save the holder. |
818 __ push(name_); // Save the name. | 810 __ push(name_); // Save the name. |
819 | 811 |
820 CompileCallLoadPropertyWithInterceptor(masm, | 812 CompileCallLoadPropertyWithInterceptor( |
821 receiver, | 813 masm, receiver, holder, name_, holder_obj, |
822 holder, | 814 IC::kLoadPropertyWithInterceptorOnly); |
823 name_, | |
824 holder_obj); | |
825 | 815 |
826 __ pop(name_); // Restore the name. | 816 __ pop(name_); // Restore the name. |
827 __ pop(receiver); // Restore the holder. | 817 __ pop(receiver); // Restore the holder. |
828 // Leave the internal frame. | 818 // Leave the internal frame. |
829 } | 819 } |
830 | 820 |
831 __ CompareRoot(rax, Heap::kNoInterceptorResultSentinelRootIndex); | 821 __ CompareRoot(rax, Heap::kNoInterceptorResultSentinelRootIndex); |
832 __ j(not_equal, interceptor_succeeded); | 822 __ j(not_equal, interceptor_succeeded); |
833 } | 823 } |
834 | 824 |
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1494 | 1484 |
1495 if (must_preserve_receiver_reg) { | 1485 if (must_preserve_receiver_reg) { |
1496 __ push(receiver()); | 1486 __ push(receiver()); |
1497 } | 1487 } |
1498 __ push(holder_reg); | 1488 __ push(holder_reg); |
1499 __ push(this->name()); | 1489 __ push(this->name()); |
1500 | 1490 |
1501 // Invoke an interceptor. Note: map checks from receiver to | 1491 // Invoke an interceptor. Note: map checks from receiver to |
1502 // interceptor's holder has been compiled before (see a caller | 1492 // interceptor's holder has been compiled before (see a caller |
1503 // of this method.) | 1493 // of this method.) |
1504 CompileCallLoadPropertyWithInterceptor(masm(), | 1494 CompileCallLoadPropertyWithInterceptor( |
1505 receiver(), | 1495 masm(), receiver(), holder_reg, this->name(), interceptor_holder, |
1506 holder_reg, | 1496 IC::kLoadPropertyWithInterceptorOnly); |
1507 this->name(), | |
1508 interceptor_holder); | |
1509 | 1497 |
1510 // Check if interceptor provided a value for property. If it's | 1498 // Check if interceptor provided a value for property. If it's |
1511 // the case, return immediately. | 1499 // the case, return immediately. |
1512 Label interceptor_failed; | 1500 Label interceptor_failed; |
1513 __ CompareRoot(rax, Heap::kNoInterceptorResultSentinelRootIndex); | 1501 __ CompareRoot(rax, Heap::kNoInterceptorResultSentinelRootIndex); |
1514 __ j(equal, &interceptor_failed); | 1502 __ j(equal, &interceptor_failed); |
1515 frame_scope.GenerateLeaveFrame(); | 1503 frame_scope.GenerateLeaveFrame(); |
1516 __ ret(0); | 1504 __ ret(0); |
1517 | 1505 |
1518 __ bind(&interceptor_failed); | 1506 __ bind(&interceptor_failed); |
(...skipping 1484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3003 // ----------------------------------- | 2991 // ----------------------------------- |
3004 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); | 2992 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); |
3005 } | 2993 } |
3006 | 2994 |
3007 | 2995 |
3008 #undef __ | 2996 #undef __ |
3009 | 2997 |
3010 } } // namespace v8::internal | 2998 } } // namespace v8::internal |
3011 | 2999 |
3012 #endif // V8_TARGET_ARCH_X64 | 3000 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |