Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: src/ic/ic.cc

Issue 2670843002: [stubs] Also port the CallICStub to CSA. (Closed)
Patch Set: Introduce FullCodeGenerator::IntFromSlot. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ic/ic.h ('k') | src/interface-descriptors.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <iostream> 7 #include <iostream>
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/api-arguments-inl.h" 10 #include "src/api-arguments-inl.h"
(...skipping 2464 matching lines...) Expand 10 before | Expand all | Expand 10 after
2475 if (!is_vector_set()) { 2475 if (!is_vector_set()) {
2476 ConfigureVectorState(MEGAMORPHIC, key); 2476 ConfigureVectorState(MEGAMORPHIC, key);
2477 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "set generic"); 2477 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "set generic");
2478 } 2478 }
2479 TRACE_IC("StoreIC", key); 2479 TRACE_IC("StoreIC", key);
2480 2480
2481 return store_handle; 2481 return store_handle;
2482 } 2482 }
2483 2483
2484 2484
2485 void CallIC::HandleMiss(Handle<Object> function) {
2486 Handle<Object> name = isolate()->factory()->empty_string();
2487 CallICNexus* nexus = casted_nexus<CallICNexus>();
2488 Object* feedback = nexus->GetFeedback();
2489
2490 // Hand-coded MISS handling is easier if CallIC slots don't contain smis.
2491 DCHECK(!feedback->IsSmi());
2492
2493 if (feedback->IsWeakCell() || !function->IsJSFunction() ||
2494 feedback->IsAllocationSite()) {
2495 // We are going generic.
2496 nexus->ConfigureMegamorphic();
2497 } else {
2498 DCHECK(feedback == *TypeFeedbackVector::UninitializedSentinel(isolate()));
2499 Handle<JSFunction> js_function = Handle<JSFunction>::cast(function);
2500
2501 Handle<JSFunction> array_function =
2502 Handle<JSFunction>(isolate()->native_context()->array_function());
2503 if (array_function.is_identical_to(js_function)) {
2504 // Alter the slot.
2505 nexus->ConfigureMonomorphicArray();
2506 } else if (js_function->context()->native_context() !=
2507 *isolate()->native_context()) {
2508 // Don't collect cross-native context feedback for the CallIC.
2509 // TODO(bmeurer): We should collect the SharedFunctionInfo as
2510 // feedback in this case instead.
2511 nexus->ConfigureMegamorphic();
2512 } else {
2513 nexus->ConfigureMonomorphic(js_function);
2514 }
2515 }
2516
2517 if (function->IsJSFunction()) {
2518 Handle<JSFunction> js_function = Handle<JSFunction>::cast(function);
2519 name = handle(js_function->shared()->name(), isolate());
2520 }
2521
2522 OnTypeFeedbackChanged(isolate(), get_host());
2523 TRACE_IC("CallIC", name);
2524 }
2525
2526
2527 #undef TRACE_IC 2485 #undef TRACE_IC
2528 2486
2529 2487
2530 // ---------------------------------------------------------------------------- 2488 // ----------------------------------------------------------------------------
2531 // Static IC stub generators. 2489 // Static IC stub generators.
2532 // 2490 //
2533 2491
2534 // Used from ic-<arch>.cc. 2492 // Used from ic-<arch>.cc.
2535 RUNTIME_FUNCTION(Runtime_CallIC_Miss) {
2536 HandleScope scope(isolate);
2537 DCHECK_EQ(3, args.length());
2538 // Runtime functions don't follow the IC's calling convention.
2539 Handle<Object> function = args.at(0);
2540 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(1);
2541 Handle<Smi> slot = args.at<Smi>(2);
2542 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2543 CallICNexus nexus(vector, vector_slot);
2544 CallIC ic(isolate, &nexus);
2545 ic.HandleMiss(function);
2546 return *function;
2547 }
2548
2549
2550 // Used from ic-<arch>.cc.
2551 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) { 2493 RUNTIME_FUNCTION(Runtime_LoadIC_Miss) {
2552 HandleScope scope(isolate); 2494 HandleScope scope(isolate);
2553 DCHECK_EQ(4, args.length()); 2495 DCHECK_EQ(4, args.length());
2554 // Runtime functions don't follow the IC's calling convention. 2496 // Runtime functions don't follow the IC's calling convention.
2555 Handle<Object> receiver = args.at(0); 2497 Handle<Object> receiver = args.at(0);
2556 Handle<Name> key = args.at<Name>(1); 2498 Handle<Name> key = args.at<Name>(1);
2557 Handle<Smi> slot = args.at<Smi>(2); 2499 Handle<Smi> slot = args.at<Smi>(2);
2558 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); 2500 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3);
2559 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); 2501 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
2560 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the 2502 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
3198 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); 3140 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state());
3199 it.Next(); 3141 it.Next();
3200 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 3142 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
3201 Object::GetProperty(&it)); 3143 Object::GetProperty(&it));
3202 } 3144 }
3203 3145
3204 return *result; 3146 return *result;
3205 } 3147 }
3206 } // namespace internal 3148 } // namespace internal
3207 } // namespace v8 3149 } // namespace v8
OLDNEW
« no previous file with comments | « src/ic/ic.h ('k') | src/interface-descriptors.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698