| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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-state.h" | 5 #include "src/ic/ic-state.h" |
| 6 | 6 |
| 7 #include "src/ic/ic.h" | 7 #include "src/ic/ic.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 } | 351 } |
| 352 UNREACHABLE(); | 352 UNREACHABLE(); |
| 353 return NULL; | 353 return NULL; |
| 354 } | 354 } |
| 355 | 355 |
| 356 | 356 |
| 357 const char* CompareICState::GetStateName(State state) { | 357 const char* CompareICState::GetStateName(State state) { |
| 358 switch (state) { | 358 switch (state) { |
| 359 case UNINITIALIZED: | 359 case UNINITIALIZED: |
| 360 return "UNINITIALIZED"; | 360 return "UNINITIALIZED"; |
| 361 case BOOLEAN: |
| 362 return "BOOLEAN"; |
| 361 case SMI: | 363 case SMI: |
| 362 return "SMI"; | 364 return "SMI"; |
| 363 case NUMBER: | 365 case NUMBER: |
| 364 return "NUMBER"; | 366 return "NUMBER"; |
| 365 case INTERNALIZED_STRING: | 367 case INTERNALIZED_STRING: |
| 366 return "INTERNALIZED_STRING"; | 368 return "INTERNALIZED_STRING"; |
| 367 case STRING: | 369 case STRING: |
| 368 return "STRING"; | 370 return "STRING"; |
| 369 case UNIQUE_NAME: | 371 case UNIQUE_NAME: |
| 370 return "UNIQUE_NAME"; | 372 return "UNIQUE_NAME"; |
| 371 case OBJECT: | 373 case OBJECT: |
| 372 return "OBJECT"; | 374 return "OBJECT"; |
| 373 case KNOWN_OBJECT: | 375 case KNOWN_OBJECT: |
| 374 return "KNOWN_OBJECT"; | 376 return "KNOWN_OBJECT"; |
| 375 case GENERIC: | 377 case GENERIC: |
| 376 return "GENERIC"; | 378 return "GENERIC"; |
| 377 } | 379 } |
| 378 UNREACHABLE(); | 380 UNREACHABLE(); |
| 379 return NULL; | 381 return NULL; |
| 380 } | 382 } |
| 381 | 383 |
| 382 | 384 |
| 383 Type* CompareICState::StateToType(Zone* zone, State state, Handle<Map> map) { | 385 Type* CompareICState::StateToType(Zone* zone, State state, Handle<Map> map) { |
| 384 switch (state) { | 386 switch (state) { |
| 385 case UNINITIALIZED: | 387 case UNINITIALIZED: |
| 386 return Type::None(zone); | 388 return Type::None(zone); |
| 389 case BOOLEAN: |
| 390 return Type::Boolean(zone); |
| 387 case SMI: | 391 case SMI: |
| 388 return Type::SignedSmall(zone); | 392 return Type::SignedSmall(zone); |
| 389 case NUMBER: | 393 case NUMBER: |
| 390 return Type::Number(zone); | 394 return Type::Number(zone); |
| 391 case STRING: | 395 case STRING: |
| 392 return Type::String(zone); | 396 return Type::String(zone); |
| 393 case INTERNALIZED_STRING: | 397 case INTERNALIZED_STRING: |
| 394 return Type::InternalizedString(zone); | 398 return Type::InternalizedString(zone); |
| 395 case UNIQUE_NAME: | 399 case UNIQUE_NAME: |
| 396 return Type::UniqueName(zone); | 400 return Type::UniqueName(zone); |
| 397 case OBJECT: | 401 case OBJECT: |
| 398 return Type::Receiver(zone); | 402 return Type::Receiver(zone); |
| 399 case KNOWN_OBJECT: | 403 case KNOWN_OBJECT: |
| 400 return map.is_null() ? Type::Receiver(zone) : Type::Class(map, zone); | 404 return map.is_null() ? Type::Receiver(zone) : Type::Class(map, zone); |
| 401 case GENERIC: | 405 case GENERIC: |
| 402 return Type::Any(zone); | 406 return Type::Any(zone); |
| 403 } | 407 } |
| 404 UNREACHABLE(); | 408 UNREACHABLE(); |
| 405 return NULL; | 409 return NULL; |
| 406 } | 410 } |
| 407 | 411 |
| 408 | 412 |
| 409 CompareICState::State CompareICState::NewInputState(State old_state, | 413 CompareICState::State CompareICState::NewInputState(State old_state, |
| 410 Handle<Object> value) { | 414 Handle<Object> value) { |
| 411 switch (old_state) { | 415 switch (old_state) { |
| 412 case UNINITIALIZED: | 416 case UNINITIALIZED: |
| 417 if (value->IsBoolean()) return BOOLEAN; |
| 413 if (value->IsSmi()) return SMI; | 418 if (value->IsSmi()) return SMI; |
| 414 if (value->IsHeapNumber()) return NUMBER; | 419 if (value->IsHeapNumber()) return NUMBER; |
| 415 if (value->IsInternalizedString()) return INTERNALIZED_STRING; | 420 if (value->IsInternalizedString()) return INTERNALIZED_STRING; |
| 416 if (value->IsString()) return STRING; | 421 if (value->IsString()) return STRING; |
| 417 if (value->IsSymbol()) return UNIQUE_NAME; | 422 if (value->IsSymbol()) return UNIQUE_NAME; |
| 418 if (value->IsJSObject()) return OBJECT; | 423 if (value->IsJSObject()) return OBJECT; |
| 419 break; | 424 break; |
| 425 case BOOLEAN: |
| 426 if (value->IsBoolean()) return BOOLEAN; |
| 427 break; |
| 420 case SMI: | 428 case SMI: |
| 421 if (value->IsSmi()) return SMI; | 429 if (value->IsSmi()) return SMI; |
| 422 if (value->IsHeapNumber()) return NUMBER; | 430 if (value->IsHeapNumber()) return NUMBER; |
| 423 break; | 431 break; |
| 424 case NUMBER: | 432 case NUMBER: |
| 425 if (value->IsNumber()) return NUMBER; | 433 if (value->IsNumber()) return NUMBER; |
| 426 break; | 434 break; |
| 427 case INTERNALIZED_STRING: | 435 case INTERNALIZED_STRING: |
| 428 if (value->IsInternalizedString()) return INTERNALIZED_STRING; | 436 if (value->IsInternalizedString()) return INTERNALIZED_STRING; |
| 429 if (value->IsString()) return STRING; | 437 if (value->IsString()) return STRING; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 447 return GENERIC; | 455 return GENERIC; |
| 448 } | 456 } |
| 449 | 457 |
| 450 | 458 |
| 451 // static | 459 // static |
| 452 CompareICState::State CompareICState::TargetState( | 460 CompareICState::State CompareICState::TargetState( |
| 453 State old_state, State old_left, State old_right, Token::Value op, | 461 State old_state, State old_left, State old_right, Token::Value op, |
| 454 bool has_inlined_smi_code, Handle<Object> x, Handle<Object> y) { | 462 bool has_inlined_smi_code, Handle<Object> x, Handle<Object> y) { |
| 455 switch (old_state) { | 463 switch (old_state) { |
| 456 case UNINITIALIZED: | 464 case UNINITIALIZED: |
| 465 if (x->IsBoolean() && y->IsBoolean()) return BOOLEAN; |
| 457 if (x->IsSmi() && y->IsSmi()) return SMI; | 466 if (x->IsSmi() && y->IsSmi()) return SMI; |
| 458 if (x->IsNumber() && y->IsNumber()) return NUMBER; | 467 if (x->IsNumber() && y->IsNumber()) return NUMBER; |
| 459 if (Token::IsOrderedRelationalCompareOp(op)) { | 468 if (Token::IsOrderedRelationalCompareOp(op)) { |
| 460 // Ordered comparisons treat undefined as NaN, so the | 469 // Ordered comparisons treat undefined as NaN, so the |
| 461 // NUMBER stub will do the right thing. | 470 // NUMBER stub will do the right thing. |
| 462 if ((x->IsNumber() && y->IsUndefined()) || | 471 if ((x->IsNumber() && y->IsUndefined()) || |
| 463 (y->IsNumber() && x->IsUndefined())) { | 472 (y->IsNumber() && x->IsUndefined())) { |
| 464 return NUMBER; | 473 return NUMBER; |
| 465 } | 474 } |
| 466 } | 475 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 493 // then keep the state (if other changed at the same time, we will get | 502 // then keep the state (if other changed at the same time, we will get |
| 494 // a second miss and then go to generic). | 503 // a second miss and then go to generic). |
| 495 if (old_left == SMI && x->IsHeapNumber()) return NUMBER; | 504 if (old_left == SMI && x->IsHeapNumber()) return NUMBER; |
| 496 if (old_right == SMI && y->IsHeapNumber()) return NUMBER; | 505 if (old_right == SMI && y->IsHeapNumber()) return NUMBER; |
| 497 return GENERIC; | 506 return GENERIC; |
| 498 case KNOWN_OBJECT: | 507 case KNOWN_OBJECT: |
| 499 if (x->IsJSObject() && y->IsJSObject()) { | 508 if (x->IsJSObject() && y->IsJSObject()) { |
| 500 return Token::IsEqualityOp(op) ? OBJECT : GENERIC; | 509 return Token::IsEqualityOp(op) ? OBJECT : GENERIC; |
| 501 } | 510 } |
| 502 return GENERIC; | 511 return GENERIC; |
| 512 case BOOLEAN: |
| 503 case STRING: | 513 case STRING: |
| 504 case UNIQUE_NAME: | 514 case UNIQUE_NAME: |
| 505 case OBJECT: | 515 case OBJECT: |
| 506 case GENERIC: | 516 case GENERIC: |
| 507 return GENERIC; | 517 return GENERIC; |
| 508 } | 518 } |
| 509 UNREACHABLE(); | 519 UNREACHABLE(); |
| 510 return GENERIC; // Make the compiler happy. | 520 return GENERIC; // Make the compiler happy. |
| 511 } | 521 } |
| 522 |
| 512 } // namespace internal | 523 } // namespace internal |
| 513 } // namespace v8 | 524 } // namespace v8 |
| OLD | NEW |