| 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/api-arguments.h" | 9 #include "src/api-arguments.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 2241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2252 } | 2252 } |
| 2253 | 2253 |
| 2254 | 2254 |
| 2255 // Used from ic-<arch>.cc. | 2255 // Used from ic-<arch>.cc. |
| 2256 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { | 2256 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { |
| 2257 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2257 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2258 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2258 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2259 HandleScope scope(isolate); | 2259 HandleScope scope(isolate); |
| 2260 Handle<Object> receiver = args.at<Object>(0); | 2260 Handle<Object> receiver = args.at<Object>(0); |
| 2261 Handle<Name> key = args.at<Name>(1); | 2261 Handle<Name> key = args.at<Name>(1); |
| 2262 Handle<Object> result; | |
| 2263 | 2262 |
| 2264 DCHECK(args.length() == 4); | 2263 DCHECK(args.length() == 4); |
| 2265 Handle<Smi> slot = args.at<Smi>(2); | 2264 Handle<Smi> slot = args.at<Smi>(2); |
| 2266 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2265 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2267 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2266 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2268 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the | 2267 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the |
| 2269 // LoadIC miss handler if the handler misses. Since the vector Nexus is | 2268 // LoadIC miss handler if the handler misses. Since the vector Nexus is |
| 2270 // set up outside the IC, handle that here. | 2269 // set up outside the IC, handle that here. |
| 2271 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { | 2270 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { |
| 2272 LoadICNexus nexus(vector, vector_slot); | 2271 LoadICNexus nexus(vector, vector_slot); |
| 2273 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2272 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2274 ic.UpdateState(receiver, key); | 2273 ic.UpdateState(receiver, key); |
| 2275 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2274 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2276 } else { | 2275 } else { |
| 2277 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 2276 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 2278 vector->GetKind(vector_slot)); | 2277 vector->GetKind(vector_slot)); |
| 2279 KeyedLoadICNexus nexus(vector, vector_slot); | 2278 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2280 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2279 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2281 ic.UpdateState(receiver, key); | 2280 ic.UpdateState(receiver, key); |
| 2282 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2281 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2283 } | 2282 } |
| 2284 return *result; | |
| 2285 } | 2283 } |
| 2286 | 2284 |
| 2287 | 2285 |
| 2288 // Used from ic-<arch>.cc | 2286 // Used from ic-<arch>.cc |
| 2289 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { | 2287 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { |
| 2290 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2288 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2291 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2289 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2292 HandleScope scope(isolate); | 2290 HandleScope scope(isolate); |
| 2293 Handle<Object> receiver = args.at<Object>(0); | 2291 Handle<Object> receiver = args.at<Object>(0); |
| 2294 Handle<Object> key = args.at<Object>(1); | 2292 Handle<Object> key = args.at<Object>(1); |
| 2295 Handle<Object> result; | |
| 2296 | 2293 |
| 2297 DCHECK(args.length() == 4); | 2294 DCHECK(args.length() == 4); |
| 2298 Handle<Smi> slot = args.at<Smi>(2); | 2295 Handle<Smi> slot = args.at<Smi>(2); |
| 2299 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2296 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2300 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2297 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2301 KeyedLoadICNexus nexus(vector, vector_slot); | 2298 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2302 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2299 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2303 ic.UpdateState(receiver, key); | 2300 ic.UpdateState(receiver, key); |
| 2304 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2301 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2305 return *result; | |
| 2306 } | 2302 } |
| 2307 | 2303 |
| 2308 | 2304 |
| 2309 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) { | 2305 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_MissFromStubFailure) { |
| 2310 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2306 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2311 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2307 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2312 HandleScope scope(isolate); | 2308 HandleScope scope(isolate); |
| 2313 Handle<Object> receiver = args.at<Object>(0); | 2309 Handle<Object> receiver = args.at<Object>(0); |
| 2314 Handle<Object> key = args.at<Object>(1); | 2310 Handle<Object> key = args.at<Object>(1); |
| 2315 Handle<Object> result; | |
| 2316 | 2311 |
| 2317 DCHECK(args.length() == 4); | 2312 DCHECK(args.length() == 4); |
| 2318 Handle<Smi> slot = args.at<Smi>(2); | 2313 Handle<Smi> slot = args.at<Smi>(2); |
| 2319 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2314 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2320 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2315 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2321 KeyedLoadICNexus nexus(vector, vector_slot); | 2316 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2322 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2317 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2323 ic.UpdateState(receiver, key); | 2318 ic.UpdateState(receiver, key); |
| 2324 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2319 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2325 | |
| 2326 return *result; | |
| 2327 } | 2320 } |
| 2328 | 2321 |
| 2329 | 2322 |
| 2330 // Used from ic-<arch>.cc. | 2323 // Used from ic-<arch>.cc. |
| 2331 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { | 2324 RUNTIME_FUNCTION(Runtime_StoreIC_Miss) { |
| 2332 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2325 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2333 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2326 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2334 HandleScope scope(isolate); | 2327 HandleScope scope(isolate); |
| 2335 Handle<Object> receiver = args.at<Object>(0); | 2328 Handle<Object> receiver = args.at<Object>(0); |
| 2336 Handle<Name> key = args.at<Name>(1); | 2329 Handle<Name> key = args.at<Name>(1); |
| 2337 Handle<Object> value = args.at<Object>(2); | 2330 Handle<Object> value = args.at<Object>(2); |
| 2338 Handle<Object> result; | |
| 2339 | 2331 |
| 2340 DCHECK(args.length() == 5 || args.length() == 6); | 2332 DCHECK(args.length() == 5 || args.length() == 6); |
| 2341 Handle<Smi> slot = args.at<Smi>(3); | 2333 Handle<Smi> slot = args.at<Smi>(3); |
| 2342 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2334 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2343 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2335 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2344 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { | 2336 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { |
| 2345 StoreICNexus nexus(vector, vector_slot); | 2337 StoreICNexus nexus(vector, vector_slot); |
| 2346 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2338 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2347 ic.UpdateState(receiver, key); | 2339 ic.UpdateState(receiver, key); |
| 2348 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2340 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); |
| 2349 ic.Store(receiver, key, value)); | |
| 2350 } else { | 2341 } else { |
| 2351 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, | 2342 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, |
| 2352 vector->GetKind(vector_slot)); | 2343 vector->GetKind(vector_slot)); |
| 2353 KeyedStoreICNexus nexus(vector, vector_slot); | 2344 KeyedStoreICNexus nexus(vector, vector_slot); |
| 2354 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2345 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2355 ic.UpdateState(receiver, key); | 2346 ic.UpdateState(receiver, key); |
| 2356 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2347 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); |
| 2357 ic.Store(receiver, key, value)); | |
| 2358 } | 2348 } |
| 2359 return *result; | |
| 2360 } | 2349 } |
| 2361 | 2350 |
| 2362 | 2351 |
| 2363 RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) { | 2352 RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) { |
| 2364 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2353 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2365 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2354 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2366 HandleScope scope(isolate); | 2355 HandleScope scope(isolate); |
| 2367 Handle<Object> receiver = args.at<Object>(0); | 2356 Handle<Object> receiver = args.at<Object>(0); |
| 2368 Handle<Name> key = args.at<Name>(1); | 2357 Handle<Name> key = args.at<Name>(1); |
| 2369 Handle<Object> value = args.at<Object>(2); | 2358 Handle<Object> value = args.at<Object>(2); |
| 2370 Handle<Object> result; | |
| 2371 | 2359 |
| 2372 int length = args.length(); | 2360 int length = args.length(); |
| 2373 DCHECK(length == 5 || length == 6); | 2361 DCHECK(length == 5 || length == 6); |
| 2374 // We might have slot and vector, for a normal miss (slot(3), vector(4)). | 2362 // We might have slot and vector, for a normal miss (slot(3), vector(4)). |
| 2375 // Or, map and vector for a transitioning store miss (map(3), vector(4)). | 2363 // Or, map and vector for a transitioning store miss (map(3), vector(4)). |
| 2376 // In this case, we need to recover the slot from a virtual register. | 2364 // In this case, we need to recover the slot from a virtual register. |
| 2377 // If length == 6, then a map is included (map(3), slot(4), vector(5)). | 2365 // If length == 6, then a map is included (map(3), slot(4), vector(5)). |
| 2378 Handle<Smi> slot; | 2366 Handle<Smi> slot; |
| 2379 Handle<TypeFeedbackVector> vector; | 2367 Handle<TypeFeedbackVector> vector; |
| 2380 if (length == 5) { | 2368 if (length == 5) { |
| 2381 if (args.at<Object>(3)->IsMap()) { | 2369 if (args.at<Object>(3)->IsMap()) { |
| 2382 vector = args.at<TypeFeedbackVector>(4); | 2370 vector = args.at<TypeFeedbackVector>(4); |
| 2383 slot = handle( | 2371 slot = handle( |
| 2384 *reinterpret_cast<Smi**>(isolate->virtual_slot_register_address()), | 2372 *reinterpret_cast<Smi**>(isolate->virtual_slot_register_address()), |
| 2385 isolate); | 2373 isolate); |
| 2386 } else { | 2374 } else { |
| 2387 vector = args.at<TypeFeedbackVector>(4); | 2375 vector = args.at<TypeFeedbackVector>(4); |
| 2388 slot = args.at<Smi>(3); | 2376 slot = args.at<Smi>(3); |
| 2389 } | 2377 } |
| 2390 } else { | 2378 } else { |
| 2391 vector = args.at<TypeFeedbackVector>(5); | 2379 vector = args.at<TypeFeedbackVector>(5); |
| 2392 slot = args.at<Smi>(4); | 2380 slot = args.at<Smi>(4); |
| 2393 } | 2381 } |
| 2394 | 2382 |
| 2395 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2383 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2396 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { | 2384 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) { |
| 2397 StoreICNexus nexus(vector, vector_slot); | 2385 StoreICNexus nexus(vector, vector_slot); |
| 2398 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2386 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2399 ic.UpdateState(receiver, key); | 2387 ic.UpdateState(receiver, key); |
| 2400 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2388 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); |
| 2401 ic.Store(receiver, key, value)); | |
| 2402 } else { | 2389 } else { |
| 2403 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, | 2390 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, |
| 2404 vector->GetKind(vector_slot)); | 2391 vector->GetKind(vector_slot)); |
| 2405 KeyedStoreICNexus nexus(vector, vector_slot); | 2392 KeyedStoreICNexus nexus(vector, vector_slot); |
| 2406 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2393 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2407 ic.UpdateState(receiver, key); | 2394 ic.UpdateState(receiver, key); |
| 2408 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2395 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); |
| 2409 ic.Store(receiver, key, value)); | |
| 2410 } | 2396 } |
| 2411 return *result; | |
| 2412 } | 2397 } |
| 2413 | 2398 |
| 2414 | 2399 |
| 2415 // Used from ic-<arch>.cc. | 2400 // Used from ic-<arch>.cc. |
| 2416 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) { | 2401 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Miss) { |
| 2417 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2402 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2418 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2403 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2419 HandleScope scope(isolate); | 2404 HandleScope scope(isolate); |
| 2420 Handle<Object> receiver = args.at<Object>(0); | 2405 Handle<Object> receiver = args.at<Object>(0); |
| 2421 Handle<Object> key = args.at<Object>(1); | 2406 Handle<Object> key = args.at<Object>(1); |
| 2422 Handle<Object> value = args.at<Object>(2); | 2407 Handle<Object> value = args.at<Object>(2); |
| 2423 Handle<Object> result; | |
| 2424 | 2408 |
| 2425 DCHECK(args.length() == 5); | 2409 DCHECK(args.length() == 5); |
| 2426 Handle<Smi> slot = args.at<Smi>(3); | 2410 Handle<Smi> slot = args.at<Smi>(3); |
| 2427 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2411 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2428 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2412 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2429 KeyedStoreICNexus nexus(vector, vector_slot); | 2413 KeyedStoreICNexus nexus(vector, vector_slot); |
| 2430 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2414 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2431 ic.UpdateState(receiver, key); | 2415 ic.UpdateState(receiver, key); |
| 2432 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2416 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); |
| 2433 ic.Store(receiver, key, value)); | |
| 2434 return *result; | |
| 2435 } | 2417 } |
| 2436 | 2418 |
| 2437 | 2419 |
| 2438 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) { | 2420 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_MissFromStubFailure) { |
| 2439 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2421 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2440 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2422 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2441 HandleScope scope(isolate); | 2423 HandleScope scope(isolate); |
| 2442 Handle<Object> receiver = args.at<Object>(0); | 2424 Handle<Object> receiver = args.at<Object>(0); |
| 2443 Handle<Object> key = args.at<Object>(1); | 2425 Handle<Object> key = args.at<Object>(1); |
| 2444 Handle<Object> value = args.at<Object>(2); | 2426 Handle<Object> value = args.at<Object>(2); |
| 2445 Handle<Object> result; | |
| 2446 | 2427 |
| 2447 DCHECK(args.length() == 5); | 2428 DCHECK(args.length() == 5); |
| 2448 Handle<Smi> slot = args.at<Smi>(3); | 2429 Handle<Smi> slot = args.at<Smi>(3); |
| 2449 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); | 2430 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
| 2450 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2431 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2451 KeyedStoreICNexus nexus(vector, vector_slot); | 2432 KeyedStoreICNexus nexus(vector, vector_slot); |
| 2452 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2433 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2453 ic.UpdateState(receiver, key); | 2434 ic.UpdateState(receiver, key); |
| 2454 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 2435 RETURN_RESULT_OR_FAILURE(isolate, ic.Store(receiver, key, value)); |
| 2455 ic.Store(receiver, key, value)); | |
| 2456 return *result; | |
| 2457 } | 2436 } |
| 2458 | 2437 |
| 2459 | 2438 |
| 2460 RUNTIME_FUNCTION(Runtime_StoreIC_Slow) { | 2439 RUNTIME_FUNCTION(Runtime_StoreIC_Slow) { |
| 2461 HandleScope scope(isolate); | 2440 HandleScope scope(isolate); |
| 2462 DCHECK(args.length() == 5); | 2441 DCHECK(args.length() == 5); |
| 2463 Handle<Object> object = args.at<Object>(0); | 2442 Handle<Object> object = args.at<Object>(0); |
| 2464 Handle<Object> key = args.at<Object>(1); | 2443 Handle<Object> key = args.at<Object>(1); |
| 2465 Handle<Object> value = args.at<Object>(2); | 2444 Handle<Object> value = args.at<Object>(2); |
| 2466 LanguageMode language_mode; | 2445 LanguageMode language_mode; |
| 2467 StoreICNexus nexus(isolate); | 2446 StoreICNexus nexus(isolate); |
| 2468 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2447 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2469 language_mode = ic.language_mode(); | 2448 language_mode = ic.language_mode(); |
| 2470 Handle<Object> result; | 2449 RETURN_RESULT_OR_FAILURE( |
| 2471 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2450 isolate, |
| 2472 isolate, result, | |
| 2473 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); | 2451 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
| 2474 return *result; | |
| 2475 } | 2452 } |
| 2476 | 2453 |
| 2477 | 2454 |
| 2478 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) { | 2455 RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) { |
| 2479 HandleScope scope(isolate); | 2456 HandleScope scope(isolate); |
| 2480 DCHECK(args.length() == 5); | 2457 DCHECK(args.length() == 5); |
| 2481 Handle<Object> object = args.at<Object>(0); | 2458 Handle<Object> object = args.at<Object>(0); |
| 2482 Handle<Object> key = args.at<Object>(1); | 2459 Handle<Object> key = args.at<Object>(1); |
| 2483 Handle<Object> value = args.at<Object>(2); | 2460 Handle<Object> value = args.at<Object>(2); |
| 2484 LanguageMode language_mode; | 2461 LanguageMode language_mode; |
| 2485 KeyedStoreICNexus nexus(isolate); | 2462 KeyedStoreICNexus nexus(isolate); |
| 2486 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2463 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
| 2487 language_mode = ic.language_mode(); | 2464 language_mode = ic.language_mode(); |
| 2488 Handle<Object> result; | 2465 RETURN_RESULT_OR_FAILURE( |
| 2489 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2466 isolate, |
| 2490 isolate, result, | |
| 2491 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); | 2467 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
| 2492 return *result; | |
| 2493 } | 2468 } |
| 2494 | 2469 |
| 2495 | 2470 |
| 2496 RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) { | 2471 RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) { |
| 2497 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2472 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2498 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2473 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2499 HandleScope scope(isolate); | 2474 HandleScope scope(isolate); |
| 2500 // Length == 5 or 6, depending on whether the vector slot | 2475 // Length == 5 or 6, depending on whether the vector slot |
| 2501 // is passed in a virtual register or not. | 2476 // is passed in a virtual register or not. |
| 2502 DCHECK(args.length() == 5 || args.length() == 6); | 2477 DCHECK(args.length() == 5 || args.length() == 6); |
| 2503 Handle<Object> object = args.at<Object>(0); | 2478 Handle<Object> object = args.at<Object>(0); |
| 2504 Handle<Object> key = args.at<Object>(1); | 2479 Handle<Object> key = args.at<Object>(1); |
| 2505 Handle<Object> value = args.at<Object>(2); | 2480 Handle<Object> value = args.at<Object>(2); |
| 2506 Handle<Map> map = args.at<Map>(3); | 2481 Handle<Map> map = args.at<Map>(3); |
| 2507 LanguageMode language_mode; | 2482 LanguageMode language_mode; |
| 2508 KeyedStoreICNexus nexus(isolate); | 2483 KeyedStoreICNexus nexus(isolate); |
| 2509 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2484 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2510 language_mode = ic.language_mode(); | 2485 language_mode = ic.language_mode(); |
| 2511 if (object->IsJSObject()) { | 2486 if (object->IsJSObject()) { |
| 2512 JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), | 2487 JSObject::TransitionElementsKind(Handle<JSObject>::cast(object), |
| 2513 map->elements_kind()); | 2488 map->elements_kind()); |
| 2514 } | 2489 } |
| 2515 Handle<Object> result; | 2490 RETURN_RESULT_OR_FAILURE( |
| 2516 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2491 isolate, |
| 2517 isolate, result, | |
| 2518 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); | 2492 Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); |
| 2519 return *result; | |
| 2520 } | 2493 } |
| 2521 | 2494 |
| 2522 | 2495 |
| 2523 MaybeHandle<Object> BinaryOpIC::Transition( | 2496 MaybeHandle<Object> BinaryOpIC::Transition( |
| 2524 Handle<AllocationSite> allocation_site, Handle<Object> left, | 2497 Handle<AllocationSite> allocation_site, Handle<Object> left, |
| 2525 Handle<Object> right) { | 2498 Handle<Object> right) { |
| 2526 BinaryOpICState state(isolate(), extra_ic_state()); | 2499 BinaryOpICState state(isolate(), extra_ic_state()); |
| 2527 | 2500 |
| 2528 // Compute the actual result using the builtin for the binary operation. | 2501 // Compute the actual result using the builtin for the binary operation. |
| 2529 Handle<Object> result; | 2502 Handle<Object> result; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2638 | 2611 |
| 2639 | 2612 |
| 2640 RUNTIME_FUNCTION(Runtime_BinaryOpIC_Miss) { | 2613 RUNTIME_FUNCTION(Runtime_BinaryOpIC_Miss) { |
| 2641 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2614 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2642 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2615 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2643 HandleScope scope(isolate); | 2616 HandleScope scope(isolate); |
| 2644 DCHECK_EQ(2, args.length()); | 2617 DCHECK_EQ(2, args.length()); |
| 2645 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); | 2618 Handle<Object> left = args.at<Object>(BinaryOpICStub::kLeft); |
| 2646 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); | 2619 Handle<Object> right = args.at<Object>(BinaryOpICStub::kRight); |
| 2647 BinaryOpIC ic(isolate); | 2620 BinaryOpIC ic(isolate); |
| 2648 Handle<Object> result; | 2621 RETURN_RESULT_OR_FAILURE( |
| 2649 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2622 isolate, ic.Transition(Handle<AllocationSite>::null(), left, right)); |
| 2650 isolate, result, | |
| 2651 ic.Transition(Handle<AllocationSite>::null(), left, right)); | |
| 2652 return *result; | |
| 2653 } | 2623 } |
| 2654 | 2624 |
| 2655 | 2625 |
| 2656 RUNTIME_FUNCTION(Runtime_BinaryOpIC_MissWithAllocationSite) { | 2626 RUNTIME_FUNCTION(Runtime_BinaryOpIC_MissWithAllocationSite) { |
| 2657 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2627 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2658 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2628 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2659 HandleScope scope(isolate); | 2629 HandleScope scope(isolate); |
| 2660 DCHECK_EQ(3, args.length()); | 2630 DCHECK_EQ(3, args.length()); |
| 2661 Handle<AllocationSite> allocation_site = | 2631 Handle<AllocationSite> allocation_site = |
| 2662 args.at<AllocationSite>(BinaryOpWithAllocationSiteStub::kAllocationSite); | 2632 args.at<AllocationSite>(BinaryOpWithAllocationSiteStub::kAllocationSite); |
| 2663 Handle<Object> left = args.at<Object>(BinaryOpWithAllocationSiteStub::kLeft); | 2633 Handle<Object> left = args.at<Object>(BinaryOpWithAllocationSiteStub::kLeft); |
| 2664 Handle<Object> right = | 2634 Handle<Object> right = |
| 2665 args.at<Object>(BinaryOpWithAllocationSiteStub::kRight); | 2635 args.at<Object>(BinaryOpWithAllocationSiteStub::kRight); |
| 2666 BinaryOpIC ic(isolate); | 2636 BinaryOpIC ic(isolate); |
| 2667 Handle<Object> result; | 2637 RETURN_RESULT_OR_FAILURE(isolate, |
| 2668 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2638 ic.Transition(allocation_site, left, right)); |
| 2669 isolate, result, ic.Transition(allocation_site, left, right)); | |
| 2670 return *result; | |
| 2671 } | 2639 } |
| 2672 | 2640 |
| 2673 Code* CompareIC::GetRawUninitialized(Isolate* isolate, Token::Value op) { | 2641 Code* CompareIC::GetRawUninitialized(Isolate* isolate, Token::Value op) { |
| 2674 CompareICStub stub(isolate, op, CompareICState::UNINITIALIZED, | 2642 CompareICStub stub(isolate, op, CompareICState::UNINITIALIZED, |
| 2675 CompareICState::UNINITIALIZED, | 2643 CompareICState::UNINITIALIZED, |
| 2676 CompareICState::UNINITIALIZED); | 2644 CompareICState::UNINITIALIZED); |
| 2677 Code* code = NULL; | 2645 Code* code = NULL; |
| 2678 CHECK(stub.FindCodeInCache(&code)); | 2646 CHECK(stub.FindCodeInCache(&code)); |
| 2679 return code; | 2647 return code; |
| 2680 } | 2648 } |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2958 return *result; | 2926 return *result; |
| 2959 } | 2927 } |
| 2960 | 2928 |
| 2961 | 2929 |
| 2962 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { | 2930 RUNTIME_FUNCTION(Runtime_LoadIC_MissFromStubFailure) { |
| 2963 TimerEventScope<TimerEventIcMiss> timer(isolate); | 2931 TimerEventScope<TimerEventIcMiss> timer(isolate); |
| 2964 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); | 2932 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8"), "V8.IcMiss"); |
| 2965 HandleScope scope(isolate); | 2933 HandleScope scope(isolate); |
| 2966 Handle<Object> receiver = args.at<Object>(0); | 2934 Handle<Object> receiver = args.at<Object>(0); |
| 2967 Handle<Name> key = args.at<Name>(1); | 2935 Handle<Name> key = args.at<Name>(1); |
| 2968 Handle<Object> result; | |
| 2969 | 2936 |
| 2970 DCHECK(args.length() == 4); | 2937 DCHECK(args.length() == 4); |
| 2971 Handle<Smi> slot = args.at<Smi>(2); | 2938 Handle<Smi> slot = args.at<Smi>(2); |
| 2972 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); | 2939 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); |
| 2973 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); | 2940 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2974 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the | 2941 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the |
| 2975 // LoadIC miss handler if the handler misses. Since the vector Nexus is | 2942 // LoadIC miss handler if the handler misses. Since the vector Nexus is |
| 2976 // set up outside the IC, handle that here. | 2943 // set up outside the IC, handle that here. |
| 2977 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { | 2944 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) { |
| 2978 LoadICNexus nexus(vector, vector_slot); | 2945 LoadICNexus nexus(vector, vector_slot); |
| 2979 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2946 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2980 ic.UpdateState(receiver, key); | 2947 ic.UpdateState(receiver, key); |
| 2981 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2948 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2982 } else { | 2949 } else { |
| 2983 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, | 2950 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, |
| 2984 vector->GetKind(vector_slot)); | 2951 vector->GetKind(vector_slot)); |
| 2985 KeyedLoadICNexus nexus(vector, vector_slot); | 2952 KeyedLoadICNexus nexus(vector, vector_slot); |
| 2986 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2953 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
| 2987 ic.UpdateState(receiver, key); | 2954 ic.UpdateState(receiver, key); |
| 2988 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2955 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); |
| 2989 } | 2956 } |
| 2990 | |
| 2991 return *result; | |
| 2992 } | 2957 } |
| 2993 } // namespace internal | 2958 } // namespace internal |
| 2994 } // namespace v8 | 2959 } // namespace v8 |
| OLD | NEW |