| 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/arguments.h" | 9 #include "src/arguments.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 2331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2342 // | 2342 // |
| 2343 | 2343 |
| 2344 // Used from ic-<arch>.cc. | 2344 // Used from ic-<arch>.cc. |
| 2345 RUNTIME_FUNCTION(Runtime_CallIC_Miss) { | 2345 RUNTIME_FUNCTION(Runtime_CallIC_Miss) { |
| 2346 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2346 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2347 HandleScope scope(isolate); | 2347 HandleScope scope(isolate); |
| 2348 DCHECK(args.length() == 3); | 2348 DCHECK(args.length() == 3); |
| 2349 Handle<Object> function = args.at<Object>(0); | 2349 Handle<Object> function = args.at<Object>(0); |
| 2350 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); | 2350 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); |
| 2351 Handle<Smi> slot = args.at<Smi>(2); | 2351 Handle<Smi> slot = args.at<Smi>(2); |
| 2352 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2352 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2353 CallICNexus nexus(vector, vector_slot); | 2353 CallICNexus nexus(vector, vector_slot); |
| 2354 CallIC ic(isolate, &nexus); | 2354 CallIC ic(isolate, &nexus); |
| 2355 ic.HandleMiss(function); | 2355 ic.HandleMiss(function); |
| 2356 return *function; | 2356 return *function; |
| 2357 } | 2357 } |
| 2358 | 2358 |
| 2359 | 2359 |
| 2360 // Used from ic-<arch>.cc. | 2360 // Used from ic-<arch>.cc. |
| 2361 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { | 2361 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { |
| 2362 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2362 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2363 HandleScope scope(isolate); | 2363 HandleScope scope(isolate); |
| 2364 Handle<Object> receiver = args.at<Object>(0); | 2364 Handle<Object> receiver = args.at<Object>(0); |
| 2365 Handle<Name> key = args.at<Name>(1); | 2365 Handle<Name> key = args.at<Name>(1); |
| 2366 Handle<Object> result; | 2366 Handle<Object> result; |
| 2367 | 2367 |
| 2368 DCHECK(args.length() == 4); | 2368 DCHECK(args.length() == 4); |
| 2369 Handle<Smi> slot = args.at<Smi>(2); | 2369 Handle<Smi> slot = args.at<Smi>(2); |
| 2370 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2370 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2371 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2371 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2372 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the | 2372 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the |
| 2373 // LoadIC miss handler if the handler misses. Since the vector Nexus is | 2373 // LoadIC miss handler if the handler misses. Since the vector Nexus is |
| 2374 // set up outside the IC, handle that here. | 2374 // set up outside the IC, handle that here. |
| 2375 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { | 2375 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { |
| 2376 LoadICNexus nexus(vector, vector_slot); | 2376 LoadICNexus nexus(vector, vector_slot); |
| 2377 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2377 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2378 ic.UpdateState(receiver, key); | 2378 ic.UpdateState(receiver, key); |
| 2379 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2379 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2380 } else { | 2380 } else { |
| 2381 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 2381 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2393 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { | 2393 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { |
| 2394 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2394 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2395 HandleScope scope(isolate); | 2395 HandleScope scope(isolate); |
| 2396 Handle<Object> receiver = args.at<Object>(0); | 2396 Handle<Object> receiver = args.at<Object>(0); |
| 2397 Handle<Object> key = args.at<Object>(1); | 2397 Handle<Object> key = args.at<Object>(1); |
| 2398 Handle<Object> result; | 2398 Handle<Object> result; |
| 2399 | 2399 |
| 2400 DCHECK(args.length() == 4); | 2400 DCHECK(args.length() == 4); |
| 2401 Handle<Smi> slot = args.at<Smi>(2); | 2401 Handle<Smi> slot = args.at<Smi>(2); |
| 2402 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2402 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2403 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2403 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2404 KeyedLoadICNexus nexus(vector, vector_slot); | 2404 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2405 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2405 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2406 ic.UpdateState(receiver, key); | 2406 ic.UpdateState(receiver, key); |
| 2407 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2407 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2408 return *result; | 2408 return *result; |
| 2409 } | 2409 } |
| 2410 | 2410 |
| 2411 | 2411 |
| 2412 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) { | 2412 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) { |
| 2413 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2413 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2414 HandleScope scope(isolate); | 2414 HandleScope scope(isolate); |
| 2415 Handle<Object> receiver = args.at<Object>(0); | 2415 Handle<Object> receiver = args.at<Object>(0); |
| 2416 Handle<Object> key = args.at<Object>(1); | 2416 Handle<Object> key = args.at<Object>(1); |
| 2417 Handle<Object> result; | 2417 Handle<Object> result; |
| 2418 | 2418 |
| 2419 DCHECK(args.length() == 4); | 2419 DCHECK(args.length() == 4); |
| 2420 Handle<Smi> slot = args.at<Smi>(2); | 2420 Handle<Smi> slot = args.at<Smi>(2); |
| 2421 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2421 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2422 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2422 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2423 KeyedLoadICNexus nexus(vector, vector_slot); | 2423 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2424 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2424 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2425 ic.UpdateState(receiver, key); | 2425 ic.UpdateState(receiver, key); |
| 2426 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2426 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 2427 | 2427 |
| 2428 return *result; | 2428 return *result; |
| 2429 } | 2429 } |
| 2430 | 2430 |
| 2431 | 2431 |
| 2432 // Used from ic-<arch>.cc. | 2432 // Used from ic-<arch>.cc. |
| 2433 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { | 2433 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { |
| 2434 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2434 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2435 HandleScope scope(isolate); | 2435 HandleScope scope(isolate); |
| 2436 Handle<Object> receiver = args.at<Object>(0); | 2436 Handle<Object> receiver = args.at<Object>(0); |
| 2437 Handle<Name> key = args.at<Name>(1); | 2437 Handle<Name> key = args.at<Name>(1); |
| 2438 Handle<Object> value = args.at<Object>(2); | 2438 Handle<Object> value = args.at<Object>(2); |
| 2439 Handle<Object> result; | 2439 Handle<Object> result; |
| 2440 | 2440 |
| 2441 if (FLAG_vector_stores) { | 2441 if (FLAG_vector_stores) { |
| 2442 DCHECK(args.length() == 5 || args.length() == 6); | 2442 DCHECK(args.length() == 5 || args.length() == 6); |
| 2443 Handle<Smi> slot = args.at<Smi>(3); | 2443 Handle<Smi> slot = args.at<Smi>(3); |
| 2444 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2444 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2445 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2445 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2446 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { | 2446 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { |
| 2447 StoreICNexus nexus(vector, vector_slot); | 2447 StoreICNexus nexus(vector, vector_slot); |
| 2448 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2448 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2449 ic.UpdateState(receiver, key); | 2449 ic.UpdateState(receiver, key); |
| 2450 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2450 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 2451 ic.Store(receiver, key, value)); | 2451 ic.Store(receiver, key, value)); |
| 2452 } else { | 2452 } else { |
| 2453 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, | 2453 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, |
| 2454 vector->GetKind(vector_slot)); | 2454 vector->GetKind(vector_slot)); |
| 2455 KeyedStoreICNexus nexus(vector, vector_slot); | 2455 KeyedStoreICNexus nexus(vector, vector_slot); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2474 HandleScope scope(isolate); | 2474 HandleScope scope(isolate); |
| 2475 Handle<Object> receiver = args.at<Object>(0); | 2475 Handle<Object> receiver = args.at<Object>(0); |
| 2476 Handle<Name> key = args.at<Name>(1); | 2476 Handle<Name> key = args.at<Name>(1); |
| 2477 Handle<Object> value = args.at<Object>(2); | 2477 Handle<Object> value = args.at<Object>(2); |
| 2478 Handle<Object> result; | 2478 Handle<Object> result; |
| 2479 | 2479 |
| 2480 if (FLAG_vector_stores) { | 2480 if (FLAG_vector_stores) { |
| 2481 DCHECK(args.length() == 5 || args.length() == 6); | 2481 DCHECK(args.length() == 5 || args.length() == 6); |
| 2482 Handle<Smi> slot = args.at<Smi>(3); | 2482 Handle<Smi> slot = args.at<Smi>(3); |
| 2483 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2483 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2484 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2484 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2485 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { | 2485 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { |
| 2486 StoreICNexus nexus(vector, vector_slot); | 2486 StoreICNexus nexus(vector, vector_slot); |
| 2487 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2487 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2488 ic.UpdateState(receiver, key); | 2488 ic.UpdateState(receiver, key); |
| 2489 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2489 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 2490 ic.Store(receiver, key, value)); | 2490 ic.Store(receiver, key, value)); |
| 2491 } else { | 2491 } else { |
| 2492 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, | 2492 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, |
| 2493 vector->GetKind(vector_slot)); | 2493 vector->GetKind(vector_slot)); |
| 2494 KeyedStoreICNexus nexus(vector, vector_slot); | 2494 KeyedStoreICNexus nexus(vector, vector_slot); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2514 HandleScope scope(isolate); | 2514 HandleScope scope(isolate); |
| 2515 Handle<Object> receiver = args.at<Object>(0); | 2515 Handle<Object> receiver = args.at<Object>(0); |
| 2516 Handle<Object> key = args.at<Object>(1); | 2516 Handle<Object> key = args.at<Object>(1); |
| 2517 Handle<Object> value = args.at<Object>(2); | 2517 Handle<Object> value = args.at<Object>(2); |
| 2518 Handle<Object> result; | 2518 Handle<Object> result; |
| 2519 | 2519 |
| 2520 if (FLAG_vector_stores) { | 2520 if (FLAG_vector_stores) { |
| 2521 DCHECK(args.length() == 5); | 2521 DCHECK(args.length() == 5); |
| 2522 Handle<Smi> slot = args.at<Smi>(3); | 2522 Handle<Smi> slot = args.at<Smi>(3); |
| 2523 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2523 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2524 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2524 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2525 KeyedStoreICNexus nexus(vector, vector_slot); | 2525 KeyedStoreICNexus nexus(vector, vector_slot); |
| 2526 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2526 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2527 ic.UpdateState(receiver, key); | 2527 ic.UpdateState(receiver, key); |
| 2528 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2528 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 2529 ic.Store(receiver, key, value)); | 2529 ic.Store(receiver, key, value)); |
| 2530 } else { | 2530 } else { |
| 2531 DCHECK(args.length() == 3); | 2531 DCHECK(args.length() == 3); |
| 2532 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2532 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
| 2533 ic.UpdateState(receiver, key); | 2533 ic.UpdateState(receiver, key); |
| 2534 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2534 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 2535 ic.Store(receiver, key, value)); | 2535 ic.Store(receiver, key, value)); |
| 2536 } | 2536 } |
| 2537 return *result; | 2537 return *result; |
| 2538 } | 2538 } |
| 2539 | 2539 |
| 2540 | 2540 |
| 2541 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) { | 2541 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) { |
| 2542 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2542 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2543 HandleScope scope(isolate); | 2543 HandleScope scope(isolate); |
| 2544 Handle<Object> receiver = args.at<Object>(0); | 2544 Handle<Object> receiver = args.at<Object>(0); |
| 2545 Handle<Object> key = args.at<Object>(1); | 2545 Handle<Object> key = args.at<Object>(1); |
| 2546 Handle<Object> value = args.at<Object>(2); | 2546 Handle<Object> value = args.at<Object>(2); |
| 2547 Handle<Object> result; | 2547 Handle<Object> result; |
| 2548 | 2548 |
| 2549 if (FLAG_vector_stores) { | 2549 if (FLAG_vector_stores) { |
| 2550 DCHECK(args.length() == 5); | 2550 DCHECK(args.length() == 5); |
| 2551 Handle<Smi> slot = args.at<Smi>(3); | 2551 Handle<Smi> slot = args.at<Smi>(3); |
| 2552 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2552 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2553 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2553 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2554 KeyedStoreICNexus nexus(vector, vector_slot); | 2554 KeyedStoreICNexus nexus(vector, vector_slot); |
| 2555 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2555 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2556 ic.UpdateState(receiver, key); | 2556 ic.UpdateState(receiver, key); |
| 2557 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2557 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 2558 ic.Store(receiver, key, value)); | 2558 ic.Store(receiver, key, value)); |
| 2559 } else { | 2559 } else { |
| 2560 DCHECK(args.length() == 3); | 2560 DCHECK(args.length() == 3); |
| 2561 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2561 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
| 2562 ic.UpdateState(receiver, key); | 2562 ic.UpdateState(receiver, key); |
| 2563 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2563 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3102 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { | 3102 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { |
| 3103 TimerEventScope<TimerEventIcMiss> timer(isolate); | 3103 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 3104 HandleScope scope(isolate); | 3104 HandleScope scope(isolate); |
| 3105 Handle<Object> receiver = args.at<Object>(0); | 3105 Handle<Object> receiver = args.at<Object>(0); |
| 3106 Handle<Name> key = args.at<Name>(1); | 3106 Handle<Name> key = args.at<Name>(1); |
| 3107 Handle<Object> result; | 3107 Handle<Object> result; |
| 3108 | 3108 |
| 3109 DCHECK(args.length() == 4); | 3109 DCHECK(args.length() == 4); |
| 3110 Handle<Smi> slot = args.at<Smi>(2); | 3110 Handle<Smi> slot = args.at<Smi>(2); |
| 3111 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 3111 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 3112 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 3112 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 3113 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the | 3113 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the |
| 3114 // LoadIC miss handler if the handler misses. Since the vector Nexus is | 3114 // LoadIC miss handler if the handler misses. Since the vector Nexus is |
| 3115 // set up outside the IC, handle that here. | 3115 // set up outside the IC, handle that here. |
| 3116 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { | 3116 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { |
| 3117 LoadICNexus nexus(vector, vector_slot); | 3117 LoadICNexus nexus(vector, vector_slot); |
| 3118 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3118 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 3119 ic.UpdateState(receiver, key); | 3119 ic.UpdateState(receiver, key); |
| 3120 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 3120 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 3121 } else { | 3121 } else { |
| 3122 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 3122 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 3123 vector->GetKind(vector_slot)); | 3123 vector->GetKind(vector_slot)); |
| 3124 KeyedLoadICNexus nexus(vector, vector_slot); | 3124 KeyedLoadICNexus nexus(vector, vector_slot); |
| 3125 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3125 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 3126 ic.UpdateState(receiver, key); | 3126 ic.UpdateState(receiver, key); |
| 3127 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 3127 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
| 3128 } | 3128 } |
| 3129 | 3129 |
| 3130 return *result; | 3130 return *result; |
| 3131 } | 3131 } |
| 3132 } // namespace internal | 3132 } // namespace internal |
| 3133 } // namespace v8 | 3133 } // namespace v8 |
| OLD | NEW |