Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index e88ba7d75e10b455c95ea88c86143a1d7080e314..9f84d0a4fc95652650fcaed18a0c6694957718fe 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -399,7 +399,7 @@ void CompareIC::Clear(Address address, Code* target) { |
ICCompareStub::DecodeMinorKey(target->stub_info(), NULL, NULL, |
&handler_state, &op); |
// Only clear CompareICs that can retain objects. |
- if (handler_state != KNOWN_OBJECTS) return; |
+ if (handler_state != KNOWN_OBJECT) return; |
SetTargetAtAddress(address, GetRawUninitialized(op)); |
PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); |
} |
@@ -2038,7 +2038,7 @@ const char* UnaryOpIC::GetName(TypeInfo type_info) { |
switch (type_info) { |
case UNINITIALIZED: return "Uninitialized"; |
case SMI: return "Smi"; |
- case HEAP_NUMBER: return "HeapNumbers"; |
+ case NUMBER: return "Number"; |
case GENERIC: return "Generic"; |
default: return "Invalid"; |
} |
@@ -2050,7 +2050,7 @@ UnaryOpIC::State UnaryOpIC::ToState(TypeInfo type_info) { |
case UNINITIALIZED: |
return ::v8::internal::UNINITIALIZED; |
case SMI: |
- case HEAP_NUMBER: |
+ case NUMBER: |
return MONOMORPHIC; |
case GENERIC: |
return ::v8::internal::GENERIC; |
@@ -2065,7 +2065,7 @@ UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { |
if (operand_type.IsSmi()) { |
return SMI; |
} else if (operand_type.IsNumber()) { |
- return HEAP_NUMBER; |
+ return NUMBER; |
} else { |
return GENERIC; |
} |
@@ -2073,24 +2073,22 @@ UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { |
UnaryOpIC::TypeInfo UnaryOpIC::ComputeNewType( |
- UnaryOpIC::TypeInfo current_type, |
- UnaryOpIC::TypeInfo previous_type) { |
+ TypeInfo current_type, |
+ TypeInfo previous_type) { |
switch (previous_type) { |
- case UnaryOpIC::UNINITIALIZED: |
+ case UNINITIALIZED: |
return current_type; |
- case UnaryOpIC::SMI: |
- return (current_type == UnaryOpIC::GENERIC) |
- ? UnaryOpIC::GENERIC |
- : UnaryOpIC::HEAP_NUMBER; |
- case UnaryOpIC::HEAP_NUMBER: |
- return UnaryOpIC::GENERIC; |
- case UnaryOpIC::GENERIC: |
+ case SMI: |
+ return (current_type == GENERIC) ? GENERIC : NUMBER; |
+ case NUMBER: |
+ return GENERIC; |
+ case GENERIC: |
// We should never do patching if we are in GENERIC state. |
UNREACHABLE(); |
- return UnaryOpIC::GENERIC; |
+ return GENERIC; |
} |
UNREACHABLE(); |
- return UnaryOpIC::GENERIC; |
+ return GENERIC; |
} |
@@ -2102,9 +2100,9 @@ void BinaryOpIC::patch(Code* code) { |
const char* BinaryOpIC::GetName(TypeInfo type_info) { |
switch (type_info) { |
case UNINITIALIZED: return "Uninitialized"; |
- case SMI: return "SMI"; |
+ case SMI: return "Smi"; |
case INT32: return "Int32"; |
- case HEAP_NUMBER: return "HeapNumber"; |
+ case NUMBER: return "Number"; |
case ODDBALL: return "Oddball"; |
case STRING: return "String"; |
case GENERIC: return "Generic"; |
@@ -2119,7 +2117,7 @@ BinaryOpIC::State BinaryOpIC::ToState(TypeInfo type_info) { |
return ::v8::internal::UNINITIALIZED; |
case SMI: |
case INT32: |
- case HEAP_NUMBER: |
+ case NUMBER: |
case ODDBALL: |
case STRING: |
return MONOMORPHIC; |
@@ -2195,7 +2193,7 @@ static BinaryOpIC::TypeInfo TypeInfoFromValue(Handle<Object> value, |
if (kSmiValueSize == 32) return BinaryOpIC::SMI; |
return BinaryOpIC::INT32; |
} |
- if (type.IsNumber()) return BinaryOpIC::HEAP_NUMBER; |
+ if (type.IsNumber()) return BinaryOpIC::NUMBER; |
if (type.IsString()) return BinaryOpIC::STRING; |
if (value->IsUndefined()) { |
if (op == Token::BIT_AND || |
@@ -2259,7 +2257,7 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { |
// That is the only way to get here from the Smi stub. |
// With 32-bit Smis, all overflows give heap numbers, but with |
// 31-bit Smis, most operations overflow to int32 results. |
- result_type = BinaryOpIC::HEAP_NUMBER; |
+ result_type = BinaryOpIC::NUMBER; |
} else { |
// Other operations on SMIs that overflow yield int32s. |
result_type = BinaryOpIC::INT32; |
@@ -2268,7 +2266,7 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { |
if (new_overall == BinaryOpIC::INT32 && |
previous_overall == BinaryOpIC::INT32) { |
if (new_left == previous_left && new_right == previous_right) { |
- result_type = BinaryOpIC::HEAP_NUMBER; |
+ result_type = BinaryOpIC::NUMBER; |
} |
} |
@@ -2373,11 +2371,11 @@ const char* CompareIC::GetStateName(State state) { |
switch (state) { |
case UNINITIALIZED: return "UNINITIALIZED"; |
case SMI: return "SMI"; |
- case HEAP_NUMBER: return "HEAP_NUMBER"; |
- case OBJECT: return "OBJECTS"; |
- case KNOWN_OBJECTS: return "KNOWN_OBJECTS"; |
+ case NUMBER: return "NUMBER"; |
case SYMBOL: return "SYMBOL"; |
case STRING: return "STRING"; |
+ case OBJECT: return "OBJECT"; |
+ case KNOWN_OBJECT: return "KNOWN_OBJECT"; |
case GENERIC: return "GENERIC"; |
default: |
UNREACHABLE(); |
@@ -2391,17 +2389,17 @@ static CompareIC::State InputState(CompareIC::State old_state, |
switch (old_state) { |
case CompareIC::UNINITIALIZED: |
if (value->IsSmi()) return CompareIC::SMI; |
- if (value->IsHeapNumber()) return CompareIC::HEAP_NUMBER; |
+ if (value->IsHeapNumber()) return CompareIC::NUMBER; |
if (value->IsSymbol()) return CompareIC::SYMBOL; |
if (value->IsString()) return CompareIC::STRING; |
if (value->IsJSObject()) return CompareIC::OBJECT; |
break; |
case CompareIC::SMI: |
if (value->IsSmi()) return CompareIC::SMI; |
- if (value->IsHeapNumber()) return CompareIC::HEAP_NUMBER; |
+ if (value->IsHeapNumber()) return CompareIC::NUMBER; |
break; |
- case CompareIC::HEAP_NUMBER: |
- if (value->IsNumber()) return CompareIC::HEAP_NUMBER; |
+ case CompareIC::NUMBER: |
+ if (value->IsNumber()) return CompareIC::NUMBER; |
break; |
case CompareIC::SYMBOL: |
if (value->IsSymbol()) return CompareIC::SYMBOL; |
@@ -2415,7 +2413,7 @@ static CompareIC::State InputState(CompareIC::State old_state, |
break; |
case CompareIC::GENERIC: |
break; |
- case CompareIC::KNOWN_OBJECTS: |
+ case CompareIC::KNOWN_OBJECT: |
UNREACHABLE(); |
break; |
} |
@@ -2432,13 +2430,13 @@ CompareIC::State CompareIC::TargetState(State old_state, |
switch (old_state) { |
case UNINITIALIZED: |
if (x->IsSmi() && y->IsSmi()) return SMI; |
- if (x->IsNumber() && y->IsNumber()) return HEAP_NUMBER; |
+ if (x->IsNumber() && y->IsNumber()) return NUMBER; |
if (Token::IsOrderedRelationalCompareOp(op_)) { |
// Ordered comparisons treat undefined as NaN, so the |
- // HEAP_NUMBER stub will do the right thing. |
+ // NUMBER stub will do the right thing. |
if ((x->IsNumber() && y->IsUndefined()) || |
(y->IsNumber() && x->IsUndefined())) { |
- return HEAP_NUMBER; |
+ return NUMBER; |
} |
} |
if (x->IsSymbol() && y->IsSymbol()) { |
@@ -2450,27 +2448,31 @@ CompareIC::State CompareIC::TargetState(State old_state, |
if (!Token::IsEqualityOp(op_)) return GENERIC; |
if (x->IsJSObject() && y->IsJSObject()) { |
if (Handle<JSObject>::cast(x)->map() == |
- Handle<JSObject>::cast(y)->map() && |
- Token::IsEqualityOp(op_)) { |
- return KNOWN_OBJECTS; |
+ Handle<JSObject>::cast(y)->map()) { |
+ return KNOWN_OBJECT; |
} else { |
return OBJECT; |
} |
} |
return GENERIC; |
case SMI: |
- return x->IsNumber() && y->IsNumber() |
- ? HEAP_NUMBER |
- : GENERIC; |
+ return x->IsNumber() && y->IsNumber() ? NUMBER : GENERIC; |
case SYMBOL: |
ASSERT(Token::IsEqualityOp(op_)); |
return x->IsString() && y->IsString() ? STRING : GENERIC; |
- case HEAP_NUMBER: |
- if (old_left == SMI && x->IsHeapNumber()) return HEAP_NUMBER; |
- if (old_right == SMI && y->IsHeapNumber()) return HEAP_NUMBER; |
+ case NUMBER: |
+ // If the failure was due to one side changing from smi to heap number, |
+ // then keep the state (if other changed at the same time, we will get |
+ // a second miss and then go to generic). |
+ if (old_left == SMI && x->IsHeapNumber()) return NUMBER; |
+ if (old_right == SMI && y->IsHeapNumber()) return NUMBER; |
+ return GENERIC; |
+ case KNOWN_OBJECT: |
+ ASSERT(Token::IsEqualityOp(op_)); |
+ if (x->IsJSObject() && y->IsJSObject()) return OBJECT; |
+ return GENERIC; |
case STRING: |
case OBJECT: |
- case KNOWN_OBJECTS: |
case GENERIC: |
return GENERIC; |
} |
@@ -2489,7 +2491,7 @@ void CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { |
State state = TargetState(previous_state, previous_left, previous_right, |
HasInlinedSmiCode(address()), x, y); |
ICCompareStub stub(op_, new_left, new_right, state); |
- if (state == KNOWN_OBJECTS) { |
+ if (state == KNOWN_OBJECT) { |
stub.set_known_map(Handle<Map>(Handle<JSObject>::cast(x)->map())); |
} |
set_target(*stub.GetCode()); |