Index: src/ic.cc |
=================================================================== |
--- src/ic.cc (revision 6011) |
+++ src/ic.cc (working copy) |
@@ -1951,7 +1951,7 @@ |
TRBinaryOpIC::TypeInfo TRBinaryOpIC::JoinTypes(TRBinaryOpIC::TypeInfo x, |
- TRBinaryOpIC::TypeInfo y) { |
+ TRBinaryOpIC::TypeInfo y) { |
if (x == UNINITIALIZED) return y; |
if (y == UNINITIALIZED) return x; |
if (x == STRING && y == STRING) return STRING; |
@@ -2041,6 +2041,11 @@ |
TRBinaryOpIC::GetName(result_type), |
Token::Name(op)); |
} |
+ |
+ // Activate inlined smi code. |
+ if (previous_type == TRBinaryOpIC::UNINITIALIZED) { |
+ PatchInlinedSmiCode(ic.address()); |
+ } |
} |
Handle<JSBuiltinsObject> builtins = Top::builtins(); |
@@ -2127,13 +2132,17 @@ |
} |
-CompareIC::State CompareIC::TargetState(Handle<Object> x, Handle<Object> y) { |
- State state = GetState(); |
- if (state != UNINITIALIZED) return GENERIC; |
- if (x->IsSmi() && y->IsSmi()) return SMIS; |
- if (x->IsNumber() && y->IsNumber()) return HEAP_NUMBERS; |
+CompareIC::State CompareIC::TargetState(State state, |
+ bool has_inlined_smi_code, |
+ Handle<Object> x, |
+ Handle<Object> y) { |
+ if (!has_inlined_smi_code && state != UNINITIALIZED) return GENERIC; |
+ if (state == UNINITIALIZED && x->IsSmi() && y->IsSmi()) return SMIS; |
+ if ((state == UNINITIALIZED || (state == SMIS && has_inlined_smi_code)) && |
+ x->IsNumber() && y->IsNumber()) return HEAP_NUMBERS; |
if (op_ != Token::EQ && op_ != Token::EQ_STRICT) return GENERIC; |
- if (x->IsJSObject() && y->IsJSObject()) return OBJECTS; |
+ if (state == UNINITIALIZED && |
+ x->IsJSObject() && y->IsJSObject()) return OBJECTS; |
return GENERIC; |
} |