| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ic/ic.h" | 5 #include "src/ic/ic.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/api-arguments.h" | 9 #include "src/api-arguments.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 2597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2608 * Attempts to load a property with an interceptor (which must be present), | 2608 * Attempts to load a property with an interceptor (which must be present), |
| 2609 * but doesn't search the prototype chain. | 2609 * but doesn't search the prototype chain. |
| 2610 * | 2610 * |
| 2611 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't | 2611 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't |
| 2612 * provide any value for the given name. | 2612 * provide any value for the given name. |
| 2613 */ | 2613 */ |
| 2614 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { | 2614 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { |
| 2615 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 2615 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| 2616 Handle<Name> name = | 2616 Handle<Name> name = |
| 2617 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); | 2617 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
| 2618 Handle<JSObject> receiver = | 2618 Handle<Object> receiver = |
| 2619 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); | 2619 args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| 2620 Handle<JSObject> holder = | 2620 Handle<JSObject> holder = |
| 2621 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); | 2621 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
| 2622 HandleScope scope(isolate); | 2622 HandleScope scope(isolate); |
| 2623 | 2623 |
| 2624 if (!receiver->IsJSReceiver()) { |
| 2625 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2626 isolate, receiver, Object::ConvertReceiver(isolate, receiver)); |
| 2627 } |
| 2628 |
| 2624 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); | 2629 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); |
| 2625 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, | 2630 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, |
| 2626 *holder, Object::DONT_THROW); | 2631 *holder, Object::DONT_THROW); |
| 2627 | 2632 |
| 2628 v8::GenericNamedPropertyGetterCallback getter = | 2633 v8::GenericNamedPropertyGetterCallback getter = |
| 2629 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 2634 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 2630 interceptor->getter()); | 2635 interceptor->getter()); |
| 2631 Handle<Object> result = arguments.Call(getter, name); | 2636 Handle<Object> result = arguments.Call(getter, name); |
| 2632 | 2637 |
| 2633 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 2638 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| 2634 | 2639 |
| 2635 if (!result.is_null()) return *result; | 2640 if (!result.is_null()) return *result; |
| 2636 return isolate->heap()->no_interceptor_result_sentinel(); | 2641 return isolate->heap()->no_interceptor_result_sentinel(); |
| 2637 } | 2642 } |
| 2638 | 2643 |
| 2639 | 2644 |
| 2640 /** | 2645 /** |
| 2641 * Loads a property with an interceptor performing post interceptor | 2646 * Loads a property with an interceptor performing post interceptor |
| 2642 * lookup if interceptor failed. | 2647 * lookup if interceptor failed. |
| 2643 */ | 2648 */ |
| 2644 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { | 2649 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { |
| 2645 HandleScope scope(isolate); | 2650 HandleScope scope(isolate); |
| 2646 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 2651 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| 2647 Handle<Name> name = | 2652 Handle<Name> name = |
| 2648 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); | 2653 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
| 2649 Handle<JSObject> receiver = | 2654 Handle<Object> receiver = |
| 2650 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); | 2655 args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| 2651 Handle<JSObject> holder = | 2656 Handle<JSObject> holder = |
| 2652 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); | 2657 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
| 2653 | 2658 |
| 2659 if (!receiver->IsJSReceiver()) { |
| 2660 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 2661 isolate, receiver, Object::ConvertReceiver(isolate, receiver)); |
| 2662 } |
| 2663 |
| 2654 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); | 2664 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); |
| 2655 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, | 2665 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, |
| 2656 *holder, Object::DONT_THROW); | 2666 *holder, Object::DONT_THROW); |
| 2657 | 2667 |
| 2658 v8::GenericNamedPropertyGetterCallback getter = | 2668 v8::GenericNamedPropertyGetterCallback getter = |
| 2659 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 2669 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 2660 interceptor->getter()); | 2670 interceptor->getter()); |
| 2661 Handle<Object> result = arguments.Call(getter, name); | 2671 Handle<Object> result = arguments.Call(getter, name); |
| 2662 | 2672 |
| 2663 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 2673 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2783 KeyedLoadICNexus nexus(vector, vector_slot); | 2793 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2784 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2794 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2785 ic.UpdateState(receiver, key); | 2795 ic.UpdateState(receiver, key); |
| 2786 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2796 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2787 } | 2797 } |
| 2788 | 2798 |
| 2789 return *result; | 2799 return *result; |
| 2790 } | 2800 } |
| 2791 } // namespace internal | 2801 } // namespace internal |
| 2792 } // namespace v8 | 2802 } // namespace v8 |
| OLD | NEW |