OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 static bool TryRemoveInvalidPrototypeDependentStub(Code* target, | 172 static bool TryRemoveInvalidPrototypeDependentStub(Code* target, |
173 Object* receiver, | 173 Object* receiver, |
174 Object* name) { | 174 Object* name) { |
175 InlineCacheHolderFlag cache_holder = | 175 InlineCacheHolderFlag cache_holder = |
176 Code::ExtractCacheHolderFromFlags(target->flags()); | 176 Code::ExtractCacheHolderFromFlags(target->flags()); |
177 | 177 |
178 if (cache_holder == OWN_MAP && !receiver->IsJSObject()) { | 178 if (cache_holder == OWN_MAP && !receiver->IsJSObject()) { |
179 // The stub was generated for JSObject but called for non-JSObject. | 179 // The stub was generated for JSObject but called for non-JSObject. |
180 // IC::GetCodeCacheHolder is not applicable. | 180 // IC::GetCodeCacheHolder is not applicable. |
181 return false; | 181 return false; |
182 } else if (cache_holder == PROTOTYPE_MAP && | 182 } else if (cache_holder == DELEGATE_MAP && |
183 receiver->GetPrototype()->IsNull()) { | 183 receiver->GetDelegate()->IsNull()) { |
184 // IC::GetCodeCacheHolder is not applicable. | 184 // IC::GetCodeCacheHolder is not applicable. |
185 return false; | 185 return false; |
186 } | 186 } |
187 Map* map = IC::GetCodeCacheHolder(receiver, cache_holder)->map(); | 187 Map* map = IC::GetCodeCacheHolder(receiver, cache_holder)->map(); |
188 | 188 |
189 // Decide whether the inline cache failed because of changes to the | 189 // Decide whether the inline cache failed because of changes to the |
190 // receiver itself or changes to one of its prototypes. | 190 // receiver itself or changes to one of its prototypes. |
191 // | 191 // |
192 // If there are changes to the receiver itself, the map of the | 192 // If there are changes to the receiver itself, the map of the |
193 // receiver will have changed and the current target will not be in | 193 // receiver will have changed and the current target will not be in |
(...skipping 2170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2364 | 2364 |
2365 const char* CompareIC::GetStateName(State state) { | 2365 const char* CompareIC::GetStateName(State state) { |
2366 switch (state) { | 2366 switch (state) { |
2367 case UNINITIALIZED: return "UNINITIALIZED"; | 2367 case UNINITIALIZED: return "UNINITIALIZED"; |
2368 case SMI: return "SMI"; | 2368 case SMI: return "SMI"; |
2369 case HEAP_NUMBER: return "HEAP_NUMBER"; | 2369 case HEAP_NUMBER: return "HEAP_NUMBER"; |
2370 case OBJECT: return "OBJECTS"; | 2370 case OBJECT: return "OBJECTS"; |
2371 case KNOWN_OBJECTS: return "KNOWN_OBJECTS"; | 2371 case KNOWN_OBJECTS: return "KNOWN_OBJECTS"; |
2372 case INTERNALIZED_STRING: return "INTERNALIZED_STRING"; | 2372 case INTERNALIZED_STRING: return "INTERNALIZED_STRING"; |
2373 case STRING: return "STRING"; | 2373 case STRING: return "STRING"; |
| 2374 case UNIQUE_NAME: return "UNIQUE_NAME"; |
2374 case GENERIC: return "GENERIC"; | 2375 case GENERIC: return "GENERIC"; |
2375 default: | 2376 default: |
2376 UNREACHABLE(); | 2377 UNREACHABLE(); |
2377 return NULL; | 2378 return NULL; |
2378 } | 2379 } |
2379 } | 2380 } |
2380 | 2381 |
2381 | 2382 |
2382 static CompareIC::State InputState(CompareIC::State old_state, | 2383 static CompareIC::State InputState(CompareIC::State old_state, |
2383 Handle<Object> value) { | 2384 Handle<Object> value) { |
2384 switch (old_state) { | 2385 switch (old_state) { |
2385 case CompareIC::UNINITIALIZED: | 2386 case CompareIC::UNINITIALIZED: |
2386 if (value->IsSmi()) return CompareIC::SMI; | 2387 if (value->IsSmi()) return CompareIC::SMI; |
2387 if (value->IsHeapNumber()) return CompareIC::HEAP_NUMBER; | 2388 if (value->IsHeapNumber()) return CompareIC::HEAP_NUMBER; |
2388 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 2389 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; |
2389 if (value->IsString()) return CompareIC::STRING; | 2390 if (value->IsString()) return CompareIC::STRING; |
| 2391 if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; |
2390 if (value->IsJSObject()) return CompareIC::OBJECT; | 2392 if (value->IsJSObject()) return CompareIC::OBJECT; |
2391 break; | 2393 break; |
2392 case CompareIC::SMI: | 2394 case CompareIC::SMI: |
2393 if (value->IsSmi()) return CompareIC::SMI; | 2395 if (value->IsSmi()) return CompareIC::SMI; |
2394 if (value->IsHeapNumber()) return CompareIC::HEAP_NUMBER; | 2396 if (value->IsHeapNumber()) return CompareIC::HEAP_NUMBER; |
2395 break; | 2397 break; |
2396 case CompareIC::HEAP_NUMBER: | 2398 case CompareIC::HEAP_NUMBER: |
2397 if (value->IsNumber()) return CompareIC::HEAP_NUMBER; | 2399 if (value->IsNumber()) return CompareIC::HEAP_NUMBER; |
2398 break; | 2400 break; |
2399 case CompareIC::INTERNALIZED_STRING: | 2401 case CompareIC::INTERNALIZED_STRING: |
2400 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 2402 if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; |
2401 if (value->IsString()) return CompareIC::STRING; | 2403 if (value->IsString()) return CompareIC::STRING; |
| 2404 if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; |
2402 break; | 2405 break; |
2403 case CompareIC::STRING: | 2406 case CompareIC::STRING: |
2404 if (value->IsInternalizedString() || value->IsString()) | 2407 if (value->IsString()) return CompareIC::STRING; |
2405 return CompareIC::STRING; | 2408 break; |
| 2409 case CompareIC::UNIQUE_NAME: |
| 2410 if (value->IsUniqueName()) return CompareIC::UNIQUE_NAME; |
2406 break; | 2411 break; |
2407 case CompareIC::OBJECT: | 2412 case CompareIC::OBJECT: |
2408 if (value->IsJSObject()) return CompareIC::OBJECT; | 2413 if (value->IsJSObject()) return CompareIC::OBJECT; |
2409 break; | 2414 break; |
2410 case CompareIC::GENERIC: | 2415 case CompareIC::GENERIC: |
2411 break; | 2416 break; |
2412 case CompareIC::KNOWN_OBJECTS: | 2417 case CompareIC::KNOWN_OBJECTS: |
2413 UNREACHABLE(); | 2418 UNREACHABLE(); |
2414 break; | 2419 break; |
2415 } | 2420 } |
(...skipping 19 matching lines...) Expand all Loading... |
2435 return HEAP_NUMBER; | 2440 return HEAP_NUMBER; |
2436 } | 2441 } |
2437 } | 2442 } |
2438 if (x->IsInternalizedString() && y->IsInternalizedString()) { | 2443 if (x->IsInternalizedString() && y->IsInternalizedString()) { |
2439 // We compare internalized strings as plain ones if we need to determine | 2444 // We compare internalized strings as plain ones if we need to determine |
2440 // the order in a non-equality compare. | 2445 // the order in a non-equality compare. |
2441 return Token::IsEqualityOp(op_) ? INTERNALIZED_STRING : STRING; | 2446 return Token::IsEqualityOp(op_) ? INTERNALIZED_STRING : STRING; |
2442 } | 2447 } |
2443 if (x->IsString() && y->IsString()) return STRING; | 2448 if (x->IsString() && y->IsString()) return STRING; |
2444 if (!Token::IsEqualityOp(op_)) return GENERIC; | 2449 if (!Token::IsEqualityOp(op_)) return GENERIC; |
| 2450 if (x->IsUniqueName() && y->IsUniqueName()) return UNIQUE_NAME; |
2445 if (x->IsJSObject() && y->IsJSObject()) { | 2451 if (x->IsJSObject() && y->IsJSObject()) { |
2446 if (Handle<JSObject>::cast(x)->map() == | 2452 if (Handle<JSObject>::cast(x)->map() == |
2447 Handle<JSObject>::cast(y)->map() && | 2453 Handle<JSObject>::cast(y)->map()) { |
2448 Token::IsEqualityOp(op_)) { | |
2449 return KNOWN_OBJECTS; | 2454 return KNOWN_OBJECTS; |
2450 } else { | 2455 } else { |
2451 return OBJECT; | 2456 return OBJECT; |
2452 } | 2457 } |
2453 } | 2458 } |
2454 return GENERIC; | 2459 return GENERIC; |
2455 case SMI: | 2460 case SMI: |
2456 return x->IsNumber() && y->IsNumber() | 2461 return x->IsNumber() && y->IsNumber() ? HEAP_NUMBER : GENERIC; |
2457 ? HEAP_NUMBER | |
2458 : GENERIC; | |
2459 case INTERNALIZED_STRING: | 2462 case INTERNALIZED_STRING: |
2460 ASSERT(Token::IsEqualityOp(op_)); | 2463 ASSERT(Token::IsEqualityOp(op_)); |
2461 return x->IsString() && y->IsString() ? STRING : GENERIC; | 2464 if (x->IsString() && y->IsString()) return STRING; |
| 2465 if (x->IsUniqueName() && y->IsUniqueName()) return UNIQUE_NAME; |
| 2466 return GENERIC; |
2462 case HEAP_NUMBER: | 2467 case HEAP_NUMBER: |
| 2468 // If the failure was due to one side changing from smi to heap number, |
| 2469 // then keep the state (if other changed at the same time, we will get |
| 2470 // a second miss and then go to generic). |
2463 if (old_left == SMI && x->IsHeapNumber()) return HEAP_NUMBER; | 2471 if (old_left == SMI && x->IsHeapNumber()) return HEAP_NUMBER; |
2464 if (old_right == SMI && y->IsHeapNumber()) return HEAP_NUMBER; | 2472 if (old_right == SMI && y->IsHeapNumber()) return HEAP_NUMBER; |
2465 case STRING: | 2473 case STRING: |
| 2474 case UNIQUE_NAME: |
2466 case OBJECT: | 2475 case OBJECT: |
2467 case KNOWN_OBJECTS: | 2476 case KNOWN_OBJECTS: |
2468 case GENERIC: | 2477 case GENERIC: |
2469 return GENERIC; | 2478 return GENERIC; |
2470 } | 2479 } |
2471 UNREACHABLE(); | 2480 UNREACHABLE(); |
2472 return GENERIC; // Make the compiler happy. | 2481 return GENERIC; // Make the compiler happy. |
2473 } | 2482 } |
2474 | 2483 |
2475 | 2484 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2553 #undef ADDR | 2562 #undef ADDR |
2554 }; | 2563 }; |
2555 | 2564 |
2556 | 2565 |
2557 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2566 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2558 return IC_utilities[id]; | 2567 return IC_utilities[id]; |
2559 } | 2568 } |
2560 | 2569 |
2561 | 2570 |
2562 } } // namespace v8::internal | 2571 } } // namespace v8::internal |
OLD | NEW |