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/v8.h" | 5 #include "src/v8.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 2311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2322 | 2322 |
2323 | 2323 |
2324 #undef TRACE_IC | 2324 #undef TRACE_IC |
2325 | 2325 |
2326 | 2326 |
2327 // ---------------------------------------------------------------------------- | 2327 // ---------------------------------------------------------------------------- |
2328 // Static IC stub generators. | 2328 // Static IC stub generators. |
2329 // | 2329 // |
2330 | 2330 |
2331 // Used from ic-<arch>.cc. | 2331 // Used from ic-<arch>.cc. |
2332 RUNTIME_FUNCTION(CallIC_Miss) { | 2332 RUNTIME_FUNCTION(Runtime_CallIC_Miss) { |
2333 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2333 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2334 HandleScope scope(isolate); | 2334 HandleScope scope(isolate); |
2335 DCHECK(args.length() == 3); | 2335 DCHECK(args.length() == 3); |
2336 Handle<Object> function = args.at<Object>(0); | 2336 Handle<Object> function = args.at<Object>(0); |
2337 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); | 2337 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); |
2338 Handle<Smi> slot = args.at<Smi>(2); | 2338 Handle<Smi> slot = args.at<Smi>(2); |
2339 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2339 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); |
2340 CallICNexus nexus(vector, vector_slot); | 2340 CallICNexus nexus(vector, vector_slot); |
2341 CallIC ic(isolate, &nexus); | 2341 CallIC ic(isolate, &nexus); |
2342 ic.HandleMiss(function); | 2342 ic.HandleMiss(function); |
2343 return *function; | 2343 return *function; |
2344 } | 2344 } |
2345 | 2345 |
2346 | 2346 |
2347 RUNTIME_FUNCTION(CallIC_Customization_Miss) { | 2347 RUNTIME_FUNCTION(Runtime_CallIC_Customization_Miss) { |
2348 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2348 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2349 HandleScope scope(isolate); | 2349 HandleScope scope(isolate); |
2350 DCHECK(args.length() == 3); | 2350 DCHECK(args.length() == 3); |
2351 Handle<Object> function = args.at<Object>(0); | 2351 Handle<Object> function = args.at<Object>(0); |
2352 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); | 2352 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1); |
2353 Handle<Smi> slot = args.at<Smi>(2); | 2353 Handle<Smi> slot = args.at<Smi>(2); |
2354 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2354 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); |
2355 CallICNexus nexus(vector, vector_slot); | 2355 CallICNexus nexus(vector, vector_slot); |
2356 // A miss on a custom call ic always results in going megamorphic. | 2356 // A miss on a custom call ic always results in going megamorphic. |
2357 CallIC ic(isolate, &nexus); | 2357 CallIC ic(isolate, &nexus); |
2358 ic.PatchMegamorphic(function); | 2358 ic.PatchMegamorphic(function); |
2359 return *function; | 2359 return *function; |
2360 } | 2360 } |
2361 | 2361 |
2362 | 2362 |
2363 // Used from ic-<arch>.cc. | 2363 // Used from ic-<arch>.cc. |
2364 RUNTIME_FUNCTION(LoadIC_Miss) { | 2364 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { |
2365 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2365 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2366 HandleScope scope(isolate); | 2366 HandleScope scope(isolate); |
2367 Handle<Object> receiver = args.at<Object>(0); | 2367 Handle<Object> receiver = args.at<Object>(0); |
2368 Handle<Name> key = args.at<Name>(1); | 2368 Handle<Name> key = args.at<Name>(1); |
2369 Handle<Object> result; | 2369 Handle<Object> result; |
2370 | 2370 |
2371 DCHECK(args.length() == 4); | 2371 DCHECK(args.length() == 4); |
2372 Handle<Smi> slot = args.at<Smi>(2); | 2372 Handle<Smi> slot = args.at<Smi>(2); |
2373 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2373 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
2374 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2374 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); |
(...skipping 10 matching lines...) Expand all Loading... |
2385 KeyedLoadICNexus nexus(vector, vector_slot); | 2385 KeyedLoadICNexus nexus(vector, vector_slot); |
2386 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2386 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
2387 ic.UpdateState(receiver, key); | 2387 ic.UpdateState(receiver, key); |
2388 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2388 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
2389 } | 2389 } |
2390 return *result; | 2390 return *result; |
2391 } | 2391 } |
2392 | 2392 |
2393 | 2393 |
2394 // Used from ic-<arch>.cc | 2394 // Used from ic-<arch>.cc |
2395 RUNTIME_FUNCTION(KeyedLoadIC_Miss) { | 2395 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { |
2396 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2396 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2397 HandleScope scope(isolate); | 2397 HandleScope scope(isolate); |
2398 Handle<Object> receiver = args.at<Object>(0); | 2398 Handle<Object> receiver = args.at<Object>(0); |
2399 Handle<Object> key = args.at<Object>(1); | 2399 Handle<Object> key = args.at<Object>(1); |
2400 Handle<Object> result; | 2400 Handle<Object> result; |
2401 | 2401 |
2402 DCHECK(args.length() == 4); | 2402 DCHECK(args.length() == 4); |
2403 Handle<Smi> slot = args.at<Smi>(2); | 2403 Handle<Smi> slot = args.at<Smi>(2); |
2404 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2404 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
2405 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2405 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); |
2406 KeyedLoadICNexus nexus(vector, vector_slot); | 2406 KeyedLoadICNexus nexus(vector, vector_slot); |
2407 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2407 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
2408 ic.UpdateState(receiver, key); | 2408 ic.UpdateState(receiver, key); |
2409 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2409 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
2410 return *result; | 2410 return *result; |
2411 } | 2411 } |
2412 | 2412 |
2413 | 2413 |
2414 RUNTIME_FUNCTION(KeyedLoadIC_MissFromStubFailure) { | 2414 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) { |
2415 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2415 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2416 HandleScope scope(isolate); | 2416 HandleScope scope(isolate); |
2417 Handle<Object> receiver = args.at<Object>(0); | 2417 Handle<Object> receiver = args.at<Object>(0); |
2418 Handle<Object> key = args.at<Object>(1); | 2418 Handle<Object> key = args.at<Object>(1); |
2419 Handle<Object> result; | 2419 Handle<Object> result; |
2420 | 2420 |
2421 DCHECK(args.length() == 4); | 2421 DCHECK(args.length() == 4); |
2422 Handle<Smi> slot = args.at<Smi>(2); | 2422 Handle<Smi> slot = args.at<Smi>(2); |
2423 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2423 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
2424 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 2424 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); |
2425 KeyedLoadICNexus nexus(vector, vector_slot); | 2425 KeyedLoadICNexus nexus(vector, vector_slot); |
2426 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2426 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
2427 ic.UpdateState(receiver, key); | 2427 ic.UpdateState(receiver, key); |
2428 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2428 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
2429 | 2429 |
2430 return *result; | 2430 return *result; |
2431 } | 2431 } |
2432 | 2432 |
2433 | 2433 |
2434 // Used from ic-<arch>.cc. | 2434 // Used from ic-<arch>.cc. |
2435 RUNTIME_FUNCTION(StoreIC_Miss) { | 2435 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { |
2436 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2436 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2437 HandleScope scope(isolate); | 2437 HandleScope scope(isolate); |
2438 Handle<Object> receiver = args.at<Object>(0); | 2438 Handle<Object> receiver = args.at<Object>(0); |
2439 Handle<Name> key = args.at<Name>(1); | 2439 Handle<Name> key = args.at<Name>(1); |
2440 Handle<Object> value = args.at<Object>(2); | 2440 Handle<Object> value = args.at<Object>(2); |
2441 Handle<Object> result; | 2441 Handle<Object> result; |
2442 | 2442 |
2443 if (FLAG_vector_stores) { | 2443 if (FLAG_vector_stores) { |
2444 DCHECK(args.length() == 5); | 2444 DCHECK(args.length() == 5); |
2445 Handle<Smi> slot = args.at<Smi>(3); | 2445 Handle<Smi> slot = args.at<Smi>(3); |
(...skipping 17 matching lines...) Expand all Loading... |
2463 DCHECK(args.length() == 3); | 2463 DCHECK(args.length() == 3); |
2464 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2464 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
2465 ic.UpdateState(receiver, key); | 2465 ic.UpdateState(receiver, key); |
2466 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2466 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
2467 ic.Store(receiver, key, value)); | 2467 ic.Store(receiver, key, value)); |
2468 } | 2468 } |
2469 return *result; | 2469 return *result; |
2470 } | 2470 } |
2471 | 2471 |
2472 | 2472 |
2473 RUNTIME_FUNCTION(StoreIC_MissFromStubFailure) { | 2473 RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) { |
2474 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2474 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2475 HandleScope scope(isolate); | 2475 HandleScope scope(isolate); |
2476 Handle<Object> receiver = args.at<Object>(0); | 2476 Handle<Object> receiver = args.at<Object>(0); |
2477 Handle<Name> key = args.at<Name>(1); | 2477 Handle<Name> key = args.at<Name>(1); |
2478 Handle<Object> value = args.at<Object>(2); | 2478 Handle<Object> value = args.at<Object>(2); |
2479 Handle<Object> result; | 2479 Handle<Object> result; |
2480 | 2480 |
2481 if (FLAG_vector_stores) { | 2481 if (FLAG_vector_stores) { |
2482 DCHECK(args.length() == 5); | 2482 DCHECK(args.length() == 5); |
2483 Handle<Smi> slot = args.at<Smi>(3); | 2483 Handle<Smi> slot = args.at<Smi>(3); |
(...skipping 18 matching lines...) Expand all Loading... |
2502 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2502 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
2503 ic.UpdateState(receiver, key); | 2503 ic.UpdateState(receiver, key); |
2504 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2504 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
2505 ic.Store(receiver, key, value)); | 2505 ic.Store(receiver, key, value)); |
2506 } | 2506 } |
2507 return *result; | 2507 return *result; |
2508 } | 2508 } |
2509 | 2509 |
2510 | 2510 |
2511 // Used from ic-<arch>.cc. | 2511 // Used from ic-<arch>.cc. |
2512 RUNTIME_FUNCTION(KeyedStoreIC_Miss) { | 2512 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) { |
2513 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2513 TimerEventScope<TimerEventIcMiss> timer(isolate); |
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 FeedbackVectorICSlot vector_slot = vector->ToICSlot(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(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 FeedbackVectorICSlot vector_slot = vector->ToICSlot(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( |
2564 isolate, result, ic.Store(receiver, key, args.at<Object>(2))); | 2564 isolate, result, ic.Store(receiver, key, args.at<Object>(2))); |
2565 } | 2565 } |
2566 return *result; | 2566 return *result; |
2567 } | 2567 } |
2568 | 2568 |
2569 | 2569 |
2570 RUNTIME_FUNCTION(StoreIC_Slow) { | 2570 RUNTIME_FUNCTION(Runtime_StoreIC_Slow) { |
2571 HandleScope scope(isolate); | 2571 HandleScope scope(isolate); |
2572 DCHECK(args.length() == 3); | 2572 DCHECK(args.length() == 3); |
2573 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2573 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
2574 Handle<Object> object = args.at<Object>(0); | 2574 Handle<Object> object = args.at<Object>(0); |
2575 Handle<Object> key = args.at<Object>(1); | 2575 Handle<Object> key = args.at<Object>(1); |
2576 Handle<Object> value = args.at<Object>(2); | 2576 Handle<Object> value = args.at<Object>(2); |
2577 LanguageMode language_mode = ic.language_mode(); | 2577 LanguageMode language_mode = ic.language_mode(); |
2578 Handle<Object> result; | 2578 Handle<Object> result; |
2579 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2579 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2580 isolate, result, | 2580 isolate, result, |
2581 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); | 2581 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
2582 return *result; | 2582 return *result; |
2583 } | 2583 } |
2584 | 2584 |
2585 | 2585 |
2586 RUNTIME_FUNCTION(KeyedStoreIC_Slow) { | 2586 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) { |
2587 HandleScope scope(isolate); | 2587 HandleScope scope(isolate); |
2588 DCHECK(args.length() == 3); | 2588 DCHECK(args.length() == 3); |
2589 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 2589 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
2590 Handle<Object> object = args.at<Object>(0); | 2590 Handle<Object> object = args.at<Object>(0); |
2591 Handle<Object> key = args.at<Object>(1); | 2591 Handle<Object> key = args.at<Object>(1); |
2592 Handle<Object> value = args.at<Object>(2); | 2592 Handle<Object> value = args.at<Object>(2); |
2593 LanguageMode language_mode = ic.language_mode(); | 2593 LanguageMode language_mode = ic.language_mode(); |
2594 Handle<Object> result; | 2594 Handle<Object> result; |
2595 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2595 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2596 isolate, result, | 2596 isolate, result, |
2597 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); | 2597 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
2598 return *result; | 2598 return *result; |
2599 } | 2599 } |
2600 | 2600 |
2601 | 2601 |
2602 RUNTIME_FUNCTION(ElementsTransitionAndStoreIC_Miss) { | 2602 RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) { |
2603 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2603 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2604 HandleScope scope(isolate); | 2604 HandleScope scope(isolate); |
2605 DCHECK(args.length() == 4); | 2605 DCHECK(args.length() == 4); |
2606 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); | 2606 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate); |
2607 Handle<Object> value = args.at<Object>(0); | 2607 Handle<Object> value = args.at<Object>(0); |
2608 Handle<Map> map = args.at<Map>(1); | 2608 Handle<Map> map = args.at<Map>(1); |
2609 Handle<Object> key = args.at<Object>(2); | 2609 Handle<Object> key = args.at<Object>(2); |
2610 Handle<Object> object = args.at<Object>(3); | 2610 Handle<Object> object = args.at<Object>(3); |
2611 LanguageMode language_mode = ic.language_mode(); | 2611 LanguageMode language_mode = ic.language_mode(); |
2612 if (object->IsJSObject()) { | 2612 if (object->IsJSObject()) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2689 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { | 2689 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { |
2690 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2690 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
2691 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { | 2691 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { |
2692 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); | 2692 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); |
2693 } | 2693 } |
2694 | 2694 |
2695 return result; | 2695 return result; |
2696 } | 2696 } |
2697 | 2697 |
2698 | 2698 |
2699 RUNTIME_FUNCTION(BinaryOpIC_Miss) { | 2699 RUNTIME_FUNCTION(Runtime_BinaryOpIC_Miss) { |
2700 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2700 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2701 HandleScope scope(isolate); | 2701 HandleScope scope(isolate); |
2702 DCHECK_EQ(2, args.length()); | 2702 DCHECK_EQ(2, args.length()); |
2703 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); | 2703 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); |
2704 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); | 2704 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); |
2705 BinaryOpIC ic(isolate); | 2705 BinaryOpIC ic(isolate); |
2706 Handle<Object> result; | 2706 Handle<Object> result; |
2707 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2707 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2708 isolate, result, | 2708 isolate, result, |
2709 ic.Transition(Handle<AllocationSite>::null(), left, right)); | 2709 ic.Transition(Handle<AllocationSite>::null(), left, right)); |
2710 return *result; | 2710 return *result; |
2711 } | 2711 } |
2712 | 2712 |
2713 | 2713 |
2714 RUNTIME_FUNCTION(BinaryOpIC_MissWithAllocationSite) { | 2714 RUNTIME_FUNCTION(Runtime_BinaryOpIC_MissWithAllocationSite) { |
2715 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2715 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2716 HandleScope scope(isolate); | 2716 HandleScope scope(isolate); |
2717 DCHECK_EQ(3, args.length()); | 2717 DCHECK_EQ(3, args.length()); |
2718 Handle<AllocationSite> allocation_site = | 2718 Handle<AllocationSite> allocation_site = |
2719 args.at<AllocationSite>(BinaryOpWithAllocationSiteStub::kAllocationSite); | 2719 args.at<AllocationSite>(BinaryOpWithAllocationSiteStub::kAllocationSite); |
2720 Handle<Object> left = args.at<Object>(BinaryOpWithAllocationSiteStub::kLeft); | 2720 Handle<Object> left = args.at<Object>(BinaryOpWithAllocationSiteStub::kLeft); |
2721 Handle<Object> right = | 2721 Handle<Object> right = |
2722 args.at<Object>(BinaryOpWithAllocationSiteStub::kRight); | 2722 args.at<Object>(BinaryOpWithAllocationSiteStub::kRight); |
2723 BinaryOpIC ic(isolate); | 2723 BinaryOpIC ic(isolate); |
2724 Handle<Object> result; | 2724 Handle<Object> result; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2783 // Activate inlined smi code. | 2783 // Activate inlined smi code. |
2784 if (old_stub.state() == CompareICState::UNINITIALIZED) { | 2784 if (old_stub.state() == CompareICState::UNINITIALIZED) { |
2785 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2785 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
2786 } | 2786 } |
2787 | 2787 |
2788 return *new_target; | 2788 return *new_target; |
2789 } | 2789 } |
2790 | 2790 |
2791 | 2791 |
2792 // Used from CompareICStub::GenerateMiss in code-stubs-<arch>.cc. | 2792 // Used from CompareICStub::GenerateMiss in code-stubs-<arch>.cc. |
2793 RUNTIME_FUNCTION(CompareIC_Miss) { | 2793 RUNTIME_FUNCTION(Runtime_CompareIC_Miss) { |
2794 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2794 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2795 HandleScope scope(isolate); | 2795 HandleScope scope(isolate); |
2796 DCHECK(args.length() == 3); | 2796 DCHECK(args.length() == 3); |
2797 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); | 2797 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); |
2798 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); | 2798 return ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); |
2799 } | 2799 } |
2800 | 2800 |
2801 | 2801 |
2802 void CompareNilIC::Clear(Address address, Code* target, Address constant_pool) { | 2802 void CompareNilIC::Clear(Address address, Code* target, Address constant_pool) { |
2803 if (IsCleared(target)) return; | 2803 if (IsCleared(target)) return; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2844 : HeapObject::cast(*object)->map()); | 2844 : HeapObject::cast(*object)->map()); |
2845 code = PropertyICCompiler::ComputeCompareNil(monomorphic_map, &stub); | 2845 code = PropertyICCompiler::ComputeCompareNil(monomorphic_map, &stub); |
2846 } else { | 2846 } else { |
2847 code = stub.GetCode(); | 2847 code = stub.GetCode(); |
2848 } | 2848 } |
2849 set_target(*code); | 2849 set_target(*code); |
2850 return DoCompareNilSlow(isolate(), nil, object); | 2850 return DoCompareNilSlow(isolate(), nil, object); |
2851 } | 2851 } |
2852 | 2852 |
2853 | 2853 |
2854 RUNTIME_FUNCTION(CompareNilIC_Miss) { | 2854 RUNTIME_FUNCTION(Runtime_CompareNilIC_Miss) { |
2855 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2855 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2856 HandleScope scope(isolate); | 2856 HandleScope scope(isolate); |
2857 Handle<Object> object = args.at<Object>(0); | 2857 Handle<Object> object = args.at<Object>(0); |
2858 CompareNilIC ic(isolate); | 2858 CompareNilIC ic(isolate); |
2859 return *ic.CompareNil(object); | 2859 return *ic.CompareNil(object); |
2860 } | 2860 } |
2861 | 2861 |
2862 | 2862 |
2863 RUNTIME_FUNCTION(Unreachable) { | 2863 RUNTIME_FUNCTION(Runtime_Unreachable) { |
2864 UNREACHABLE(); | 2864 UNREACHABLE(); |
2865 CHECK(false); | 2865 CHECK(false); |
2866 return isolate->heap()->undefined_value(); | 2866 return isolate->heap()->undefined_value(); |
2867 } | 2867 } |
2868 | 2868 |
2869 | 2869 |
2870 Builtins::JavaScript BinaryOpIC::TokenToJSBuiltin(Token::Value op, | 2870 Builtins::JavaScript BinaryOpIC::TokenToJSBuiltin(Token::Value op, |
2871 Strength strength) { | 2871 Strength strength) { |
2872 if (is_strong(strength)) { | 2872 if (is_strong(strength)) { |
2873 switch (op) { | 2873 switch (op) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2905 | 2905 |
2906 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { | 2906 Handle<Object> ToBooleanIC::ToBoolean(Handle<Object> object) { |
2907 ToBooleanStub stub(isolate(), target()->extra_ic_state()); | 2907 ToBooleanStub stub(isolate(), target()->extra_ic_state()); |
2908 bool to_boolean_value = stub.UpdateStatus(object); | 2908 bool to_boolean_value = stub.UpdateStatus(object); |
2909 Handle<Code> code = stub.GetCode(); | 2909 Handle<Code> code = stub.GetCode(); |
2910 set_target(*code); | 2910 set_target(*code); |
2911 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); | 2911 return handle(Smi::FromInt(to_boolean_value ? 1 : 0), isolate()); |
2912 } | 2912 } |
2913 | 2913 |
2914 | 2914 |
2915 RUNTIME_FUNCTION(ToBooleanIC_Miss) { | 2915 RUNTIME_FUNCTION(Runtime_ToBooleanIC_Miss) { |
2916 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2916 TimerEventScope<TimerEventIcMiss> timer(isolate); |
2917 DCHECK(args.length() == 1); | 2917 DCHECK(args.length() == 1); |
2918 HandleScope scope(isolate); | 2918 HandleScope scope(isolate); |
2919 Handle<Object> object = args.at<Object>(0); | 2919 Handle<Object> object = args.at<Object>(0); |
2920 ToBooleanIC ic(isolate); | 2920 ToBooleanIC ic(isolate); |
2921 return *ic.ToBoolean(object); | 2921 return *ic.ToBoolean(object); |
2922 } | 2922 } |
2923 | 2923 |
2924 | 2924 |
2925 RUNTIME_FUNCTION(StoreCallbackProperty) { | 2925 RUNTIME_FUNCTION(Runtime_StoreCallbackProperty) { |
2926 Handle<JSObject> receiver = args.at<JSObject>(0); | 2926 Handle<JSObject> receiver = args.at<JSObject>(0); |
2927 Handle<JSObject> holder = args.at<JSObject>(1); | 2927 Handle<JSObject> holder = args.at<JSObject>(1); |
2928 Handle<HeapObject> callback_or_cell = args.at<HeapObject>(2); | 2928 Handle<HeapObject> callback_or_cell = args.at<HeapObject>(2); |
2929 Handle<Name> name = args.at<Name>(3); | 2929 Handle<Name> name = args.at<Name>(3); |
2930 Handle<Object> value = args.at<Object>(4); | 2930 Handle<Object> value = args.at<Object>(4); |
2931 HandleScope scope(isolate); | 2931 HandleScope scope(isolate); |
2932 | 2932 |
2933 Handle<ExecutableAccessorInfo> callback( | 2933 Handle<ExecutableAccessorInfo> callback( |
2934 callback_or_cell->IsWeakCell() | 2934 callback_or_cell->IsWeakCell() |
2935 ? ExecutableAccessorInfo::cast( | 2935 ? ExecutableAccessorInfo::cast( |
(...skipping 16 matching lines...) Expand all Loading... |
2952 } | 2952 } |
2953 | 2953 |
2954 | 2954 |
2955 /** | 2955 /** |
2956 * Attempts to load a property with an interceptor (which must be present), | 2956 * Attempts to load a property with an interceptor (which must be present), |
2957 * but doesn't search the prototype chain. | 2957 * but doesn't search the prototype chain. |
2958 * | 2958 * |
2959 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't | 2959 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't |
2960 * provide any value for the given name. | 2960 * provide any value for the given name. |
2961 */ | 2961 */ |
2962 RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly) { | 2962 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptorOnly) { |
2963 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 2963 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
2964 Handle<Name> name = | 2964 Handle<Name> name = |
2965 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); | 2965 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
2966 Handle<JSObject> receiver = | 2966 Handle<JSObject> receiver = |
2967 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); | 2967 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
2968 Handle<JSObject> holder = | 2968 Handle<JSObject> holder = |
2969 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); | 2969 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
2970 HandleScope scope(isolate); | 2970 HandleScope scope(isolate); |
2971 LookupIterator it(receiver, name, holder, LookupIterator::OWN); | 2971 LookupIterator it(receiver, name, holder, LookupIterator::OWN); |
2972 bool done; | 2972 bool done; |
2973 Handle<Object> result; | 2973 Handle<Object> result; |
2974 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2974 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2975 isolate, result, JSObject::GetPropertyWithInterceptor(&it, &done)); | 2975 isolate, result, JSObject::GetPropertyWithInterceptor(&it, &done)); |
2976 if (done) return *result; | 2976 if (done) return *result; |
2977 return isolate->heap()->no_interceptor_result_sentinel(); | 2977 return isolate->heap()->no_interceptor_result_sentinel(); |
2978 } | 2978 } |
2979 | 2979 |
2980 | 2980 |
2981 /** | 2981 /** |
2982 * Loads a property with an interceptor performing post interceptor | 2982 * Loads a property with an interceptor performing post interceptor |
2983 * lookup if interceptor failed. | 2983 * lookup if interceptor failed. |
2984 */ | 2984 */ |
2985 RUNTIME_FUNCTION(LoadPropertyWithInterceptor) { | 2985 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { |
2986 HandleScope scope(isolate); | 2986 HandleScope scope(isolate); |
2987 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 2987 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); |
2988 Handle<Name> name = | 2988 Handle<Name> name = |
2989 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); | 2989 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
2990 Handle<JSObject> receiver = | 2990 Handle<JSObject> receiver = |
2991 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); | 2991 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
2992 Handle<JSObject> holder = | 2992 Handle<JSObject> holder = |
2993 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); | 2993 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
2994 | 2994 |
2995 Handle<Object> result; | 2995 Handle<Object> result; |
(...skipping 10 matching lines...) Expand all Loading... |
3006 if (!ic.ShouldThrowReferenceError(it.GetReceiver())) { | 3006 if (!ic.ShouldThrowReferenceError(it.GetReceiver())) { |
3007 return isolate->heap()->undefined_value(); | 3007 return isolate->heap()->undefined_value(); |
3008 } | 3008 } |
3009 | 3009 |
3010 // Throw a reference error. | 3010 // Throw a reference error. |
3011 THROW_NEW_ERROR_RETURN_FAILURE( | 3011 THROW_NEW_ERROR_RETURN_FAILURE( |
3012 isolate, NewReferenceError(MessageTemplate::kNotDefined, it.name())); | 3012 isolate, NewReferenceError(MessageTemplate::kNotDefined, it.name())); |
3013 } | 3013 } |
3014 | 3014 |
3015 | 3015 |
3016 RUNTIME_FUNCTION(StorePropertyWithInterceptor) { | 3016 RUNTIME_FUNCTION(Runtime_StorePropertyWithInterceptor) { |
3017 HandleScope scope(isolate); | 3017 HandleScope scope(isolate); |
3018 DCHECK(args.length() == 3); | 3018 DCHECK(args.length() == 3); |
3019 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); | 3019 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); |
3020 Handle<JSObject> receiver = args.at<JSObject>(0); | 3020 Handle<JSObject> receiver = args.at<JSObject>(0); |
3021 Handle<Name> name = args.at<Name>(1); | 3021 Handle<Name> name = args.at<Name>(1); |
3022 Handle<Object> value = args.at<Object>(2); | 3022 Handle<Object> value = args.at<Object>(2); |
3023 #ifdef DEBUG | 3023 #ifdef DEBUG |
3024 PrototypeIterator iter(isolate, receiver, | 3024 PrototypeIterator iter(isolate, receiver, |
3025 PrototypeIterator::START_AT_RECEIVER); | 3025 PrototypeIterator::START_AT_RECEIVER); |
3026 bool found = false; | 3026 bool found = false; |
3027 for (; !iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN); iter.Advance()) { | 3027 for (; !iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN); iter.Advance()) { |
3028 Handle<Object> current = PrototypeIterator::GetCurrent(iter); | 3028 Handle<Object> current = PrototypeIterator::GetCurrent(iter); |
3029 if (current->IsJSObject() && | 3029 if (current->IsJSObject() && |
3030 Handle<JSObject>::cast(current)->HasNamedInterceptor()) { | 3030 Handle<JSObject>::cast(current)->HasNamedInterceptor()) { |
3031 found = true; | 3031 found = true; |
3032 break; | 3032 break; |
3033 } | 3033 } |
3034 } | 3034 } |
3035 DCHECK(found); | 3035 DCHECK(found); |
3036 #endif | 3036 #endif |
3037 Handle<Object> result; | 3037 Handle<Object> result; |
3038 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 3038 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
3039 isolate, result, | 3039 isolate, result, |
3040 JSObject::SetProperty(receiver, name, value, ic.language_mode())); | 3040 JSObject::SetProperty(receiver, name, value, ic.language_mode())); |
3041 return *result; | 3041 return *result; |
3042 } | 3042 } |
3043 | 3043 |
3044 | 3044 |
3045 RUNTIME_FUNCTION(LoadElementWithInterceptor) { | 3045 RUNTIME_FUNCTION(Runtime_LoadElementWithInterceptor) { |
3046 // TODO(verwaest): This should probably get the holder and receiver as input. | 3046 // TODO(verwaest): This should probably get the holder and receiver as input. |
3047 HandleScope scope(isolate); | 3047 HandleScope scope(isolate); |
3048 Handle<JSObject> receiver = args.at<JSObject>(0); | 3048 Handle<JSObject> receiver = args.at<JSObject>(0); |
3049 DCHECK(args.smi_at(1) >= 0); | 3049 DCHECK(args.smi_at(1) >= 0); |
3050 uint32_t index = args.smi_at(1); | 3050 uint32_t index = args.smi_at(1); |
3051 Handle<Object> result; | 3051 Handle<Object> result; |
3052 // TODO(conradw): Investigate strong mode semantics for this. | 3052 // TODO(conradw): Investigate strong mode semantics for this. |
3053 LanguageMode language_mode = SLOPPY; | 3053 LanguageMode language_mode = SLOPPY; |
3054 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 3054 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
3055 isolate, result, | 3055 isolate, result, |
3056 Object::GetElement(isolate, receiver, index, language_mode)); | 3056 Object::GetElement(isolate, receiver, index, language_mode)); |
3057 return *result; | 3057 return *result; |
3058 } | 3058 } |
3059 | 3059 |
3060 | 3060 |
3061 RUNTIME_FUNCTION(LoadIC_MissFromStubFailure) { | 3061 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { |
3062 TimerEventScope<TimerEventIcMiss> timer(isolate); | 3062 TimerEventScope<TimerEventIcMiss> timer(isolate); |
3063 HandleScope scope(isolate); | 3063 HandleScope scope(isolate); |
3064 Handle<Object> receiver = args.at<Object>(0); | 3064 Handle<Object> receiver = args.at<Object>(0); |
3065 Handle<Name> key = args.at<Name>(1); | 3065 Handle<Name> key = args.at<Name>(1); |
3066 Handle<Object> result; | 3066 Handle<Object> result; |
3067 | 3067 |
3068 DCHECK(args.length() == 4); | 3068 DCHECK(args.length() == 4); |
3069 Handle<Smi> slot = args.at<Smi>(2); | 3069 Handle<Smi> slot = args.at<Smi>(2); |
3070 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 3070 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
3071 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); | 3071 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); |
3072 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the | 3072 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the |
3073 // LoadIC miss handler if the handler misses. Since the vector Nexus is | 3073 // LoadIC miss handler if the handler misses. Since the vector Nexus is |
3074 // set up outside the IC, handle that here. | 3074 // set up outside the IC, handle that here. |
3075 if (vector->GetKind(vector_slot) == Code::LOAD_IC) { | 3075 if (vector->GetKind(vector_slot) == Code::LOAD_IC) { |
3076 LoadICNexus nexus(vector, vector_slot); | 3076 LoadICNexus nexus(vector, vector_slot); |
3077 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3077 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
3078 ic.UpdateState(receiver, key); | 3078 ic.UpdateState(receiver, key); |
3079 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 3079 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
3080 } else { | 3080 } else { |
3081 DCHECK(vector->GetKind(vector_slot) == Code::KEYED_LOAD_IC); | 3081 DCHECK(vector->GetKind(vector_slot) == Code::KEYED_LOAD_IC); |
3082 KeyedLoadICNexus nexus(vector, vector_slot); | 3082 KeyedLoadICNexus nexus(vector, vector_slot); |
3083 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 3083 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
3084 ic.UpdateState(receiver, key); | 3084 ic.UpdateState(receiver, key); |
3085 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 3085 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
3086 } | 3086 } |
3087 | 3087 |
3088 return *result; | 3088 return *result; |
3089 } | 3089 } |
3090 | |
3091 | |
3092 static const Address IC_utilities[] = { | |
3093 #define ADDR(name) FUNCTION_ADDR(name), | |
3094 IC_UTIL_LIST(ADDR) NULL | |
3095 #undef ADDR | |
3096 }; | |
3097 | |
3098 | |
3099 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; } | |
3100 } // namespace internal | 3090 } // namespace internal |
3101 } // namespace v8 | 3091 } // namespace v8 |
OLD | NEW |