Index: src/compiler/type-hint-analyzer.cc |
diff --git a/src/compiler/type-hint-analyzer.cc b/src/compiler/type-hint-analyzer.cc |
index f9a587667c7b142efddc282056e89447242d5b73..3146f11b8f08b618952d07284409c8a79ddae0bd 100644 |
--- a/src/compiler/type-hint-analyzer.cc |
+++ b/src/compiler/type-hint-analyzer.cc |
@@ -15,76 +15,69 @@ namespace compiler { |
namespace { |
-// TODO(bmeurer): This detour via types is ugly. |
-BinaryOperationHints::Hint ToBinaryOperationHint(Type* type) { |
- if (type->Is(Type::None())) return BinaryOperationHints::kNone; |
- if (type->Is(Type::SignedSmall())) return BinaryOperationHints::kSignedSmall; |
- if (type->Is(Type::Signed32())) return BinaryOperationHints::kSigned32; |
- if (type->Is(Type::Number())) return BinaryOperationHints::kNumberOrOddball; |
- if (type->Is(Type::String())) return BinaryOperationHints::kString; |
- return BinaryOperationHints::kAny; |
+BinaryOperationHint ToBinaryOperationHint(BinaryOpICState::Kind kind) { |
+ switch (kind) { |
+ case BinaryOpICState::NONE: |
+ return BinaryOperationHint::kNone; |
+ case BinaryOpICState::SMI: |
+ return BinaryOperationHint::kSignedSmall; |
+ case BinaryOpICState::INT32: |
+ return BinaryOperationHint::kSigned32; |
+ case BinaryOpICState::NUMBER: |
+ return BinaryOperationHint::kNumberOrOddball; |
+ case BinaryOpICState::STRING: |
+ case BinaryOpICState::GENERIC: |
+ return BinaryOperationHint::kAny; |
+ } |
+ UNREACHABLE(); |
+ return BinaryOperationHint::kNone; |
} |
-CompareOperationHints::Hint ToCompareOperationHint( |
- Token::Value op, CompareICState::State state) { |
+CompareOperationHint ToCompareOperationHint(Token::Value op, |
+ CompareICState::State state) { |
switch (state) { |
case CompareICState::UNINITIALIZED: |
- return CompareOperationHints::kNone; |
- case CompareICState::BOOLEAN: |
- return CompareOperationHints::kBoolean; |
+ return CompareOperationHint::kNone; |
case CompareICState::SMI: |
- return CompareOperationHints::kSignedSmall; |
+ return CompareOperationHint::kSignedSmall; |
case CompareICState::NUMBER: |
return Token::IsOrderedRelationalCompareOp(op) |
- ? CompareOperationHints::kNumberOrOddball |
- : CompareOperationHints::kNumber; |
+ ? CompareOperationHint::kNumberOrOddball |
+ : CompareOperationHint::kNumber; |
case CompareICState::STRING: |
- return CompareOperationHints::kString; |
case CompareICState::INTERNALIZED_STRING: |
- return CompareOperationHints::kInternalizedString; |
case CompareICState::UNIQUE_NAME: |
- return CompareOperationHints::kUniqueName; |
case CompareICState::RECEIVER: |
case CompareICState::KNOWN_RECEIVER: |
- return CompareOperationHints::kReceiver; |
+ case CompareICState::BOOLEAN: |
case CompareICState::GENERIC: |
- return CompareOperationHints::kAny; |
+ return CompareOperationHint::kAny; |
} |
UNREACHABLE(); |
- return CompareOperationHints::kAny; |
+ return CompareOperationHint::kNone; |
} |
} // namespace |
-bool TypeHintAnalysis::GetBinaryOperationHints( |
- TypeFeedbackId id, BinaryOperationHints* hints) const { |
+bool TypeHintAnalysis::GetBinaryOperationHint(TypeFeedbackId id, |
+ BinaryOperationHint* hint) const { |
auto i = infos_.find(id); |
if (i == infos_.end()) return false; |
Handle<Code> code = i->second; |
DCHECK_EQ(Code::BINARY_OP_IC, code->kind()); |
BinaryOpICState state(code->GetIsolate(), code->extra_ic_state()); |
- *hints = BinaryOperationHints(ToBinaryOperationHint(state.GetLeftType()), |
- ToBinaryOperationHint(state.GetRightType()), |
- ToBinaryOperationHint(state.GetResultType())); |
+ *hint = ToBinaryOperationHint(state.kind()); |
return true; |
} |
-bool TypeHintAnalysis::GetCompareOperationHints( |
- TypeFeedbackId id, CompareOperationHints* hints) const { |
+bool TypeHintAnalysis::GetCompareOperationHint( |
+ TypeFeedbackId id, CompareOperationHint* hint) const { |
auto i = infos_.find(id); |
if (i == infos_.end()) return false; |
Handle<Code> code = i->second; |
DCHECK_EQ(Code::COMPARE_IC, code->kind()); |
- |
- Handle<Map> map; |
- Map* raw_map = code->FindFirstMap(); |
- if (raw_map != nullptr) Map::TryUpdate(handle(raw_map)).ToHandle(&map); |
- |
CompareICStub stub(code->stub_key(), code->GetIsolate()); |
- *hints = |
- CompareOperationHints(ToCompareOperationHint(stub.op(), stub.left()), |
- ToCompareOperationHint(stub.op(), stub.right()), |
- ToCompareOperationHint(stub.op(), stub.state())); |
+ *hint = ToCompareOperationHint(stub.op(), stub.state()); |
return true; |
} |
@@ -139,18 +132,19 @@ TypeHintAnalysis* TypeHintAnalyzer::Analyze(Handle<Code> code) { |
return new (zone()) TypeHintAnalysis(infos, zone()); |
} |
-// Helper function to transform the feedback to BinaryOperationHints |
-BinaryOperationHints::Hint BinaryOperationHintFromFeedback(int type_feedback) { |
+// Helper function to transform the feedback to BinaryOperationHint. |
+BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback) { |
switch (type_feedback) { |
case BinaryOperationFeedback::kSignedSmall: |
- return BinaryOperationHints::kSigned32; |
+ return BinaryOperationHint::kSigned32; |
case BinaryOperationFeedback::kNumber: |
- return BinaryOperationHints::kNumberOrOddball; |
+ return BinaryOperationHint::kNumberOrOddball; |
case BinaryOperationFeedback::kAny: |
default: |
- return BinaryOperationHints::kAny; |
+ return BinaryOperationHint::kAny; |
} |
- return BinaryOperationHints::kAny; |
+ UNREACHABLE(); |
+ return BinaryOperationHint::kNone; |
} |
} // namespace compiler |