| Index: src/ic.cc | 
| diff --git a/src/ic.cc b/src/ic.cc | 
| index 095b61498623e01b0c6d48c1f0bc8ee6e7343733..db9a0884105da8018c38f9ee563e902d5ae04128 100644 | 
| --- a/src/ic.cc | 
| +++ b/src/ic.cc | 
| @@ -2408,17 +2408,34 @@ const char* UnaryOpIC::GetName(TypeInfo type_info) { | 
| UnaryOpIC::State UnaryOpIC::ToState(TypeInfo type_info) { | 
| switch (type_info) { | 
| case UNINITIALIZED: | 
| -      return ::v8::internal::UNINITIALIZED; | 
| +      return v8::internal::UNINITIALIZED; | 
| case SMI: | 
| case NUMBER: | 
| return MONOMORPHIC; | 
| case GENERIC: | 
| -      return ::v8::internal::GENERIC; | 
| +      return v8::internal::GENERIC; | 
| } | 
| UNREACHABLE(); | 
| -  return ::v8::internal::UNINITIALIZED; | 
| +  return v8::internal::UNINITIALIZED; | 
| } | 
|  | 
| + | 
| +Handle<Type> UnaryOpIC::TypeInfoToType(TypeInfo type_info, Isolate* isolate) { | 
| +  switch (type_info) { | 
| +    case UNINITIALIZED: | 
| +      return handle(Type::None(), isolate); | 
| +    case SMI: | 
| +      return handle(Type::Integer31(), isolate); | 
| +    case NUMBER: | 
| +      return handle(Type::Number(), isolate); | 
| +    case GENERIC: | 
| +      return handle(Type::Any(), isolate); | 
| +  } | 
| +  UNREACHABLE(); | 
| +  return handle(Type::Any(), isolate); | 
| +} | 
| + | 
| + | 
| UnaryOpIC::TypeInfo UnaryOpIC::GetTypeInfo(Handle<Object> operand) { | 
| v8::internal::TypeInfo operand_type = | 
| v8::internal::TypeInfo::FromValue(operand); | 
| @@ -2489,6 +2506,46 @@ BinaryOpIC::State BinaryOpIC::ToState(TypeInfo type_info) { | 
| } | 
|  | 
|  | 
| +Handle<Type> BinaryOpIC::TypeInfoToType(BinaryOpIC::TypeInfo binary_type, | 
| +                                        Isolate* isolate) { | 
| +  switch (binary_type) { | 
| +    case UNINITIALIZED: | 
| +      return handle(Type::None(), isolate); | 
| +    case SMI: | 
| +      return handle(Type::Integer31(), isolate); | 
| +    case INT32: | 
| +      return handle(Type::Integer32(), isolate); | 
| +    case NUMBER: | 
| +      return handle(Type::Number(), isolate); | 
| +    case ODDBALL: | 
| +      return handle(Type::Optional( | 
| +          handle(Type::Union( | 
| +              handle(Type::Number(), isolate), | 
| +              handle(Type::String(), isolate)), isolate)), isolate); | 
| +    case STRING: | 
| +      return handle(Type::String(), isolate); | 
| +    case GENERIC: | 
| +      return handle(Type::Any(), isolate); | 
| +  } | 
| +  UNREACHABLE(); | 
| +  return handle(Type::Any(), isolate); | 
| +} | 
| + | 
| + | 
| +void BinaryOpIC::StubInfoToType(int minor_key, | 
| +                                Handle<Type>* left, | 
| +                                Handle<Type>* right, | 
| +                                Handle<Type>* result, | 
| +                                Isolate* isolate) { | 
| +  TypeInfo left_typeinfo, right_typeinfo, result_typeinfo; | 
| +  BinaryOpStub::decode_types_from_minor_key( | 
| +      minor_key, &left_typeinfo, &right_typeinfo, &result_typeinfo); | 
| +  *left = TypeInfoToType(left_typeinfo, isolate); | 
| +  *right = TypeInfoToType(right_typeinfo, isolate); | 
| +  *result = TypeInfoToType(result_typeinfo, isolate); | 
| +} | 
| + | 
| + | 
| RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) { | 
| ASSERT(args.length() == 4); | 
|  | 
| @@ -2802,45 +2859,60 @@ Handle<Type> CompareIC::StateToType( | 
| } | 
|  | 
|  | 
| -static CompareIC::State InputState(CompareIC::State old_state, | 
| -                                   Handle<Object> value) { | 
| +void CompareIC::StubInfoToType(int stub_minor_key, | 
| +                               Handle<Type>* left_type, | 
| +                               Handle<Type>* right_type, | 
| +                               Handle<Type>* overall_type, | 
| +                               Handle<Map> map, | 
| +                               Isolate* isolate) { | 
| +  State left_state, right_state, handler_state; | 
| +  ICCompareStub::DecodeMinorKey(stub_minor_key, &left_state, &right_state, | 
| +                                &handler_state, NULL); | 
| +  *left_type = StateToType(isolate, left_state); | 
| +  *right_type = StateToType(isolate, right_state); | 
| +  *overall_type = StateToType(isolate, handler_state, map); | 
| +} | 
| + | 
| + | 
| +CompareIC::State CompareIC::NewInputState(State old_state, | 
| +                                          Handle<Object> value) { | 
| switch (old_state) { | 
| -    case CompareIC::UNINITIALIZED: | 
| -      if (value->IsSmi()) return CompareIC::SMI; | 
| -      if (value->IsHeapNumber()) return CompareIC::NUMBER; | 
| -      if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 
| -      if (value->IsString()) return CompareIC::STRING; | 
| -      if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; | 
| -      if (value->IsJSObject()) return CompareIC::OBJECT; | 
| +    case UNINITIALIZED: | 
| +      if (value->IsSmi()) return SMI; | 
| +      if (value->IsHeapNumber()) return NUMBER; | 
| +      if (value->IsInternalizedString()) return INTERNALIZED_STRING; | 
| +      if (value->IsString()) return STRING; | 
| +      if (value->IsSymbol()) return UNIQUE_NAME; | 
| +      if (value->IsJSObject()) return OBJECT; | 
| break; | 
| -    case CompareIC::SMI: | 
| -      if (value->IsSmi()) return CompareIC::SMI; | 
| -      if (value->IsHeapNumber()) return CompareIC::NUMBER; | 
| +    case SMI: | 
| +      if (value->IsSmi()) return SMI; | 
| +      if (value->IsHeapNumber()) return NUMBER; | 
| break; | 
| -    case CompareIC::NUMBER: | 
| -      if (value->IsNumber()) return CompareIC::NUMBER; | 
| +    case NUMBER: | 
| +      if (value->IsNumber()) return NUMBER; | 
| break; | 
| -    case CompareIC::INTERNALIZED_STRING: | 
| -      if (value->IsInternalizedString()) return CompareIC::INTERNALIZED_STRING; | 
| -      if (value->IsString()) return CompareIC::STRING; | 
| -      if (value->IsSymbol()) return CompareIC::UNIQUE_NAME; | 
| +    case INTERNALIZED_STRING: | 
| +      if (value->IsInternalizedString()) return INTERNALIZED_STRING; | 
| +      if (value->IsString()) return STRING; | 
| +      if (value->IsSymbol()) return UNIQUE_NAME; | 
| break; | 
| -    case CompareIC::STRING: | 
| -      if (value->IsString()) return CompareIC::STRING; | 
| +    case STRING: | 
| +      if (value->IsString()) return STRING; | 
| break; | 
| -    case CompareIC::UNIQUE_NAME: | 
| -      if (value->IsUniqueName()) return CompareIC::UNIQUE_NAME; | 
| +    case UNIQUE_NAME: | 
| +      if (value->IsUniqueName()) return UNIQUE_NAME; | 
| break; | 
| -    case CompareIC::OBJECT: | 
| -      if (value->IsJSObject()) return CompareIC::OBJECT; | 
| +    case OBJECT: | 
| +      if (value->IsJSObject()) return OBJECT; | 
| break; | 
| -    case CompareIC::GENERIC: | 
| +    case GENERIC: | 
| break; | 
| -    case CompareIC::KNOWN_OBJECT: | 
| +    case KNOWN_OBJECT: | 
| UNREACHABLE(); | 
| break; | 
| } | 
| -  return CompareIC::GENERIC; | 
| +  return GENERIC; | 
| } | 
|  | 
|  | 
| @@ -2913,8 +2985,8 @@ void CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { | 
| State previous_left, previous_right, previous_state; | 
| ICCompareStub::DecodeMinorKey(target()->stub_info(), &previous_left, | 
| &previous_right, &previous_state, NULL); | 
| -  State new_left = InputState(previous_left, x); | 
| -  State new_right = InputState(previous_right, y); | 
| +  State new_left = NewInputState(previous_left, x); | 
| +  State new_right = NewInputState(previous_right, y); | 
| State state = TargetState(previous_state, previous_left, previous_right, | 
| HasInlinedSmiCode(address()), x, y); | 
| ICCompareStub stub(op_, new_left, new_right, state); | 
|  |