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); |