| Index: src/crankshaft/typing.cc
|
| diff --git a/src/crankshaft/typing.cc b/src/crankshaft/typing.cc
|
| index db59c4d5adc07029558dbd7c4cee01a7465d1b20..bc1d6fa11b3efd94c63575e8d58034e6389f1e8c 100644
|
| --- a/src/crankshaft/typing.cc
|
| +++ b/src/crankshaft/typing.cc
|
| @@ -33,20 +33,20 @@ AstTyper::AstTyper(Isolate* isolate, Zone* zone, Handle<JSFunction> closure,
|
|
|
|
|
| #ifdef OBJECT_PRINT
|
| - static void PrintObserved(Variable* var, Object* value, Type* type) {
|
| - OFStream os(stdout);
|
| - os << " observed " << (var->IsParameter() ? "param" : "local") << " ";
|
| - var->name()->Print(os);
|
| - os << " : " << Brief(value) << " -> ";
|
| - type->PrintTo(os);
|
| - os << std::endl;
|
| +static void PrintObserved(Variable* var, Object* value, AstType* type) {
|
| + OFStream os(stdout);
|
| + os << " observed " << (var->IsParameter() ? "param" : "local") << " ";
|
| + var->name()->Print(os);
|
| + os << " : " << Brief(value) << " -> ";
|
| + type->PrintTo(os);
|
| + os << std::endl;
|
| }
|
| #endif // OBJECT_PRINT
|
|
|
|
|
| Effect AstTyper::ObservedOnStack(Object* value) {
|
| - Type* lower = Type::NowOf(value, zone());
|
| - return Effect(Bounds(lower, Type::Any()));
|
| + AstType* lower = AstType::NowOf(value, zone());
|
| + return Effect(AstBounds(lower, AstType::Any()));
|
| }
|
|
|
|
|
| @@ -206,9 +206,9 @@ void AstTyper::VisitSwitchStatement(SwitchStatement* stmt) {
|
| if (!clause->is_default()) {
|
| Expression* label = clause->label();
|
| // Collect type feedback.
|
| - Type* tag_type;
|
| - Type* label_type;
|
| - Type* combined_type;
|
| + AstType* tag_type;
|
| + AstType* label_type;
|
| + AstType* combined_type;
|
| oracle()->CompareType(clause->CompareId(),
|
| &tag_type, &label_type, &combined_type);
|
| NarrowLowerType(stmt->tag(), tag_type);
|
| @@ -367,8 +367,8 @@ void AstTyper::VisitConditional(Conditional* expr) {
|
| store_.Seq(then_effects);
|
|
|
| NarrowType(expr,
|
| - Bounds::Either(bounds_->get(expr->then_expression()),
|
| - bounds_->get(expr->else_expression()), zone()));
|
| + AstBounds::Either(bounds_->get(expr->then_expression()),
|
| + bounds_->get(expr->else_expression()), zone()));
|
| }
|
|
|
|
|
| @@ -381,14 +381,14 @@ void AstTyper::VisitVariableProxy(VariableProxy* expr) {
|
|
|
|
|
| void AstTyper::VisitLiteral(Literal* expr) {
|
| - Type* type = Type::Constant(expr->value(), zone());
|
| - NarrowType(expr, Bounds(type));
|
| + AstType* type = AstType::Constant(expr->value(), zone());
|
| + NarrowType(expr, AstBounds(type));
|
| }
|
|
|
|
|
| void AstTyper::VisitRegExpLiteral(RegExpLiteral* expr) {
|
| // TODO(rossberg): Reintroduce RegExp type.
|
| - NarrowType(expr, Bounds(Type::Object()));
|
| + NarrowType(expr, AstBounds(AstType::Object()));
|
| }
|
|
|
|
|
| @@ -416,7 +416,7 @@ void AstTyper::VisitObjectLiteral(ObjectLiteral* expr) {
|
| RECURSE(Visit(prop->value()));
|
| }
|
|
|
| - NarrowType(expr, Bounds(Type::Object()));
|
| + NarrowType(expr, AstBounds(AstType::Object()));
|
| }
|
|
|
|
|
| @@ -427,7 +427,7 @@ void AstTyper::VisitArrayLiteral(ArrayLiteral* expr) {
|
| RECURSE(Visit(value));
|
| }
|
|
|
| - NarrowType(expr, Bounds(Type::Object()));
|
| + NarrowType(expr, AstBounds(AstType::Object()));
|
| }
|
|
|
|
|
| @@ -480,7 +480,7 @@ void AstTyper::VisitThrow(Throw* expr) {
|
| RECURSE(Visit(expr->exception()));
|
| // TODO(rossberg): is it worth having a non-termination effect?
|
|
|
| - NarrowType(expr, Bounds(Type::None()));
|
| + NarrowType(expr, AstBounds(AstType::None()));
|
| }
|
|
|
|
|
| @@ -563,7 +563,7 @@ void AstTyper::VisitCallNew(CallNew* expr) {
|
| RECURSE(Visit(arg));
|
| }
|
|
|
| - NarrowType(expr, Bounds(Type::None(), Type::Receiver()));
|
| + NarrowType(expr, AstBounds(AstType::None(), AstType::Receiver()));
|
| }
|
|
|
|
|
| @@ -590,13 +590,13 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) {
|
| switch (expr->op()) {
|
| case Token::NOT:
|
| case Token::DELETE:
|
| - NarrowType(expr, Bounds(Type::Boolean()));
|
| + NarrowType(expr, AstBounds(AstType::Boolean()));
|
| break;
|
| case Token::VOID:
|
| - NarrowType(expr, Bounds(Type::Undefined()));
|
| + NarrowType(expr, AstBounds(AstType::Undefined()));
|
| break;
|
| case Token::TYPEOF:
|
| - NarrowType(expr, Bounds(Type::InternalizedString()));
|
| + NarrowType(expr, AstBounds(AstType::InternalizedString()));
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -618,7 +618,7 @@ void AstTyper::VisitCountOperation(CountOperation* expr) {
|
|
|
| RECURSE(Visit(expr->expression()));
|
|
|
| - NarrowType(expr, Bounds(Type::SignedSmall(), Type::Number()));
|
| + NarrowType(expr, AstBounds(AstType::SignedSmall(), AstType::Number()));
|
|
|
| VariableProxy* proxy = expr->expression()->AsVariableProxy();
|
| if (proxy != NULL && proxy->var()->IsStackAllocated()) {
|
| @@ -629,9 +629,9 @@ void AstTyper::VisitCountOperation(CountOperation* expr) {
|
|
|
| void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| // Collect type feedback.
|
| - Type* type;
|
| - Type* left_type;
|
| - Type* right_type;
|
| + AstType* type;
|
| + AstType* left_type;
|
| + AstType* right_type;
|
| Maybe<int> fixed_right_arg = Nothing<int>();
|
| Handle<AllocationSite> allocation_site;
|
| oracle()->BinaryType(expr->BinaryOperationFeedbackId(),
|
| @@ -663,19 +663,21 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| left_effects.Alt(right_effects);
|
| store_.Seq(left_effects);
|
|
|
| - NarrowType(expr, Bounds::Either(bounds_->get(expr->left()),
|
| - bounds_->get(expr->right()), zone()));
|
| + NarrowType(expr, AstBounds::Either(bounds_->get(expr->left()),
|
| + bounds_->get(expr->right()), zone()));
|
| break;
|
| }
|
| case Token::BIT_OR:
|
| case Token::BIT_AND: {
|
| RECURSE(Visit(expr->left()));
|
| RECURSE(Visit(expr->right()));
|
| - Type* upper = Type::Union(bounds_->get(expr->left()).upper,
|
| - bounds_->get(expr->right()).upper, zone());
|
| - if (!upper->Is(Type::Signed32())) upper = Type::Signed32();
|
| - Type* lower = Type::Intersect(Type::SignedSmall(), upper, zone());
|
| - NarrowType(expr, Bounds(lower, upper));
|
| + AstType* upper =
|
| + AstType::Union(bounds_->get(expr->left()).upper,
|
| + bounds_->get(expr->right()).upper, zone());
|
| + if (!upper->Is(AstType::Signed32())) upper = AstType::Signed32();
|
| + AstType* lower =
|
| + AstType::Intersect(AstType::SignedSmall(), upper, zone());
|
| + NarrowType(expr, AstBounds(lower, upper));
|
| break;
|
| }
|
| case Token::BIT_XOR:
|
| @@ -683,7 +685,7 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| case Token::SAR:
|
| RECURSE(Visit(expr->left()));
|
| RECURSE(Visit(expr->right()));
|
| - NarrowType(expr, Bounds(Type::SignedSmall(), Type::Signed32()));
|
| + NarrowType(expr, AstBounds(AstType::SignedSmall(), AstType::Signed32()));
|
| break;
|
| case Token::SHR:
|
| RECURSE(Visit(expr->left()));
|
| @@ -691,28 +693,29 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| // TODO(rossberg): The upper bound would be Unsigned32, but since there
|
| // is no 'positive Smi' type for the lower bound, we use the smallest
|
| // union of Smi and Unsigned32 as upper bound instead.
|
| - NarrowType(expr, Bounds(Type::SignedSmall(), Type::Number()));
|
| + NarrowType(expr, AstBounds(AstType::SignedSmall(), AstType::Number()));
|
| break;
|
| case Token::ADD: {
|
| RECURSE(Visit(expr->left()));
|
| RECURSE(Visit(expr->right()));
|
| - Bounds l = bounds_->get(expr->left());
|
| - Bounds r = bounds_->get(expr->right());
|
| - Type* lower =
|
| + AstBounds l = bounds_->get(expr->left());
|
| + AstBounds r = bounds_->get(expr->right());
|
| + AstType* lower =
|
| !l.lower->IsInhabited() || !r.lower->IsInhabited()
|
| - ? Type::None()
|
| - : l.lower->Is(Type::String()) || r.lower->Is(Type::String())
|
| - ? Type::String()
|
| - : l.lower->Is(Type::Number()) && r.lower->Is(Type::Number())
|
| - ? Type::SignedSmall()
|
| - : Type::None();
|
| - Type* upper =
|
| - l.upper->Is(Type::String()) || r.upper->Is(Type::String())
|
| - ? Type::String()
|
| - : l.upper->Is(Type::Number()) && r.upper->Is(Type::Number())
|
| - ? Type::Number()
|
| - : Type::NumberOrString();
|
| - NarrowType(expr, Bounds(lower, upper));
|
| + ? AstType::None()
|
| + : l.lower->Is(AstType::String()) || r.lower->Is(AstType::String())
|
| + ? AstType::String()
|
| + : l.lower->Is(AstType::Number()) &&
|
| + r.lower->Is(AstType::Number())
|
| + ? AstType::SignedSmall()
|
| + : AstType::None();
|
| + AstType* upper =
|
| + l.upper->Is(AstType::String()) || r.upper->Is(AstType::String())
|
| + ? AstType::String()
|
| + : l.upper->Is(AstType::Number()) && r.upper->Is(AstType::Number())
|
| + ? AstType::Number()
|
| + : AstType::NumberOrString();
|
| + NarrowType(expr, AstBounds(lower, upper));
|
| break;
|
| }
|
| case Token::SUB:
|
| @@ -721,7 +724,7 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
| case Token::MOD:
|
| RECURSE(Visit(expr->left()));
|
| RECURSE(Visit(expr->right()));
|
| - NarrowType(expr, Bounds(Type::SignedSmall(), Type::Number()));
|
| + NarrowType(expr, AstBounds(AstType::SignedSmall(), AstType::Number()));
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -731,9 +734,9 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
|
|
|
| void AstTyper::VisitCompareOperation(CompareOperation* expr) {
|
| // Collect type feedback.
|
| - Type* left_type;
|
| - Type* right_type;
|
| - Type* combined_type;
|
| + AstType* left_type;
|
| + AstType* right_type;
|
| + AstType* combined_type;
|
| oracle()->CompareType(expr->CompareOperationFeedbackId(),
|
| &left_type, &right_type, &combined_type);
|
| NarrowLowerType(expr->left(), left_type);
|
| @@ -743,7 +746,7 @@ void AstTyper::VisitCompareOperation(CompareOperation* expr) {
|
| RECURSE(Visit(expr->left()));
|
| RECURSE(Visit(expr->right()));
|
|
|
| - NarrowType(expr, Bounds(Type::Boolean()));
|
| + NarrowType(expr, AstBounds(AstType::Boolean()));
|
| }
|
|
|
|
|
|
|