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

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

Issue 1369973002: Use FeedbackVectorSlotKind instead of Code::Kind for type feedback vector. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 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/hydrogen.cc ('k') | src/objects-printer.cc » ('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 "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 2354 matching lines...) Expand 10 before | Expand all | Expand 10 after
2365 Handle<Name> key = args.at<Name>(1); 2365 Handle<Name> key = args.at<Name>(1);
2366 Handle<Object> result; 2366 Handle<Object> result;
2367 2367
2368 DCHECK(args.length() == 4); 2368 DCHECK(args.length() == 4);
2369 Handle<Smi> slot = args.at<Smi>(2); 2369 Handle<Smi> slot = args.at<Smi>(2);
2370 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); 2370 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3);
2371 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); 2371 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value());
2372 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the 2372 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the
2373 // LoadIC miss handler if the handler misses. Since the vector Nexus is 2373 // LoadIC miss handler if the handler misses. Since the vector Nexus is
2374 // set up outside the IC, handle that here. 2374 // set up outside the IC, handle that here.
2375 if (vector->GetKind(vector_slot) == Code::LOAD_IC) { 2375 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) {
2376 LoadICNexus nexus(vector, vector_slot); 2376 LoadICNexus nexus(vector, vector_slot);
2377 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2377 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2378 ic.UpdateState(receiver, key); 2378 ic.UpdateState(receiver, key);
2379 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 2379 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
2380 } else { 2380 } else {
2381 DCHECK(vector->GetKind(vector_slot) == Code::KEYED_LOAD_IC); 2381 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC,
2382 vector->GetKind(vector_slot));
2382 KeyedLoadICNexus nexus(vector, vector_slot); 2383 KeyedLoadICNexus nexus(vector, vector_slot);
2383 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2384 KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2384 ic.UpdateState(receiver, key); 2385 ic.UpdateState(receiver, key);
2385 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 2386 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
2386 } 2387 }
2387 return *result; 2388 return *result;
2388 } 2389 }
2389 2390
2390 2391
2391 // Used from ic-<arch>.cc 2392 // Used from ic-<arch>.cc
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2435 Handle<Object> receiver = args.at<Object>(0); 2436 Handle<Object> receiver = args.at<Object>(0);
2436 Handle<Name> key = args.at<Name>(1); 2437 Handle<Name> key = args.at<Name>(1);
2437 Handle<Object> value = args.at<Object>(2); 2438 Handle<Object> value = args.at<Object>(2);
2438 Handle<Object> result; 2439 Handle<Object> result;
2439 2440
2440 if (FLAG_vector_stores) { 2441 if (FLAG_vector_stores) {
2441 DCHECK(args.length() == 5 || args.length() == 6); 2442 DCHECK(args.length() == 5 || args.length() == 6);
2442 Handle<Smi> slot = args.at<Smi>(3); 2443 Handle<Smi> slot = args.at<Smi>(3);
2443 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); 2444 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
2444 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); 2445 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value());
2445 if (vector->GetKind(vector_slot) == Code::STORE_IC) { 2446 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
2446 StoreICNexus nexus(vector, vector_slot); 2447 StoreICNexus nexus(vector, vector_slot);
2447 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2448 StoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2448 ic.UpdateState(receiver, key); 2449 ic.UpdateState(receiver, key);
2449 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 2450 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
2450 ic.Store(receiver, key, value)); 2451 ic.Store(receiver, key, value));
2451 } else { 2452 } else {
2452 DCHECK(vector->GetKind(vector_slot) == Code::KEYED_STORE_IC); 2453 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
2454 vector->GetKind(vector_slot));
2453 KeyedStoreICNexus nexus(vector, vector_slot); 2455 KeyedStoreICNexus nexus(vector, vector_slot);
2454 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); 2456 KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus);
2455 ic.UpdateState(receiver, key); 2457 ic.UpdateState(receiver, key);
2456 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 2458 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
2457 ic.Store(receiver, key, value)); 2459 ic.Store(receiver, key, value));
2458 } 2460 }
2459 } else { 2461 } else {
2460 DCHECK(args.length() == 3); 2462 DCHECK(args.length() == 3);
2461 StoreIC ic(IC::NO_EXTRA_FRAME, isolate); 2463 StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
2462 ic.UpdateState(receiver, key); 2464 ic.UpdateState(receiver, key);
(...skipping 10 matching lines...) Expand all
2473 Handle<Object> receiver = args.at<Object>(0); 2475 Handle<Object> receiver = args.at<Object>(0);
2474 Handle<Name> key = args.at<Name>(1); 2476 Handle<Name> key = args.at<Name>(1);
2475 Handle<Object> value = args.at<Object>(2); 2477 Handle<Object> value = args.at<Object>(2);
2476 Handle<Object> result; 2478 Handle<Object> result;
2477 2479
2478 if (FLAG_vector_stores) { 2480 if (FLAG_vector_stores) {
2479 DCHECK(args.length() == 5 || args.length() == 6); 2481 DCHECK(args.length() == 5 || args.length() == 6);
2480 Handle<Smi> slot = args.at<Smi>(3); 2482 Handle<Smi> slot = args.at<Smi>(3);
2481 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); 2483 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
2482 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); 2484 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value());
2483 if (vector->GetKind(vector_slot) == Code::STORE_IC) { 2485 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
2484 StoreICNexus nexus(vector, vector_slot); 2486 StoreICNexus nexus(vector, vector_slot);
2485 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2487 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2486 ic.UpdateState(receiver, key); 2488 ic.UpdateState(receiver, key);
2487 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 2489 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
2488 ic.Store(receiver, key, value)); 2490 ic.Store(receiver, key, value));
2489 } else { 2491 } else {
2490 DCHECK(vector->GetKind(vector_slot) == Code::KEYED_STORE_IC); 2492 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC,
2493 vector->GetKind(vector_slot));
2491 KeyedStoreICNexus nexus(vector, vector_slot); 2494 KeyedStoreICNexus nexus(vector, vector_slot);
2492 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2495 KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2493 ic.UpdateState(receiver, key); 2496 ic.UpdateState(receiver, key);
2494 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 2497 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
2495 ic.Store(receiver, key, value)); 2498 ic.Store(receiver, key, value));
2496 } 2499 }
2497 } else { 2500 } else {
2498 DCHECK(args.length() == 3 || args.length() == 4); 2501 DCHECK(args.length() == 3 || args.length() == 4);
2499 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate); 2502 StoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
2500 ic.UpdateState(receiver, key); 2503 ic.UpdateState(receiver, key);
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
3103 Handle<Name> key = args.at<Name>(1); 3106 Handle<Name> key = args.at<Name>(1);
3104 Handle<Object> result; 3107 Handle<Object> result;
3105 3108
3106 DCHECK(args.length() == 4); 3109 DCHECK(args.length() == 4);
3107 Handle<Smi> slot = args.at<Smi>(2); 3110 Handle<Smi> slot = args.at<Smi>(2);
3108 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3); 3111 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(3);
3109 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value()); 3112 FeedbackVectorICSlot vector_slot = vector->ToICSlot(slot->value());
3110 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the 3113 // A monomorphic or polymorphic KeyedLoadIC with a string key can call the
3111 // LoadIC miss handler if the handler misses. Since the vector Nexus is 3114 // LoadIC miss handler if the handler misses. Since the vector Nexus is
3112 // set up outside the IC, handle that here. 3115 // set up outside the IC, handle that here.
3113 if (vector->GetKind(vector_slot) == Code::LOAD_IC) { 3116 if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::LOAD_IC) {
3114 LoadICNexus nexus(vector, vector_slot); 3117 LoadICNexus nexus(vector, vector_slot);
3115 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 3118 LoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
3116 ic.UpdateState(receiver, key); 3119 ic.UpdateState(receiver, key);
3117 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 3120 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
3118 } else { 3121 } else {
3119 DCHECK(vector->GetKind(vector_slot) == Code::KEYED_LOAD_IC); 3122 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC,
3123 vector->GetKind(vector_slot));
3120 KeyedLoadICNexus nexus(vector, vector_slot); 3124 KeyedLoadICNexus nexus(vector, vector_slot);
3121 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 3125 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
3122 ic.UpdateState(receiver, key); 3126 ic.UpdateState(receiver, key);
3123 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); 3127 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key));
3124 } 3128 }
3125 3129
3126 return *result; 3130 return *result;
3127 } 3131 }
3128 } // namespace internal 3132 } // namespace internal
3129 } // namespace v8 3133 } // namespace v8
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698