| 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 |