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

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

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