Index: src/typing-asm.cc |
diff --git a/src/typing-asm.cc b/src/typing-asm.cc |
index e541539a78329622030aea37dcb3556c31d05458..d98998520fae35bbc16c305979a6123df1be0cd7 100644 |
--- a/src/typing-asm.cc |
+++ b/src/typing-asm.cc |
@@ -508,7 +508,7 @@ void AsmTyper::VisitFunctionLiteral(FunctionLiteral* expr) { |
RECURSE(VisitStatements(expr->body())); |
in_function_ = false; |
return_type_ = save_return_type; |
- IntersectResult(expr, type); |
+ RECURSE(IntersectResult(expr, type)); |
} |
@@ -552,7 +552,7 @@ void AsmTyper::VisitConditional(Conditional* expr) { |
FAIL(expr, "then and else expressions in ? must have the same type"); |
} |
- IntersectResult(expr, then_type); |
+ RECURSE(IntersectResult(expr, then_type)); |
} |
@@ -579,7 +579,7 @@ void AsmTyper::VisitVariableProxy(VariableProxy* expr) { |
Type* type = Type::Intersect(info->type, expected_type_, zone()); |
if (type->Is(cache_.kAsmInt)) type = cache_.kAsmInt; |
intish_ = 0; |
- IntersectResult(expr, type); |
+ RECURSE(IntersectResult(expr, type)); |
} |
void AsmTyper::VisitLiteral(Literal* expr, bool is_return) { |
@@ -589,22 +589,22 @@ void AsmTyper::VisitLiteral(Literal* expr, bool is_return) { |
int32_t i; |
uint32_t u; |
if (expr->raw_value()->ContainsDot()) { |
- IntersectResult(expr, cache_.kAsmDouble); |
+ RECURSE(IntersectResult(expr, cache_.kAsmDouble)); |
} else if (!is_return && value->ToUint32(&u)) { |
if (u <= 0x7fffffff) { |
- IntersectResult(expr, cache_.kAsmFixnum); |
+ RECURSE(IntersectResult(expr, cache_.kAsmFixnum)); |
} else { |
- IntersectResult(expr, cache_.kAsmUnsigned); |
+ RECURSE(IntersectResult(expr, cache_.kAsmUnsigned)); |
} |
} else if (value->ToInt32(&i)) { |
- IntersectResult(expr, cache_.kAsmSigned); |
+ RECURSE(IntersectResult(expr, cache_.kAsmSigned)); |
} else { |
FAIL(expr, "illegal number"); |
} |
} else if (!is_return && value->IsString()) { |
- IntersectResult(expr, Type::String()); |
+ RECURSE(IntersectResult(expr, Type::String())); |
} else if (value->IsUndefined()) { |
- IntersectResult(expr, Type::Undefined()); |
+ RECURSE(IntersectResult(expr, Type::Undefined())); |
} else { |
FAIL(expr, "illegal literal"); |
} |
@@ -633,7 +633,7 @@ void AsmTyper::VisitObjectLiteral(ObjectLiteral* expr) { |
FAIL(prop->value(), "non-function in function table"); |
} |
} |
- IntersectResult(expr, Type::Object()); |
+ RECURSE(IntersectResult(expr, Type::Object())); |
} |
@@ -653,7 +653,7 @@ void AsmTyper::VisitArrayLiteral(ArrayLiteral* expr) { |
elem_type = Type::Union(elem_type, computed_type_, zone()); |
} |
array_size_ = values->length(); |
- IntersectResult(expr, Type::Array(elem_type, zone())); |
+ RECURSE(IntersectResult(expr, Type::Array(elem_type, zone()))); |
} |
@@ -701,7 +701,7 @@ void AsmTyper::VisitAssignment(Assignment* expr) { |
if (type->Is(cache_.kAsmInt)) type = cache_.kAsmInt; |
info->type = type; |
intish_ = 0; |
- IntersectResult(proxy, type); |
+ RECURSE(IntersectResult(proxy, type)); |
} else if (expr->target()->IsProperty()) { |
// Assignment to a property: should be a heap assignment {H[x] = y}. |
int32_t value_intish = intish_; |
@@ -716,7 +716,7 @@ void AsmTyper::VisitAssignment(Assignment* expr) { |
} |
VisitHeapAccess(property, true, target_type); |
} |
- IntersectResult(expr, target_type); |
+ RECURSE(IntersectResult(expr, target_type)); |
} |
@@ -776,7 +776,7 @@ void AsmTyper::VisitHeapAccess(Property* expr, bool assigning, |
// bin->set_bounds(Bounds(cache_.kAsmSigned)); |
RECURSE(VisitWithExpectation(expr->key(), cache_.kAsmSigned, |
"must be integer")); |
- IntersectResult(expr, type); |
+ RECURSE(IntersectResult(expr, type)); |
} else { |
Literal* literal = expr->key()->AsLiteral(); |
if (literal) { |
@@ -835,8 +835,8 @@ void AsmTyper::VisitHeapAccess(Property* expr, bool assigning, |
FAIL(expr, "illegal type in assignment"); |
} |
} else { |
- IntersectResult(expr, expected_type_); |
- IntersectResult(expr, result_type); |
+ RECURSE(IntersectResult(expr, expected_type_)); |
+ RECURSE(IntersectResult(expr, result_type)); |
} |
} |
} |
@@ -1034,7 +1034,7 @@ void AsmTyper::VisitCall(Call* expr) { |
intish_ = 0; |
bounds_.set(expr->expression(), |
Bounds(Type::Function(Type::Any(), zone()))); |
- IntersectResult(expr, expected_type); |
+ RECURSE(IntersectResult(expr, expected_type)); |
} else { |
if (fun_type->Arity() != args->length()) { |
FAIL(expr, "call with wrong arity"); |
@@ -1051,7 +1051,7 @@ void AsmTyper::VisitCall(Call* expr) { |
} |
RECURSE(CheckPolymorphicStdlibArguments(standard_member, args)); |
intish_ = 0; |
- IntersectResult(expr, result_type); |
+ RECURSE(IntersectResult(expr, result_type)); |
} |
} else { |
FAIL(expr, "invalid callee"); |
@@ -1076,7 +1076,7 @@ void AsmTyper::VisitCallNew(CallNew* expr) { |
arg, fun_type->Parameter(i), |
"constructor argument expected to match callee parameter")); |
} |
- IntersectResult(expr, fun_type->Result()); |
+ RECURSE(IntersectResult(expr, fun_type->Result())); |
return; |
} |
@@ -1097,7 +1097,7 @@ void AsmTyper::VisitUnaryOperation(UnaryOperation* expr) { |
case Token::NOT: // Used to encode != and !== |
RECURSE(VisitWithExpectation(expr->expression(), cache_.kAsmInt, |
"operand expected to be integer")); |
- IntersectResult(expr, cache_.kAsmSigned); |
+ RECURSE(IntersectResult(expr, cache_.kAsmSigned)); |
return; |
case Token::DELETE: |
FAIL(expr, "delete operator encountered"); |
@@ -1156,7 +1156,7 @@ void AsmTyper::VisitIntegerBitwiseOperator(BinaryOperation* expr, |
FAIL(expr, "ill-typed bitwise operation"); |
} |
} |
- IntersectResult(expr, result_type); |
+ RECURSE(IntersectResult(expr, result_type)); |
} |
@@ -1188,7 +1188,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
"left comma operand expected to be any")); |
RECURSE(VisitWithExpectation(expr->right(), Type::Any(), |
"right comma operand expected to be any")); |
- IntersectResult(expr, computed_type_); |
+ RECURSE(IntersectResult(expr, computed_type_)); |
return; |
} |
case Token::OR: |
@@ -1217,7 +1217,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
bounds_.set(left, Bounds(cache_.kSingletonOne)); |
RECURSE(VisitWithExpectation(expr->right(), cache_.kAsmIntQ, |
"not operator expects an integer")); |
- IntersectResult(expr, cache_.kAsmSigned); |
+ RECURSE(IntersectResult(expr, cache_.kAsmSigned)); |
return; |
} else { |
FAIL(left, "unexpected false"); |
@@ -1279,7 +1279,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
FAIL(expr, "multiply must be by value in -2^20 < n < 2^20"); |
} |
intish_ = i; |
- IntersectResult(expr, cache_.kAsmInt); |
+ RECURSE(IntersectResult(expr, cache_.kAsmInt)); |
return; |
} else { |
intish_ = left_intish + right_intish + 1; |
@@ -1292,7 +1292,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
FAIL(expr, "too many consecutive multiplicative ops"); |
} |
} |
- IntersectResult(expr, cache_.kAsmInt); |
+ RECURSE(IntersectResult(expr, cache_.kAsmInt)); |
return; |
} |
} else if (expr->op() == Token::MUL && expr->right()->IsLiteral() && |
@@ -1318,7 +1318,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
"unary + only allowed on signed, unsigned, float?, or double?"); |
} |
} |
- IntersectResult(expr, cache_.kAsmDouble); |
+ RECURSE(IntersectResult(expr, cache_.kAsmDouble)); |
return; |
} else if (expr->op() == Token::MUL && left_type->Is(cache_.kAsmDouble) && |
expr->right()->IsLiteral() && |
@@ -1326,17 +1326,17 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
expr->right()->AsLiteral()->raw_value()->AsNumber() == -1.0) { |
// For unary -, expressed as x * -1 |
bounds_.set(expr->right(), Bounds(cache_.kAsmDouble)); |
- IntersectResult(expr, cache_.kAsmDouble); |
+ RECURSE(IntersectResult(expr, cache_.kAsmDouble)); |
return; |
} else if (type->Is(cache_.kAsmFloat) && expr->op() != Token::MOD) { |
if (left_intish != 0 || right_intish != 0) { |
FAIL(expr, "float operation before required fround"); |
} |
- IntersectResult(expr, cache_.kAsmFloat); |
+ RECURSE(IntersectResult(expr, cache_.kAsmFloat)); |
intish_ = 1; |
return; |
} else if (type->Is(cache_.kAsmDouble)) { |
- IntersectResult(expr, cache_.kAsmDouble); |
+ RECURSE(IntersectResult(expr, cache_.kAsmDouble)); |
return; |
} else { |
FAIL(expr, "ill-typed arithmetic operation"); |
@@ -1378,7 +1378,7 @@ void AsmTyper::VisitCompareOperation(CompareOperation* expr) { |
FAIL(expr, "left and right side of comparison must match"); |
} |
- IntersectResult(expr, cache_.kAsmSigned); |
+ RECURSE(IntersectResult(expr, cache_.kAsmSigned)); |
} |
@@ -1598,6 +1598,15 @@ void AsmTyper::SetResult(Expression* expr, Type* type) { |
void AsmTyper::IntersectResult(Expression* expr, Type* type) { |
computed_type_ = type; |
Type* bounded_type = Type::Intersect(computed_type_, expected_type_, zone()); |
+ if (Type::Representation(bounded_type, zone())->Is(Type::None())) { |
+#ifdef DEBUG |
+ PrintF("Computed type: "); |
+ computed_type_->Print(); |
+ PrintF("Expected type: "); |
+ expected_type_->Print(); |
+#endif |
+ FAIL(expr, "type mismatch"); |
+ } |
bounds_.set(expr, Bounds(bounded_type)); |
} |
@@ -1608,7 +1617,7 @@ void AsmTyper::VisitWithExpectation(Expression* expr, Type* expected_type, |
expected_type_ = expected_type; |
RECURSE(Visit(expr)); |
Type* bounded_type = Type::Intersect(computed_type_, expected_type_, zone()); |
- if (bounded_type->Is(Type::None())) { |
+ if (Type::Representation(bounded_type, zone())->Is(Type::None())) { |
#ifdef DEBUG |
PrintF("Computed type: "); |
computed_type_->Print(); |