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

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

Issue 2187693002: [Tracing] Embed V8 runtime call stats into tracing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix memory leak Created 4 years, 4 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/full-codegen/full-codegen.cc ('k') | src/interpreter/interpreter.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 2217 matching lines...) Expand 10 before | Expand all | Expand 10 after
2228 #undef TRACE_IC 2228 #undef TRACE_IC
2229 2229
2230 2230
2231 // ---------------------------------------------------------------------------- 2231 // ----------------------------------------------------------------------------
2232 // Static IC stub generators. 2232 // Static IC stub generators.
2233 // 2233 //
2234 2234
2235 // Used from ic-<arch>.cc. 2235 // Used from ic-<arch>.cc.
2236 RUNTIME_FUNCTION(Runtime_CallIC_Miss) { 2236 RUNTIME_FUNCTION(Runtime_CallIC_Miss) {
2237 TimerEventScope<TimerEventIcMiss> timer(isolate); 2237 TimerEventScope<TimerEventIcMiss> timer(isolate);
2238 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2239 HandleScope scope(isolate); 2238 HandleScope scope(isolate);
2240 DCHECK(args.length() == 3); 2239 DCHECK(args.length() == 3);
2241 Handle<Object> function = args.at<Object>(0); 2240 Handle<Object> function = args.at<Object>(0);
2242 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); 2241 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1);
2243 Handle<Smi> slot = args.at<Smi>(2); 2242 Handle<Smi> slot = args.at<Smi>(2);
2244 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2243 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2245 CallICNexus nexus(vector, vector_slot); 2244 CallICNexus nexus(vector, vector_slot);
2246 CallIC ic(isolate, &nexus); 2245 CallIC ic(isolate, &nexus);
2247 ic.HandleMiss(function); 2246 ic.HandleMiss(function);
2248 return *function; 2247 return *function;
2249 } 2248 }
2250 2249
2251 2250
2252 // Used from ic-<arch>.cc. 2251 // Used from ic-<arch>.cc.
2253 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { 2252 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) {
2254 TimerEventScope<TimerEventIcMiss> timer(isolate); 2253 TimerEventScope<TimerEventIcMiss> timer(isolate);
2255 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2256 HandleScope scope(isolate); 2254 HandleScope scope(isolate);
2257 Handle<Object> receiver = args.at<Object>(0); 2255 Handle<Object> receiver = args.at<Object>(0);
2258 2256
2259 DCHECK_EQ(4, args.length()); 2257 DCHECK_EQ(4, args.length());
2260 Handle<Smi> slot = args.at<Smi>(2); 2258 Handle<Smi> slot = args.at<Smi>(2);
2261 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); 2259 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3);
2262 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2260 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2263 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the 2261 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the
2264 // LoadIC miss handler if the handler misses. Since the vector Nexus is 2262 // LoadIC miss handler if the handler misses. Since the vector Nexus is
2265 // set up outside the IC, handle that here. 2263 // set up outside the IC, handle that here.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2309 ic.UpdateState(global, name); 2307 ic.UpdateState(global, name);
2310 2308
2311 Handle<Object> result; 2309 Handle<Object> result;
2312 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(name)); 2310 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(name));
2313 return *result; 2311 return *result;
2314 } 2312 }
2315 2313
2316 // Used from ic-<arch>.cc 2314 // Used from ic-<arch>.cc
2317 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { 2315 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) {
2318 TimerEventScope<TimerEventIcMiss> timer(isolate); 2316 TimerEventScope<TimerEventIcMiss> timer(isolate);
2319 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2320 HandleScope scope(isolate); 2317 HandleScope scope(isolate);
2321 Handle<Object> receiver = args.at<Object>(0); 2318 Handle<Object> receiver = args.at<Object>(0);
2322 Handle<Object> key = args.at<Object>(1); 2319 Handle<Object> key = args.at<Object>(1);
2323 2320
2324 DCHECK(args.length() == 4); 2321 DCHECK(args.length() == 4);
2325 Handle<Smi> slot = args.at<Smi>(2); 2322 Handle<Smi> slot = args.at<Smi>(2);
2326 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); 2323 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3);
2327 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2324 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2328 KeyedLoadICNexus nexus(vector, vector_slot); 2325 KeyedLoadICNexus nexus(vector, vector_slot);
2329 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2326 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2330 ic.UpdateState(receiver, key); 2327 ic.UpdateState(receiver, key);
2331 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); 2328 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
2332 } 2329 }
2333 2330
2334 2331
2335 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) { 2332 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) {
2336 TimerEventScope<TimerEventIcMiss> timer(isolate); 2333 TimerEventScope<TimerEventIcMiss> timer(isolate);
2337 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2338 HandleScope scope(isolate); 2334 HandleScope scope(isolate);
2339 DCHECK_EQ(4, args.length()); 2335 DCHECK_EQ(4, args.length());
2340 typedef LoadWithVectorDescriptor Descriptor; 2336 typedef LoadWithVectorDescriptor Descriptor;
2341 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver); 2337 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver);
2342 Handle<Object> key = args.at<Object>(Descriptor::kName); 2338 Handle<Object> key = args.at<Object>(Descriptor::kName);
2343 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot); 2339 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot);
2344 Handle<TypeFeedbackVector> vector = 2340 Handle<TypeFeedbackVector> vector =
2345 args.at<TypeFeedbackVector>(Descriptor::kVector); 2341 args.at<TypeFeedbackVector>(Descriptor::kVector);
2346 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2342 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2347 KeyedLoadICNexus nexus(vector, vector_slot); 2343 KeyedLoadICNexus nexus(vector, vector_slot);
2348 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2344 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2349 ic.UpdateState(receiver, key); 2345 ic.UpdateState(receiver, key);
2350 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); 2346 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
2351 } 2347 }
2352 2348
2353 2349
2354 // Used from ic-<arch>.cc. 2350 // Used from ic-<arch>.cc.
2355 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { 2351 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) {
2356 TimerEventScope<TimerEventIcMiss> timer(isolate); 2352 TimerEventScope<TimerEventIcMiss> timer(isolate);
2357 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2358 HandleScope scope(isolate); 2353 HandleScope scope(isolate);
2359 Handle<Object> receiver = args.at<Object>(0); 2354 Handle<Object> receiver = args.at<Object>(0);
2360 Handle<Name> key = args.at<Name>(1); 2355 Handle<Name> key = args.at<Name>(1);
2361 Handle<Object> value = args.at<Object>(2); 2356 Handle<Object> value = args.at<Object>(2);
2362 2357
2363 DCHECK(args.length() == 5 || args.length() == 6); 2358 DCHECK(args.length() == 5 || args.length() == 6);
2364 Handle<Smi> slot = args.at<Smi>(3); 2359 Handle<Smi> slot = args.at<Smi>(3);
2365 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); 2360 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
2366 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2361 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2367 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { 2362 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
2368 StoreICNexus nexus(vector, vector_slot); 2363 StoreICNexus nexus(vector, vector_slot);
2369 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2364 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2370 ic.UpdateState(receiver, key); 2365 ic.UpdateState(receiver, key);
2371 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2366 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2372 } else { 2367 } else {
2373 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, 2368 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
2374 vector->GetKind(vector_slot)); 2369 vector->GetKind(vector_slot));
2375 KeyedStoreICNexus nexus(vector, vector_slot); 2370 KeyedStoreICNexus nexus(vector, vector_slot);
2376 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2371 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2377 ic.UpdateState(receiver, key); 2372 ic.UpdateState(receiver, key);
2378 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2373 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2379 } 2374 }
2380 } 2375 }
2381 2376
2382 2377
2383 RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) { 2378 RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) {
2384 TimerEventScope<TimerEventIcMiss> timer(isolate); 2379 TimerEventScope<TimerEventIcMiss> timer(isolate);
2385 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2386 HandleScope scope(isolate); 2380 HandleScope scope(isolate);
2387 DCHECK_EQ(5, args.length()); 2381 DCHECK_EQ(5, args.length());
2388 typedef StoreWithVectorDescriptor Descriptor; 2382 typedef StoreWithVectorDescriptor Descriptor;
2389 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver); 2383 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver);
2390 Handle<Name> key = args.at<Name>(Descriptor::kName); 2384 Handle<Name> key = args.at<Name>(Descriptor::kName);
2391 Handle<Object> value = args.at<Object>(Descriptor::kValue); 2385 Handle<Object> value = args.at<Object>(Descriptor::kValue);
2392 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot); 2386 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot);
2393 Handle<TypeFeedbackVector> vector = 2387 Handle<TypeFeedbackVector> vector =
2394 args.at<TypeFeedbackVector>(Descriptor::kVector); 2388 args.at<TypeFeedbackVector>(Descriptor::kVector);
2395 2389
2396 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2390 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2397 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { 2391 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
2398 StoreICNexus nexus(vector, vector_slot); 2392 StoreICNexus nexus(vector, vector_slot);
2399 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2393 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2400 ic.UpdateState(receiver, key); 2394 ic.UpdateState(receiver, key);
2401 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2395 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2402 } else { 2396 } else {
2403 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, 2397 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
2404 vector->GetKind(vector_slot)); 2398 vector->GetKind(vector_slot));
2405 KeyedStoreICNexus nexus(vector, vector_slot); 2399 KeyedStoreICNexus nexus(vector, vector_slot);
2406 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2400 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2407 ic.UpdateState(receiver, key); 2401 ic.UpdateState(receiver, key);
2408 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2402 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2409 } 2403 }
2410 } 2404 }
2411 2405
2412 RUNTIME_FUNCTION(Runtime_TransitionStoreIC_MissFromStubFailure) { 2406 RUNTIME_FUNCTION(Runtime_TransitionStoreIC_MissFromStubFailure) {
2413 TimerEventScope<TimerEventIcMiss> timer(isolate); 2407 TimerEventScope<TimerEventIcMiss> timer(isolate);
2414 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2415 HandleScope scope(isolate); 2408 HandleScope scope(isolate);
2416 Handle<Object> receiver = args.at<Object>(0); 2409 Handle<Object> receiver = args.at<Object>(0);
2417 Handle<Name> key = args.at<Name>(1); 2410 Handle<Name> key = args.at<Name>(1);
2418 Handle<Object> value = args.at<Object>(2); 2411 Handle<Object> value = args.at<Object>(2);
2419 2412
2420 int length = args.length(); 2413 int length = args.length();
2421 DCHECK(length == 5 || length == 6); 2414 DCHECK(length == 5 || length == 6);
2422 // TODO(ishell): use VectorStoreTransitionDescriptor indices here and update 2415 // TODO(ishell): use VectorStoreTransitionDescriptor indices here and update
2423 // this comment: 2416 // this comment:
2424 // 2417 //
(...skipping 25 matching lines...) Expand all
2450 KeyedStoreICNexus nexus(vector, vector_slot); 2443 KeyedStoreICNexus nexus(vector, vector_slot);
2451 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2444 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2452 ic.UpdateState(receiver, key); 2445 ic.UpdateState(receiver, key);
2453 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2446 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2454 } 2447 }
2455 } 2448 }
2456 2449
2457 // Used from ic-<arch>.cc. 2450 // Used from ic-<arch>.cc.
2458 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) { 2451 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) {
2459 TimerEventScope<TimerEventIcMiss> timer(isolate); 2452 TimerEventScope<TimerEventIcMiss> timer(isolate);
2460 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2461 HandleScope scope(isolate); 2453 HandleScope scope(isolate);
2462 DCHECK_EQ(5, args.length()); 2454 DCHECK_EQ(5, args.length());
2463 Handle<Object> receiver = args.at<Object>(0); 2455 Handle<Object> receiver = args.at<Object>(0);
2464 Handle<Object> key = args.at<Object>(1); 2456 Handle<Object> key = args.at<Object>(1);
2465 Handle<Object> value = args.at<Object>(2); 2457 Handle<Object> value = args.at<Object>(2);
2466 Handle<Smi> slot = args.at<Smi>(3); 2458 Handle<Smi> slot = args.at<Smi>(3);
2467 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); 2459 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
2468 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2460 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2469 KeyedStoreICNexus nexus(vector, vector_slot); 2461 KeyedStoreICNexus nexus(vector, vector_slot);
2470 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2462 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2471 ic.UpdateState(receiver, key); 2463 ic.UpdateState(receiver, key);
2472 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); 2464 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value));
2473 } 2465 }
2474 2466
2475 2467
2476 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) { 2468 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) {
2477 TimerEventScope<TimerEventIcMiss> timer(isolate); 2469 TimerEventScope<TimerEventIcMiss> timer(isolate);
2478 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2479 HandleScope scope(isolate); 2470 HandleScope scope(isolate);
2480 DCHECK_EQ(5, args.length()); 2471 DCHECK_EQ(5, args.length());
2481 typedef StoreWithVectorDescriptor Descriptor; 2472 typedef StoreWithVectorDescriptor Descriptor;
2482 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver); 2473 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver);
2483 Handle<Object> key = args.at<Object>(Descriptor::kName); 2474 Handle<Object> key = args.at<Object>(Descriptor::kName);
2484 Handle<Object> value = args.at<Object>(Descriptor::kValue); 2475 Handle<Object> value = args.at<Object>(Descriptor::kValue);
2485 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot); 2476 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot);
2486 Handle<TypeFeedbackVector> vector = 2477 Handle<TypeFeedbackVector> vector =
2487 args.at<TypeFeedbackVector>(Descriptor::kVector); 2478 args.at<TypeFeedbackVector>(Descriptor::kVector);
2488 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2479 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
(...skipping 15 matching lines...) Expand all
2504 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2495 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2505 language_mode = ic.language_mode(); 2496 language_mode = ic.language_mode();
2506 RETURN_RESULT_OR_FAILURE( 2497 RETURN_RESULT_OR_FAILURE(
2507 isolate, 2498 isolate,
2508 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); 2499 Runtime::SetObjectProperty(isolate, object, key, value, language_mode));
2509 } 2500 }
2510 2501
2511 2502
2512 RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) { 2503 RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) {
2513 TimerEventScope<TimerEventIcMiss> timer(isolate); 2504 TimerEventScope<TimerEventIcMiss> timer(isolate);
2514 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2515 HandleScope scope(isolate); 2505 HandleScope scope(isolate);
2516 // Length == 5 or 6, depending on whether the vector slot 2506 // Length == 5 or 6, depending on whether the vector slot
2517 // is passed in a virtual register or not. 2507 // is passed in a virtual register or not.
2518 DCHECK(args.length() == 5 || args.length() == 6); 2508 DCHECK(args.length() == 5 || args.length() == 6);
2519 Handle<Object> object = args.at<Object>(0); 2509 Handle<Object> object = args.at<Object>(0);
2520 Handle<Object> key = args.at<Object>(1); 2510 Handle<Object> key = args.at<Object>(1);
2521 Handle<Object> value = args.at<Object>(2); 2511 Handle<Object> value = args.at<Object>(2);
2522 Handle<Map> map = args.at<Map>(3); 2512 Handle<Map> map = args.at<Map>(3);
2523 LanguageMode language_mode; 2513 LanguageMode language_mode;
2524 KeyedStoreICNexus nexus(isolate); 2514 KeyedStoreICNexus nexus(isolate);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2646 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { 2636 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) {
2647 PatchInlinedSmiCode(isolate(), address(), DISABLE_INLINED_SMI_CHECK); 2637 PatchInlinedSmiCode(isolate(), address(), DISABLE_INLINED_SMI_CHECK);
2648 } 2638 }
2649 2639
2650 return result; 2640 return result;
2651 } 2641 }
2652 2642
2653 2643
2654 RUNTIME_FUNCTION(Runtime_BinaryOpIC_Miss) { 2644 RUNTIME_FUNCTION(Runtime_BinaryOpIC_Miss) {
2655 TimerEventScope<TimerEventIcMiss> timer(isolate); 2645 TimerEventScope<TimerEventIcMiss> timer(isolate);
2656 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2657 HandleScope scope(isolate); 2646 HandleScope scope(isolate);
2658 DCHECK_EQ(2, args.length()); 2647 DCHECK_EQ(2, args.length());
2659 typedef BinaryOpDescriptor Descriptor; 2648 typedef BinaryOpDescriptor Descriptor;
2660 Handle<Object> left = args.at<Object>(Descriptor::kLeft); 2649 Handle<Object> left = args.at<Object>(Descriptor::kLeft);
2661 Handle<Object> right = args.at<Object>(Descriptor::kRight); 2650 Handle<Object> right = args.at<Object>(Descriptor::kRight);
2662 BinaryOpIC ic(isolate); 2651 BinaryOpIC ic(isolate);
2663 RETURN_RESULT_OR_FAILURE( 2652 RETURN_RESULT_OR_FAILURE(
2664 isolate, ic.Transition(Handle<AllocationSite>::null(), left, right)); 2653 isolate, ic.Transition(Handle<AllocationSite>::null(), left, right));
2665 } 2654 }
2666 2655
2667 2656
2668 RUNTIME_FUNCTION(Runtime_BinaryOpIC_MissWithAllocationSite) { 2657 RUNTIME_FUNCTION(Runtime_BinaryOpIC_MissWithAllocationSite) {
2669 TimerEventScope<TimerEventIcMiss> timer(isolate); 2658 TimerEventScope<TimerEventIcMiss> timer(isolate);
2670 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2671 HandleScope scope(isolate); 2659 HandleScope scope(isolate);
2672 DCHECK_EQ(3, args.length()); 2660 DCHECK_EQ(3, args.length());
2673 typedef BinaryOpWithAllocationSiteDescriptor Descriptor; 2661 typedef BinaryOpWithAllocationSiteDescriptor Descriptor;
2674 Handle<AllocationSite> allocation_site = 2662 Handle<AllocationSite> allocation_site =
2675 args.at<AllocationSite>(Descriptor::kAllocationSite); 2663 args.at<AllocationSite>(Descriptor::kAllocationSite);
2676 Handle<Object> left = args.at<Object>(Descriptor::kLeft); 2664 Handle<Object> left = args.at<Object>(Descriptor::kLeft);
2677 Handle<Object> right = args.at<Object>(Descriptor::kRight); 2665 Handle<Object> right = args.at<Object>(Descriptor::kRight);
2678 BinaryOpIC ic(isolate); 2666 BinaryOpIC ic(isolate);
2679 RETURN_RESULT_OR_FAILURE(isolate, 2667 RETURN_RESULT_OR_FAILURE(isolate,
2680 ic.Transition(allocation_site, left, right)); 2668 ic.Transition(allocation_site, left, right));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2725 PatchInlinedSmiCode(isolate(), address(), ENABLE_INLINED_SMI_CHECK); 2713 PatchInlinedSmiCode(isolate(), address(), ENABLE_INLINED_SMI_CHECK);
2726 } 2714 }
2727 2715
2728 return *new_target; 2716 return *new_target;
2729 } 2717 }
2730 2718
2731 2719
2732 // Used from CompareICStub::GenerateMiss in code-stubs-<arch>.cc. 2720 // Used from CompareICStub::GenerateMiss in code-stubs-<arch>.cc.
2733 RUNTIME_FUNCTION(Runtime_CompareIC_Miss) { 2721 RUNTIME_FUNCTION(Runtime_CompareIC_Miss) {
2734 TimerEventScope<TimerEventIcMiss> timer(isolate); 2722 TimerEventScope<TimerEventIcMiss> timer(isolate);
2735 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2736 HandleScope scope(isolate); 2723 HandleScope scope(isolate);
2737 DCHECK(args.length() == 3); 2724 DCHECK(args.length() == 3);
2738 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); 2725 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2)));
2739 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); 2726 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1));
2740 } 2727 }
2741 2728
2742 2729
2743 RUNTIME_FUNCTION(Runtime_Unreachable) { 2730 RUNTIME_FUNCTION(Runtime_Unreachable) {
2744 UNREACHABLE(); 2731 UNREACHABLE();
2745 CHECK(false); 2732 CHECK(false);
2746 return isolate->heap()->undefined_value(); 2733 return isolate->heap()->undefined_value();
2747 } 2734 }
2748 2735
2749 2736
2750 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { 2737 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) {
2751 ToBooleanICStub stub(isolate(), extra_ic_state()); 2738 ToBooleanICStub stub(isolate(), extra_ic_state());
2752 bool to_boolean_value = stub.UpdateStatus(object); 2739 bool to_boolean_value = stub.UpdateStatus(object);
2753 Handle<Code> code = stub.GetCode(); 2740 Handle<Code> code = stub.GetCode();
2754 set_target(*code); 2741 set_target(*code);
2755 return isolate()->factory()->ToBoolean(to_boolean_value); 2742 return isolate()->factory()->ToBoolean(to_boolean_value);
2756 } 2743 }
2757 2744
2758 2745
2759 RUNTIME_FUNCTION(Runtime_ToBooleanIC_Miss) { 2746 RUNTIME_FUNCTION(Runtime_ToBooleanIC_Miss) {
2760 TimerEventScope<TimerEventIcMiss> timer(isolate); 2747 TimerEventScope<TimerEventIcMiss> timer(isolate);
2761 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2762 DCHECK(args.length() == 1); 2748 DCHECK(args.length() == 1);
2763 HandleScope scope(isolate); 2749 HandleScope scope(isolate);
2764 Handle<Object> object = args.at<Object>(0); 2750 Handle<Object> object = args.at<Object>(0);
2765 ToBooleanIC ic(isolate); 2751 ToBooleanIC ic(isolate);
2766 return *ic.ToBoolean(object); 2752 return *ic.ToBoolean(object);
2767 } 2753 }
2768 2754
2769 2755
2770 RUNTIME_FUNCTION(Runtime_StoreCallbackProperty) { 2756 RUNTIME_FUNCTION(Runtime_StoreCallbackProperty) {
2771 Handle<JSObject> receiver = args.at<JSObject>(0); 2757 Handle<JSObject> receiver = args.at<JSObject>(0);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
2962 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 2948 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
2963 Object::GetProperty(&it)); 2949 Object::GetProperty(&it));
2964 } 2950 }
2965 2951
2966 return *result; 2952 return *result;
2967 } 2953 }
2968 2954
2969 2955
2970 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { 2956 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) {
2971 TimerEventScope<TimerEventIcMiss> timer(isolate); 2957 TimerEventScope<TimerEventIcMiss> timer(isolate);
2972 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss");
2973 HandleScope scope(isolate); 2958 HandleScope scope(isolate);
2974 DCHECK_EQ(4, args.length()); 2959 DCHECK_EQ(4, args.length());
2975 typedef LoadWithVectorDescriptor Descriptor; 2960 typedef LoadWithVectorDescriptor Descriptor;
2976 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver); 2961 Handle<Object> receiver = args.at<Object>(Descriptor::kReceiver);
2977 Handle<Name> key = args.at<Name>(Descriptor::kName); 2962 Handle<Name> key = args.at<Name>(Descriptor::kName);
2978 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot); 2963 Handle<Smi> slot = args.at<Smi>(Descriptor::kSlot);
2979 Handle<TypeFeedbackVector> vector = 2964 Handle<TypeFeedbackVector> vector =
2980 args.at<TypeFeedbackVector>(Descriptor::kVector); 2965 args.at<TypeFeedbackVector>(Descriptor::kVector);
2981 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2966 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2982 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the 2967 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the
2983 // LoadIC miss handler if the handler misses. Since the vector Nexus is 2968 // LoadIC miss handler if the handler misses. Since the vector Nexus is
2984 // set up outside the IC, handle that here. 2969 // set up outside the IC, handle that here.
2985 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { 2970 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) {
2986 LoadICNexus nexus(vector, vector_slot); 2971 LoadICNexus nexus(vector, vector_slot);
2987 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2972 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2988 ic.UpdateState(receiver, key); 2973 ic.UpdateState(receiver, key);
2989 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); 2974 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
2990 } else { 2975 } else {
2991 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, 2976 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC,
2992 vector->GetKind(vector_slot)); 2977 vector->GetKind(vector_slot));
2993 KeyedLoadICNexus nexus(vector, vector_slot); 2978 KeyedLoadICNexus nexus(vector, vector_slot);
2994 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2979 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2995 ic.UpdateState(receiver, key); 2980 ic.UpdateState(receiver, key);
2996 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); 2981 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
2997 } 2982 }
2998 } 2983 }
2999 } // namespace internal 2984 } // namespace internal
3000 } // namespace v8 2985 } // namespace v8
OLDNEW
« no previous file with comments | « src/full-codegen/full-codegen.cc ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698