Index: src/typing.cc |
diff --git a/src/typing.cc b/src/typing.cc |
index 727c104ab5fd77d7f4427447bda7be43a3944f73..4220d2110db1118138f309f963dc19f99a059582 100644 |
--- a/src/typing.cc |
+++ b/src/typing.cc |
@@ -404,6 +404,8 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) { |
RECURSE(Visit(expr->expression())); |
// Collect type feedback. |
+ Handle<Type> op_type = oracle()->UnaryType(expr->UnaryOperationFeedbackId()); |
+ NarrowLowerType(expr->expression(), op_type); |
if (expr->op() == Token::NOT) { |
// TODO(rossberg): only do in test or value context. |
expr->expression()->RecordToBooleanTypeFeedback(oracle()); |
@@ -417,6 +419,16 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) { |
case Token::VOID: |
NarrowType(expr, Bounds(Type::Undefined(), isolate_)); |
break; |
+ case Token::ADD: |
+ case Token::SUB: { |
+ Type* upper = *expr->expression()->bounds().upper; |
+ if (!upper->Is(Type::Number())) upper = Type::Number(); |
+ NarrowType(expr, Bounds(Type::Smi(), upper, isolate_)); |
+ break; |
+ } |
+ case Token::BIT_NOT: |
+ NarrowType(expr, Bounds(Type::Smi(), Type::Signed32(), isolate_)); |
+ break; |
case Token::TYPEOF: |
NarrowType(expr, Bounds(Type::InternalizedString(), isolate_)); |
break; |