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

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

Issue 2144643004: [builtins] Turn StoreIC_Miss and StoreIC_Slow builtins to TurboFan code stubs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 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/ic/ic.h ('k') | src/ic/mips/handler-compiler-mips.cc » ('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-arguments-inl.h" 8 #include "src/api-arguments-inl.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 1206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 DCHECK(holder->HasFastProperties()); 1217 DCHECK(holder->HasFastProperties());
1218 DCHECK(!GetSharedFunctionInfo()->HasDebugInfo()); 1218 DCHECK(!GetSharedFunctionInfo()->HasDebugInfo());
1219 Handle<Object> getter(Handle<AccessorPair>::cast(accessors)->getter(), 1219 Handle<Object> getter(Handle<AccessorPair>::cast(accessors)->getter(),
1220 isolate()); 1220 isolate());
1221 CallOptimization call_optimization(getter); 1221 CallOptimization call_optimization(getter);
1222 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); 1222 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder);
1223 if (call_optimization.is_simple_api_call()) { 1223 if (call_optimization.is_simple_api_call()) {
1224 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback); 1224 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback);
1225 int index = lookup->GetAccessorIndex(); 1225 int index = lookup->GetAccessorIndex();
1226 Handle<Code> code = compiler.CompileLoadCallback( 1226 Handle<Code> code = compiler.CompileLoadCallback(
1227 lookup->name(), call_optimization, index); 1227 lookup->name(), call_optimization, index, slow_stub());
1228 return code; 1228 return code;
1229 } 1229 }
1230 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadViaGetter); 1230 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadViaGetter);
1231 int expected_arguments = Handle<JSFunction>::cast(getter) 1231 int expected_arguments = Handle<JSFunction>::cast(getter)
1232 ->shared() 1232 ->shared()
1233 ->internal_formal_parameter_count(); 1233 ->internal_formal_parameter_count();
1234 return compiler.CompileLoadViaGetter( 1234 return compiler.CompileLoadViaGetter(
1235 lookup->name(), lookup->GetAccessorIndex(), expected_arguments); 1235 lookup->name(), lookup->GetAccessorIndex(), expected_arguments);
1236 } else { 1236 } else {
1237 DCHECK(accessors->IsAccessorInfo()); 1237 DCHECK(accessors->IsAccessorInfo());
1238 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors); 1238 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(accessors);
1239 DCHECK(v8::ToCData<Address>(info->getter()) != nullptr); 1239 DCHECK(v8::ToCData<Address>(info->getter()) != nullptr);
1240 DCHECK(AccessorInfo::IsCompatibleReceiverMap(isolate(), info, map)); 1240 DCHECK(AccessorInfo::IsCompatibleReceiverMap(isolate(), info, map));
1241 DCHECK(holder->HasFastProperties()); 1241 DCHECK(holder->HasFastProperties());
1242 DCHECK(!receiver_is_holder); 1242 DCHECK(!receiver_is_holder);
1243 DCHECK(!info->is_sloppy() || receiver->IsJSReceiver()); 1243 DCHECK(!info->is_sloppy() || receiver->IsJSReceiver());
1244 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback); 1244 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadCallback);
1245 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); 1245 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder);
1246 Handle<Code> code = compiler.CompileLoadCallback(lookup->name(), info); 1246 Handle<Code> code =
1247 compiler.CompileLoadCallback(lookup->name(), info, slow_stub());
1247 return code; 1248 return code;
1248 } 1249 }
1249 UNREACHABLE(); 1250 UNREACHABLE();
1250 } 1251 }
1251 1252
1252 case LookupIterator::DATA: { 1253 case LookupIterator::DATA: {
1253 if (lookup->is_dictionary_holder()) { 1254 if (lookup->is_dictionary_holder()) {
1254 DCHECK(kind() == Code::LOAD_IC || kind() == Code::LOAD_GLOBAL_IC); 1255 DCHECK(kind() == Code::LOAD_IC || kind() == Code::LOAD_GLOBAL_IC);
1255 DCHECK(holder->IsJSGlobalObject()); 1256 DCHECK(holder->IsJSGlobalObject());
1256 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobal); 1257 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobal);
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
1798 Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(), 1799 Handle<Object> setter(Handle<AccessorPair>::cast(accessors)->setter(),
1799 isolate()); 1800 isolate());
1800 DCHECK(setter->IsJSFunction() || setter->IsFunctionTemplateInfo()); 1801 DCHECK(setter->IsJSFunction() || setter->IsFunctionTemplateInfo());
1801 CallOptimization call_optimization(setter); 1802 CallOptimization call_optimization(setter);
1802 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder); 1803 NamedStoreHandlerCompiler compiler(isolate(), receiver_map(), holder);
1803 if (call_optimization.is_simple_api_call()) { 1804 if (call_optimization.is_simple_api_call()) {
1804 DCHECK(call_optimization.IsCompatibleReceiver(receiver, holder)); 1805 DCHECK(call_optimization.IsCompatibleReceiver(receiver, holder));
1805 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreCallback); 1806 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreCallback);
1806 Handle<Code> code = compiler.CompileStoreCallback( 1807 Handle<Code> code = compiler.CompileStoreCallback(
1807 receiver, lookup->name(), call_optimization, 1808 receiver, lookup->name(), call_optimization,
1808 lookup->GetAccessorIndex()); 1809 lookup->GetAccessorIndex(), slow_stub());
1809 return code; 1810 return code;
1810 } 1811 }
1811 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreViaSetter); 1812 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreViaSetter);
1812 int expected_arguments = JSFunction::cast(*setter) 1813 int expected_arguments = JSFunction::cast(*setter)
1813 ->shared() 1814 ->shared()
1814 ->internal_formal_parameter_count(); 1815 ->internal_formal_parameter_count();
1815 return compiler.CompileStoreViaSetter(receiver, lookup->name(), 1816 return compiler.CompileStoreViaSetter(receiver, lookup->name(),
1816 lookup->GetAccessorIndex(), 1817 lookup->GetAccessorIndex(),
1817 expected_arguments); 1818 expected_arguments);
1818 } 1819 }
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
2465 Handle<Smi> slot = args.at<Smi>(3); 2466 Handle<Smi> slot = args.at<Smi>(3);
2466 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); 2467 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
2467 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2468 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2468 KeyedStoreICNexus nexus(vector, vector_slot); 2469 KeyedStoreICNexus nexus(vector, vector_slot);
2469 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2470 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2470 ic.UpdateState(receiver, key); 2471 ic.UpdateState(receiver, key);
2471 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2472 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2472 } 2473 }
2473 2474
2474 2475
2475 RUNTIME_FUNCTION(Runtime_StoreIC_Slow) {
2476 HandleScope scope(isolate);
2477 DCHECK(args.length() == 5);
2478 Handle<Object> object = args.at<Object>(0);
2479 Handle<Object> key = args.at<Object>(1);
2480 Handle<Object> value = args.at<Object>(2);
2481 LanguageMode language_mode;
2482 StoreICNexus nexus(isolate);
2483 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2484 language_mode = ic.language_mode();
2485 RETURN_RESULT_OR_FAILURE(
2486 isolate,
2487 Runtime::SetObjectProperty(isolate, object, key, value, language_mode));
2488 }
2489
2490
2491 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) { 2476 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) {
2492 HandleScope scope(isolate); 2477 HandleScope scope(isolate);
2493 DCHECK(args.length() == 5); 2478 DCHECK(args.length() == 5);
2494 Handle<Object> object = args.at<Object>(0); 2479 Handle<Object> object = args.at<Object>(0);
2495 Handle<Object> key = args.at<Object>(1); 2480 Handle<Object> key = args.at<Object>(1);
2496 Handle<Object> value = args.at<Object>(2); 2481 Handle<Object> value = args.at<Object>(2);
2497 LanguageMode language_mode; 2482 LanguageMode language_mode;
2498 KeyedStoreICNexus nexus(isolate); 2483 KeyedStoreICNexus nexus(isolate);
2499 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2484 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2500 language_mode = ic.language_mode(); 2485 language_mode = ic.language_mode();
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
2992 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, 2977 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC,
2993 vector->GetKind(vector_slot)); 2978 vector->GetKind(vector_slot));
2994 KeyedLoadICNexus nexus(vector, vector_slot); 2979 KeyedLoadICNexus nexus(vector, vector_slot);
2995 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2980 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2996 ic.UpdateState(receiver, key); 2981 ic.UpdateState(receiver, key);
2997 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); 2982 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
2998 } 2983 }
2999 } 2984 }
3000 } // namespace internal 2985 } // namespace internal
3001 } // namespace v8 2986 } // namespace v8
OLDNEW
« no previous file with comments | « src/ic/ic.h ('k') | src/ic/mips/handler-compiler-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698