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 2339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2350 } | 2350 } |
2351 | 2351 |
2352 // Do not try to update the target if the code was marked for lazy | 2352 // Do not try to update the target if the code was marked for lazy |
2353 // deoptimization. (Since we do not relocate addresses in these | 2353 // deoptimization. (Since we do not relocate addresses in these |
2354 // code objects, an attempt to access the target could fail.) | 2354 // code objects, an attempt to access the target could fail.) |
2355 if (AddressIsDeoptimizedCode()) { | 2355 if (AddressIsDeoptimizedCode()) { |
2356 return result; | 2356 return result; |
2357 } | 2357 } |
2358 | 2358 |
2359 // Compute the new state. | 2359 // Compute the new state. |
2360 BinaryOpICState old_state(isolate(), extra_ic_state()); | 2360 BinaryOpICState old_state(isolate(), target()->extra_ic_state()); |
2361 state.Update(left, right, result); | 2361 state.Update(left, right, result); |
2362 | 2362 |
2363 // Check if we have a string operation here. | 2363 // Check if we have a string operation here. |
2364 Handle<Code> target; | 2364 Handle<Code> new_target; |
2365 if (!allocation_site.is_null() || state.ShouldCreateAllocationMementos()) { | 2365 if (!allocation_site.is_null() || state.ShouldCreateAllocationMementos()) { |
2366 // Setup the allocation site on-demand. | 2366 // Setup the allocation site on-demand. |
2367 if (allocation_site.is_null()) { | 2367 if (allocation_site.is_null()) { |
2368 allocation_site = isolate()->factory()->NewAllocationSite(); | 2368 allocation_site = isolate()->factory()->NewAllocationSite(); |
2369 } | 2369 } |
2370 | 2370 |
2371 // Install the stub with an allocation site. | 2371 // Install the stub with an allocation site. |
2372 BinaryOpICWithAllocationSiteStub stub(isolate(), state); | 2372 BinaryOpICWithAllocationSiteStub stub(isolate(), state); |
2373 target = stub.GetCodeCopyFromTemplate(allocation_site); | 2373 new_target = stub.GetCodeCopyFromTemplate(allocation_site); |
2374 | 2374 |
2375 // Sanity check the trampoline stub. | 2375 // Sanity check the trampoline stub. |
2376 DCHECK_EQ(*allocation_site, target->FindFirstAllocationSite()); | 2376 DCHECK_EQ(*allocation_site, new_target->FindFirstAllocationSite()); |
2377 } else { | 2377 } else { |
2378 // Install the generic stub. | 2378 // Install the generic stub. |
2379 BinaryOpICStub stub(isolate(), state); | 2379 BinaryOpICStub stub(isolate(), state); |
2380 target = stub.GetCode(); | 2380 new_target = stub.GetCode(); |
2381 | 2381 |
2382 // Sanity check the generic stub. | 2382 // Sanity check the generic stub. |
2383 DCHECK_NULL(target->FindFirstAllocationSite()); | 2383 DCHECK_NULL(new_target->FindFirstAllocationSite()); |
2384 } | 2384 } |
2385 set_target(*target); | 2385 set_target(*new_target); |
2386 | 2386 |
2387 if (FLAG_trace_ic) { | 2387 if (FLAG_trace_ic) { |
2388 OFStream os(stdout); | 2388 OFStream os(stdout); |
2389 os << "[BinaryOpIC" << old_state << " => " << state << " @ " | 2389 os << "[BinaryOpIC" << old_state << " => " << state << " @ " |
2390 << static_cast<void*>(*target) << " <- "; | 2390 << static_cast<void*>(*new_target) << " <- "; |
2391 JavaScriptFrame::PrintTop(isolate(), stdout, false, true); | 2391 JavaScriptFrame::PrintTop(isolate(), stdout, false, true); |
2392 if (!allocation_site.is_null()) { | 2392 if (!allocation_site.is_null()) { |
2393 os << " using allocation site " << static_cast<void*>(*allocation_site); | 2393 os << " using allocation site " << static_cast<void*>(*allocation_site); |
2394 } | 2394 } |
2395 os << "]" << std::endl; | 2395 os << "]" << std::endl; |
2396 } | 2396 } |
2397 | 2397 |
2398 // Patch the inlined smi code as necessary. | 2398 // Patch the inlined smi code as necessary. |
2399 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { | 2399 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { |
2400 PatchInlinedSmiCode(isolate(), address(), ENABLE_INLINED_SMI_CHECK); | 2400 PatchInlinedSmiCode(isolate(), address(), ENABLE_INLINED_SMI_CHECK); |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2744 KeyedLoadICNexus nexus(vector, vector_slot); | 2744 KeyedLoadICNexus nexus(vector, vector_slot); |
2745 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2745 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
2746 ic.UpdateState(receiver, key); | 2746 ic.UpdateState(receiver, key); |
2747 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2747 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
2748 } | 2748 } |
2749 | 2749 |
2750 return *result; | 2750 return *result; |
2751 } | 2751 } |
2752 } // namespace internal | 2752 } // namespace internal |
2753 } // namespace v8 | 2753 } // namespace v8 |
OLD | NEW |