Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/ic/ic.cc

Issue 1993633002: Version 5.1.281.41 (cherry-pick) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@5.1
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 lookup->name(), lookup->GetAccessorIndex(), expected_arguments); 1200 lookup->name(), lookup->GetAccessorIndex(), expected_arguments);
1201 } else if (accessors->IsAccessorInfo()) { 1201 } else if (accessors->IsAccessorInfo()) {
1202 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); 1202 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors);
1203 if (v8::ToCData<Address>(info->getter()) == 0) break; 1203 if (v8::ToCData<Address>(info->getter()) == 0) break;
1204 if (!AccessorInfo::IsCompatibleReceiverMap(isolate(), info, map)) { 1204 if (!AccessorInfo::IsCompatibleReceiverMap(isolate(), info, map)) {
1205 // This case should be already handled in LoadIC::UpdateCaches. 1205 // This case should be already handled in LoadIC::UpdateCaches.
1206 UNREACHABLE(); 1206 UNREACHABLE();
1207 break; 1207 break;
1208 } 1208 }
1209 if (!holder->HasFastProperties()) break; 1209 if (!holder->HasFastProperties()) break;
1210 if (info->is_sloppy() && !receiver->IsJSReceiver()) break;
1210 NamedLoadHandlerCompiler compiler(isolate(), map, holder, 1211 NamedLoadHandlerCompiler compiler(isolate(), map, holder,
1211 cache_holder); 1212 cache_holder);
1212 return compiler.CompileLoadCallback(lookup->name(), info); 1213 return compiler.CompileLoadCallback(lookup->name(), info);
1213 } 1214 }
1214 } 1215 }
1215 break; 1216 break;
1216 } 1217 }
1217 1218
1218 case LookupIterator::DATA: { 1219 case LookupIterator::DATA: {
1219 if (lookup->is_dictionary_holder()) { 1220 if (lookup->is_dictionary_holder()) {
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
1749 !lookup->HolderIsReceiverOrHiddenPrototype()) { 1750 !lookup->HolderIsReceiverOrHiddenPrototype()) {
1750 TRACE_GENERIC_IC(isolate(), "StoreIC", 1751 TRACE_GENERIC_IC(isolate(), "StoreIC",
1751 "special data property in prototype chain"); 1752 "special data property in prototype chain");
1752 break; 1753 break;
1753 } 1754 }
1754 if (!AccessorInfo::IsCompatibleReceiverMap(isolate(), info, 1755 if (!AccessorInfo::IsCompatibleReceiverMap(isolate(), info,
1755 receiver_map())) { 1756 receiver_map())) {
1756 TRACE_GENERIC_IC(isolate(), "StoreIC", "incompatible receiver type"); 1757 TRACE_GENERIC_IC(isolate(), "StoreIC", "incompatible receiver type");
1757 break; 1758 break;
1758 } 1759 }
1760 if (info->is_sloppy() && !receiver->IsJSReceiver()) break;
1759 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); 1761 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder);
1760 return compiler.CompileStoreCallback(receiver, lookup->name(), info, 1762 return compiler.CompileStoreCallback(receiver, lookup->name(), info,
1761 language_mode()); 1763 language_mode());
1762 } else if (accessors->IsAccessorPair()) { 1764 } else if (accessors->IsAccessorPair()) {
1763 Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(), 1765 Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(),
1764 isolate()); 1766 isolate());
1765 if (!setter->IsJSFunction()) { 1767 if (!setter->IsJSFunction()) {
1766 TRACE_GENERIC_IC(isolate(), "StoreIC", "setter not a function"); 1768 TRACE_GENERIC_IC(isolate(), "StoreIC", "setter not a function");
1767 break; 1769 break;
1768 } 1770 }
(...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after
2791 * Attempts to load a property with an interceptor (which must be present), 2793 * Attempts to load a property with an interceptor (which must be present),
2792 * but doesn't search the prototype chain. 2794 * but doesn't search the prototype chain.
2793 * 2795 *
2794 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't 2796 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't
2795 * provide any value for the given name. 2797 * provide any value for the given name.
2796 */ 2798 */
2797 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { 2799 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) {
2798 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); 2800 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength);
2799 Handle<Name> name = 2801 Handle<Name> name =
2800 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); 2802 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex);
2801 Handle<JSObject> receiver = 2803 Handle<Object> receiver =
2802 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); 2804 args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex);
2803 Handle<JSObject> holder = 2805 Handle<JSObject> holder =
2804 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); 2806 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex);
2805 HandleScope scope(isolate); 2807 HandleScope scope(isolate);
2806 2808
2809 if (!receiver->IsJSReceiver()) {
2810 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2811 isolate, receiver, Object::ConvertReceiver(isolate, receiver));
2812 }
2813
2807 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); 2814 InterceptorInfo* interceptor = holder->GetNamedInterceptor();
2808 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, 2815 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver,
2809 *holder, Object::DONT_THROW); 2816 *holder, Object::DONT_THROW);
2810 2817
2811 v8::GenericNamedPropertyGetterCallback getter = 2818 v8::GenericNamedPropertyGetterCallback getter =
2812 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( 2819 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
2813 interceptor->getter()); 2820 interceptor->getter());
2814 Handle<Object> result = arguments.Call(getter, name); 2821 Handle<Object> result = arguments.Call(getter, name);
2815 2822
2816 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 2823 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
2817 2824
2818 if (!result.is_null()) return *result; 2825 if (!result.is_null()) return *result;
2819 return isolate->heap()->no_interceptor_result_sentinel(); 2826 return isolate->heap()->no_interceptor_result_sentinel();
2820 } 2827 }
2821 2828
2822 2829
2823 /** 2830 /**
2824 * Loads a property with an interceptor performing post interceptor 2831 * Loads a property with an interceptor performing post interceptor
2825 * lookup if interceptor failed. 2832 * lookup if interceptor failed.
2826 */ 2833 */
2827 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { 2834 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) {
2828 HandleScope scope(isolate); 2835 HandleScope scope(isolate);
2829 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); 2836 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength);
2830 Handle<Name> name = 2837 Handle<Name> name =
2831 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); 2838 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex);
2832 Handle<JSObject> receiver = 2839 Handle<Object> receiver =
2833 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); 2840 args.at<Object>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex);
2834 Handle<JSObject> holder = 2841 Handle<JSObject> holder =
2835 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); 2842 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex);
2836 2843
2844 if (!receiver->IsJSReceiver()) {
2845 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2846 isolate, receiver, Object::ConvertReceiver(isolate, receiver));
2847 }
2848
2837 InterceptorInfo* interceptor = holder->GetNamedInterceptor(); 2849 InterceptorInfo* interceptor = holder->GetNamedInterceptor();
2838 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver, 2850 PropertyCallbackArguments arguments(isolate, interceptor->data(), *receiver,
2839 *holder, Object::DONT_THROW); 2851 *holder, Object::DONT_THROW);
2840 2852
2841 v8::GenericNamedPropertyGetterCallback getter = 2853 v8::GenericNamedPropertyGetterCallback getter =
2842 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( 2854 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
2843 interceptor->getter()); 2855 interceptor->getter());
2844 Handle<Object> result = arguments.Call(getter, name); 2856 Handle<Object> result = arguments.Call(getter, name);
2845 2857
2846 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 2858 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 KeyedLoadICNexus nexus(vector, vector_slot); 2978 KeyedLoadICNexus nexus(vector, vector_slot);
2967 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2979 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2968 ic.UpdateState(receiver, key); 2980 ic.UpdateState(receiver, key);
2969 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 2981 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
2970 } 2982 }
2971 2983
2972 return *result; 2984 return *result;
2973 } 2985 }
2974 } // namespace internal 2986 } // namespace internal
2975 } // namespace v8 2987 } // namespace v8
OLDNEW
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698