| 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 2743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2754 ? AccessorInfo::cast(WeakCell::cast(*callback_or_cell)->value()) | 2754 ? AccessorInfo::cast(WeakCell::cast(*callback_or_cell)->value()) |
| 2755 : AccessorInfo::cast(*callback_or_cell)); | 2755 : AccessorInfo::cast(*callback_or_cell)); |
| 2756 | 2756 |
| 2757 DCHECK(callback->IsCompatibleReceiver(*receiver)); | 2757 DCHECK(callback->IsCompatibleReceiver(*receiver)); |
| 2758 | 2758 |
| 2759 Address setter_address = v8::ToCData<Address>(callback->setter()); | 2759 Address setter_address = v8::ToCData<Address>(callback->setter()); |
| 2760 v8::AccessorNameSetterCallback fun = | 2760 v8::AccessorNameSetterCallback fun = |
| 2761 FUNCTION_CAST<v8::AccessorNameSetterCallback>(setter_address); | 2761 FUNCTION_CAST<v8::AccessorNameSetterCallback>(setter_address); |
| 2762 DCHECK(fun != NULL); | 2762 DCHECK(fun != NULL); |
| 2763 | 2763 |
| 2764 LOG(isolate, ApiNamedPropertyAccess("store", *receiver, *name)); | |
| 2765 Object::ShouldThrow should_throw = | 2764 Object::ShouldThrow should_throw = |
| 2766 is_sloppy(language_mode) ? Object::DONT_THROW : Object::THROW_ON_ERROR; | 2765 is_sloppy(language_mode) ? Object::DONT_THROW : Object::THROW_ON_ERROR; |
| 2767 PropertyCallbackArguments custom_args(isolate, callback->data(), *receiver, | 2766 PropertyCallbackArguments custom_args(isolate, callback->data(), *receiver, |
| 2768 *holder, should_throw); | 2767 *holder, should_throw); |
| 2769 custom_args.Call(fun, v8::Utils::ToLocal(name), v8::Utils::ToLocal(value)); | 2768 custom_args.Call(fun, name, value); |
| 2770 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 2769 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| 2771 return *value; | 2770 return *value; |
| 2772 } | 2771 } |
| 2773 | 2772 |
| 2774 | 2773 |
| 2775 /** | 2774 /** |
| 2776 * Attempts to load a property with an interceptor (which must be present), | 2775 * Attempts to load a property with an interceptor (which must be present), |
| 2777 * but doesn't search the prototype chain. | 2776 * but doesn't search the prototype chain. |
| 2778 * | 2777 * |
| 2779 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't | 2778 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't |
| 2780 * provide any value for the given name. | 2779 * provide any value for the given name. |
| 2781 */ | 2780 */ |
| 2782 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { | 2781 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { |
| 2783 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 2782 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| 2784 Handle<Name> name = | 2783 Handle<Name> name = |
| 2785 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); | 2784 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
| 2786 Handle<JSObject> receiver = | 2785 Handle<JSObject> receiver = |
| 2787 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); | 2786 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
| 2788 Handle<JSObject> holder = | 2787 Handle<JSObject> holder = |
| 2789 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); | 2788 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
| 2790 HandleScope scope(isolate); | 2789 HandleScope scope(isolate); |
| 2791 | 2790 |
| 2792 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); | 2791 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); |
| 2793 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, | 2792 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, |
| 2794 *holder, Object::DONT_THROW); | 2793 *holder, Object::DONT_THROW); |
| 2795 | 2794 |
| 2796 v8::GenericNamedPropertyGetterCallback getter = | 2795 v8::GenericNamedPropertyGetterCallback getter = |
| 2797 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 2796 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 2798 interceptor->getter()); | 2797 interceptor->getter()); |
| 2799 LOG(isolate, ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 2798 Handle<Object> result = arguments.Call(getter, name); |
| 2800 v8::Local<v8::Value> result = | |
| 2801 arguments.Call(getter, v8::Utils::ToLocal(name)); | |
| 2802 | 2799 |
| 2803 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 2800 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| 2804 | 2801 |
| 2805 Handle<Object> result_internal; | 2802 Handle<Object> result_internal; |
| 2806 if (result.IsEmpty()) { | 2803 if (result.is_null()) { |
| 2807 return isolate->heap()->no_interceptor_result_sentinel(); | 2804 return isolate->heap()->no_interceptor_result_sentinel(); |
| 2808 } | 2805 } |
| 2809 result_internal = v8::Utils::OpenHandle(*result); | 2806 return *result; |
| 2810 result_internal->VerifyApiCallResultType(); | |
| 2811 return *result_internal; | |
| 2812 } | 2807 } |
| 2813 | 2808 |
| 2814 | 2809 |
| 2815 /** | 2810 /** |
| 2816 * Loads a property with an interceptor performing post interceptor | 2811 * Loads a property with an interceptor performing post interceptor |
| 2817 * lookup if interceptor failed. | 2812 * lookup if interceptor failed. |
| 2818 */ | 2813 */ |
| 2819 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { | 2814 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { |
| 2820 HandleScope scope(isolate); | 2815 HandleScope scope(isolate); |
| 2821 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 2816 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2879 | 2874 |
| 2880 | 2875 |
| 2881 RUNTIME_FUNCTION(Runtime_LoadElementWithInterceptor) { | 2876 RUNTIME_FUNCTION(Runtime_LoadElementWithInterceptor) { |
| 2882 // TODO(verwaest): This should probably get the holder and receiver as input. | 2877 // TODO(verwaest): This should probably get the holder and receiver as input. |
| 2883 HandleScope scope(isolate); | 2878 HandleScope scope(isolate); |
| 2884 Handle<JSObject> receiver = args.at<JSObject>(0); | 2879 Handle<JSObject> receiver = args.at<JSObject>(0); |
| 2885 DCHECK(args.smi_at(1) >= 0); | 2880 DCHECK(args.smi_at(1) >= 0); |
| 2886 uint32_t index = args.smi_at(1); | 2881 uint32_t index = args.smi_at(1); |
| 2887 | 2882 |
| 2888 InterceptorInfo* interceptor = receiver->GetIndexedInterceptor(); | 2883 InterceptorInfo* interceptor = receiver->GetIndexedInterceptor(); |
| 2889 v8::Local<v8::Value> result; | |
| 2890 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, | 2884 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, |
| 2891 *receiver, Object::DONT_THROW); | 2885 *receiver, Object::DONT_THROW); |
| 2892 | 2886 |
| 2893 v8::IndexedPropertyGetterCallback getter = | 2887 v8::IndexedPropertyGetterCallback getter = |
| 2894 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 2888 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
| 2895 LOG(isolate, | 2889 Handle<Object> result = arguments.Call(getter, index); |
| 2896 ApiIndexedPropertyAccess("interceptor-indexed-get", *receiver, index)); | |
| 2897 result = arguments.Call(getter, index); | |
| 2898 | 2890 |
| 2899 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 2891 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| 2900 | 2892 |
| 2901 Handle<Object> result_internal; | 2893 if (result.is_null()) { |
| 2902 if (result.IsEmpty()) { | |
| 2903 LookupIterator it(isolate, receiver, index, receiver); | 2894 LookupIterator it(isolate, receiver, index, receiver); |
| 2904 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); | 2895 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); |
| 2905 it.Next(); | 2896 it.Next(); |
| 2906 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result_internal, | 2897 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 2907 Object::GetProperty(&it)); | 2898 Object::GetProperty(&it)); |
| 2908 } else { | |
| 2909 result_internal = v8::Utils::OpenHandle(*result); | |
| 2910 result_internal->VerifyApiCallResultType(); | |
| 2911 } | 2899 } |
| 2912 | 2900 |
| 2913 return *result_internal; | 2901 return *result; |
| 2914 } | 2902 } |
| 2915 | 2903 |
| 2916 | 2904 |
| 2917 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { | 2905 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { |
| 2918 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2906 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2919 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2907 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2920 HandleScope scope(isolate); | 2908 HandleScope scope(isolate); |
| 2921 Handle<Object> receiver = args.at<Object>(0); | 2909 Handle<Object> receiver = args.at<Object>(0); |
| 2922 Handle<Name> key = args.at<Name>(1); | 2910 Handle<Name> key = args.at<Name>(1); |
| 2923 Handle<Object> result; | 2911 Handle<Object> result; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2940 KeyedLoadICNexus nexus(vector, vector_slot); | 2928 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2941 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2929 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2942 ic.UpdateState(receiver, key); | 2930 ic.UpdateState(receiver, key); |
| 2943 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2931 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2944 } | 2932 } |
| 2945 | 2933 |
| 2946 return *result; | 2934 return *result; |
| 2947 } | 2935 } |
| 2948 } // namespace internal | 2936 } // namespace internal |
| 2949 } // namespace v8 | 2937 } // namespace v8 |
| OLD | NEW |