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 |