Index: src/typing.cc |
diff --git a/src/typing.cc b/src/typing.cc |
index 4645950bba87e952e38c44c47626a0fd5488bcb9..4220d2110db1118138f309f963dc19f99a059582 100644 |
--- a/src/typing.cc |
+++ b/src/typing.cc |
@@ -248,12 +248,9 @@ void AstTyper::VisitConditional(Conditional* expr) { |
expr->condition()->RecordToBooleanTypeFeedback(oracle()); |
- MergeLowerType(expr, Type::Intersect( |
- expr->then_expression()->lower_type(), |
- expr->else_expression()->lower_type())); |
- MergeUpperType(expr, Type::Union( |
- expr->then_expression()->upper_type(), |
- expr->else_expression()->upper_type())); |
+ NarrowType(expr, Bounds::Either( |
+ expr->then_expression()->bounds(), |
+ expr->else_expression()->bounds(), isolate_)); |
} |
@@ -264,14 +261,12 @@ void AstTyper::VisitVariableProxy(VariableProxy* expr) { |
void AstTyper::VisitLiteral(Literal* expr) { |
Type* type = Type::Constant(expr->value(), isolate_); |
- MergeLowerType(expr, type); |
- MergeUpperType(expr, type); |
+ NarrowType(expr, Bounds(type, isolate_)); |
} |
void AstTyper::VisitRegExpLiteral(RegExpLiteral* expr) { |
- MergeLowerType(expr, Type::RegExp()); |
- MergeUpperType(expr, Type::RegExp()); |
+ NarrowType(expr, Bounds(Type::RegExp(), isolate_)); |
} |
@@ -290,8 +285,7 @@ void AstTyper::VisitObjectLiteral(ObjectLiteral* expr) { |
} |
} |
- MergeLowerType(expr, Type::Object()); |
- MergeUpperType(expr, Type::Object()); |
+ NarrowType(expr, Bounds(Type::Object(), isolate_)); |
} |
@@ -302,8 +296,7 @@ void AstTyper::VisitArrayLiteral(ArrayLiteral* expr) { |
RECURSE(Visit(value)); |
} |
- MergeLowerType(expr, Type::Array()); |
- MergeUpperType(expr, Type::Array()); |
+ NarrowType(expr, Bounds(Type::Array(), isolate_)); |
} |
@@ -320,6 +313,8 @@ void AstTyper::VisitAssignment(Assignment* expr) { |
expr->RecordTypeFeedback(oracle(), zone()); |
} |
} |
+ |
+ NarrowType(expr, expr->binary_operation()->bounds()); |
} else { |
RECURSE(Visit(expr->target())); |
RECURSE(Visit(expr->value())); |
@@ -328,8 +323,7 @@ void AstTyper::VisitAssignment(Assignment* expr) { |
expr->RecordTypeFeedback(oracle(), zone()); |
} |
- MergeLowerType(expr, expr->value()->lower_type()); |
- MergeUpperType(expr, expr->value()->upper_type()); |
+ NarrowType(expr, expr->value()->bounds()); |
} |
// TODO(rossberg): handle target variables |
} |
@@ -346,8 +340,7 @@ void AstTyper::VisitYield(Yield* expr) { |
void AstTyper::VisitThrow(Throw* expr) { |
RECURSE(Visit(expr->exception())); |
- // Lower type is None already. |
- MergeUpperType(expr, Type::None()); |
+ NarrowType(expr, Bounds(Type::None(), isolate_)); |
} |
@@ -412,7 +405,7 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) { |
// Collect type feedback. |
Handle<Type> op_type = oracle()->UnaryType(expr->UnaryOperationFeedbackId()); |
- MergeLowerType(expr->expression(), op_type); |
+ NarrowLowerType(expr->expression(), op_type); |
if (expr->op() == Token::NOT) { |
// TODO(rossberg): only do in test or value context. |
expr->expression()->RecordToBooleanTypeFeedback(oracle()); |
@@ -421,27 +414,23 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) { |
switch (expr->op()) { |
case Token::NOT: |
case Token::DELETE: |
- MergeLowerType(expr, Type::Boolean()); |
- MergeUpperType(expr, Type::Boolean()); |
+ NarrowType(expr, Bounds(Type::Boolean(), isolate_)); |
break; |
case Token::VOID: |
- MergeLowerType(expr, Type::Undefined()); |
- MergeUpperType(expr, Type::Undefined()); |
+ NarrowType(expr, Bounds(Type::Undefined(), isolate_)); |
break; |
case Token::ADD: |
case Token::SUB: { |
- MergeLowerType(expr, Type::Smi()); |
- Type* upper = *expr->expression()->upper_type(); |
- MergeUpperType(expr, upper->Is(Type::Number()) ? upper : Type::Number()); |
+ 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: |
- MergeLowerType(expr, Type::Smi()); |
- MergeUpperType(expr, Type::Signed32()); |
+ NarrowType(expr, Bounds(Type::Smi(), Type::Signed32(), isolate_)); |
break; |
case Token::TYPEOF: |
- MergeLowerType(expr, Type::InternalizedString()); |
- MergeUpperType(expr, Type::InternalizedString()); |
+ NarrowType(expr, Bounds(Type::InternalizedString(), isolate_)); |
break; |
default: |
UNREACHABLE(); |
@@ -458,8 +447,7 @@ void AstTyper::VisitCountOperation(CountOperation* expr) { |
prop->RecordTypeFeedback(oracle(), zone()); |
} |
- MergeLowerType(expr, Type::Smi()); |
- MergeUpperType(expr, Type::Number()); |
+ NarrowType(expr, Bounds(Type::Smi(), Type::Number(), isolate_)); |
} |
@@ -472,9 +460,9 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) { |
Maybe<int> fixed_right_arg; |
oracle()->BinaryType(expr->BinaryOperationFeedbackId(), |
&left_type, &right_type, &type, &fixed_right_arg); |
- MergeLowerType(expr, type); |
- MergeLowerType(expr->left(), left_type); |
- MergeLowerType(expr->right(), right_type); |
+ NarrowLowerType(expr, type); |
+ NarrowLowerType(expr->left(), left_type); |
+ NarrowLowerType(expr->right(), right_type); |
expr->set_fixed_right_arg(fixed_right_arg); |
if (expr->op() == Token::OR || expr->op() == Token::AND) { |
expr->left()->RecordToBooleanTypeFeedback(oracle()); |
@@ -482,56 +470,50 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) { |
switch (expr->op()) { |
case Token::COMMA: |
- MergeLowerType(expr, expr->right()->lower_type()); |
- MergeUpperType(expr, expr->right()->upper_type()); |
+ NarrowType(expr, expr->right()->bounds()); |
break; |
case Token::OR: |
case Token::AND: |
- MergeLowerType(expr, Type::Intersect( |
- expr->left()->lower_type(), expr->right()->lower_type())); |
- MergeUpperType(expr, Type::Union( |
- expr->left()->upper_type(), expr->right()->upper_type())); |
+ NarrowType(expr, Bounds::Either( |
+ expr->left()->bounds(), expr->right()->bounds(), isolate_)); |
break; |
case Token::BIT_OR: |
case Token::BIT_AND: { |
- MergeLowerType(expr, Type::Smi()); |
- Type* upper = |
- Type::Union(expr->left()->upper_type(), expr->right()->upper_type()); |
- MergeUpperType(expr, |
- upper->Is(Type::Signed32()) ? upper : Type::Signed32()); |
+ Type* upper = Type::Union( |
+ expr->left()->bounds().upper, expr->right()->bounds().upper); |
+ if (!upper->Is(Type::Signed32())) upper = Type::Signed32(); |
+ NarrowType(expr, Bounds(Type::Smi(), upper, isolate_)); |
break; |
} |
case Token::BIT_XOR: |
case Token::SHL: |
case Token::SAR: |
- MergeLowerType(expr, Type::Smi()); |
- MergeUpperType(expr, Type::Signed32()); |
+ NarrowType(expr, Bounds(Type::Smi(), Type::Signed32(), isolate_)); |
break; |
case Token::SHR: |
- MergeLowerType(expr, Type::Smi()); |
- MergeUpperType(expr, Type::Unsigned32()); |
+ NarrowType(expr, Bounds(Type::Smi(), Type::Unsigned32(), isolate_)); |
break; |
case Token::ADD: { |
- Handle<Type> l = expr->left()->lower_type(); |
- Handle<Type> r = expr->right()->lower_type(); |
- MergeLowerType(expr, |
- l->Is(Type::Number()) && r->Is(Type::Number()) ? Type::Smi() : |
- l->Is(Type::String()) || r->Is(Type::String()) ? Type::String() : |
- Type::None()); |
- l = expr->left()->upper_type(); |
- r = expr->right()->upper_type(); |
- MergeUpperType(expr, |
- l->Is(Type::Number()) && r->Is(Type::Number()) ? Type::Number() : |
- l->Is(Type::String()) || r->Is(Type::String()) ? Type::String() : |
- Type::NumberOrString()); |
+ Bounds l = expr->left()->bounds(); |
+ Bounds r = expr->right()->bounds(); |
+ Type* lower = |
+ l.lower->Is(Type::Number()) && r.lower->Is(Type::Number()) ? |
+ Type::Smi() : |
+ l.lower->Is(Type::String()) || r.lower->Is(Type::String()) ? |
+ Type::String() : Type::None(); |
+ Type* upper = |
+ l.upper->Is(Type::Number()) && r.upper->Is(Type::Number()) ? |
+ Type::Number() : |
+ l.upper->Is(Type::String()) || r.upper->Is(Type::String()) ? |
+ Type::String() : Type::NumberOrString(); |
+ NarrowType(expr, Bounds(lower, upper, isolate_)); |
break; |
} |
case Token::SUB: |
case Token::MUL: |
case Token::DIV: |
case Token::MOD: |
- MergeLowerType(expr, Type::Smi()); |
- MergeUpperType(expr, Type::Number()); |
+ NarrowType(expr, Bounds(Type::Smi(), Type::Number(), isolate_)); |
break; |
default: |
UNREACHABLE(); |
@@ -547,12 +529,11 @@ void AstTyper::VisitCompareOperation(CompareOperation* expr) { |
Handle<Type> left_type, right_type, combined_type; |
oracle()->CompareType(expr->CompareOperationFeedbackId(), |
&left_type, &right_type, &combined_type); |
- MergeLowerType(expr->left(), left_type); |
- MergeLowerType(expr->right(), right_type); |
+ NarrowLowerType(expr->left(), left_type); |
+ NarrowLowerType(expr->right(), right_type); |
expr->set_combined_type(combined_type); |
- MergeLowerType(expr, Type::Boolean()); |
- MergeUpperType(expr, Type::Boolean()); |
+ NarrowType(expr, Bounds(Type::Boolean(), isolate_)); |
} |