Index: src/typing-asm.cc |
diff --git a/src/typing-asm.cc b/src/typing-asm.cc |
index 47fb2b1fc3e74e7a50eb6b77e85a8acf3338ac07..0528ee78d09c2ce93c3450c965a984ad88a92256 100644 |
--- a/src/typing-asm.cc |
+++ b/src/typing-asm.cc |
@@ -89,7 +89,7 @@ void AsmTyper::VisitAsmModule(FunctionLiteral* fun) { |
for (int i = 0; i < scope->num_parameters(); ++i) { |
Variable* param = scope->parameter(i); |
DCHECK(GetType(param) == NULL); |
- SetType(param, Type::None(zone())); |
+ SetType(param, Type::None()); |
} |
ZoneList<Declaration*>* decls = scope->declarations(); |
@@ -126,8 +126,7 @@ void AsmTyper::VisitAsmModule(FunctionLiteral* fun) { |
for (int i = 0; i < decls->length(); ++i) { |
FunctionDeclaration* decl = decls->at(i)->AsFunctionDeclaration(); |
if (decl != NULL) { |
- RECURSE( |
- VisitWithExpectation(decl->fun(), Type::Any(zone()), "UNREACHABLE")); |
+ RECURSE(VisitWithExpectation(decl->fun(), Type::Any(), "UNREACHABLE")); |
if (!computed_type_->IsFunction()) { |
FAIL(decl->fun(), "function literal expected to be a function"); |
} |
@@ -149,7 +148,7 @@ void AsmTyper::VisitVariableDeclaration(VariableDeclaration* decl) { |
Variable* var = decl->proxy()->var(); |
if (var->location() != VariableLocation::PARAMETER) { |
if (GetType(var) == NULL) { |
- SetType(var, Type::Any(zone())); |
+ SetType(var, Type::Any()); |
} else { |
DCHECK(!GetType(var)->IsFunction()); |
} |
@@ -166,20 +165,20 @@ void AsmTyper::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
// Set function type so global references to functions have some type |
// (so they can give a more useful error). |
Variable* var = decl->proxy()->var(); |
- SetType(var, Type::Function(zone())); |
+ SetType(var, Type::Function()); |
} |
void AsmTyper::VisitFunctionAnnotation(FunctionLiteral* fun) { |
// Extract result type. |
ZoneList<Statement*>* body = fun->body(); |
- Type* result_type = Type::Undefined(zone()); |
+ Type* result_type = Type::Undefined(); |
if (body->length() > 0) { |
ReturnStatement* stmt = body->last()->AsReturnStatement(); |
if (stmt != NULL) { |
Literal* literal = stmt->expression()->AsLiteral(); |
Type* old_expected = expected_type_; |
- expected_type_ = Type::Any(zone()); |
+ expected_type_ = Type::Any(); |
if (literal) { |
RECURSE(VisitLiteral(literal, true)); |
} else { |
@@ -189,9 +188,8 @@ void AsmTyper::VisitFunctionAnnotation(FunctionLiteral* fun) { |
result_type = computed_type_; |
} |
} |
- Type::FunctionType* type = Type::Function(result_type, Type::Any(zone()), |
- fun->parameter_count(), zone()) |
- ->AsFunction(); |
+ Type* type = |
+ Type::Function(result_type, Type::Any(), fun->parameter_count(), zone()); |
// Extract parameter types. |
bool good = true; |
@@ -213,7 +211,7 @@ void AsmTyper::VisitFunctionAnnotation(FunctionLiteral* fun) { |
property_info_ = NULL; |
} |
SetType(var, computed_type_); |
- type->InitParameter(i, computed_type_); |
+ type->AsFunction()->InitParameter(i, computed_type_); |
good = true; |
} |
if (!good) FAIL(fun, "missing parameter type annotations"); |
@@ -266,7 +264,7 @@ void AsmTyper::VisitExpressionAnnotation(Expression* expr, Variable* var, |
// Numbers or the undefined literal (for empty returns). |
if (expr->IsLiteral()) { |
- RECURSE(VisitWithExpectation(expr, Type::Any(zone()), "invalid literal")); |
+ RECURSE(VisitWithExpectation(expr, Type::Any(), "invalid literal")); |
return; |
} |
@@ -316,7 +314,7 @@ void AsmTyper::VisitBlock(Block* stmt) { |
void AsmTyper::VisitExpressionStatement(ExpressionStatement* stmt) { |
- RECURSE(VisitWithExpectation(stmt->expression(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(stmt->expression(), Type::Any(), |
"expression statement expected to be any")); |
} |
@@ -368,7 +366,7 @@ void AsmTyper::VisitReturnStatement(ReturnStatement* stmt) { |
VisitLiteral(literal, true); |
} else { |
RECURSE( |
- VisitWithExpectation(stmt->expression(), Type::Any(zone()), |
+ VisitWithExpectation(stmt->expression(), Type::Any(), |
"return expression expected to have return type")); |
} |
if (!computed_type_->Is(return_type_) || !return_type_->Is(computed_type_)) { |
@@ -500,9 +498,9 @@ void AsmTyper::VisitFunctionLiteral(FunctionLiteral* expr) { |
FAIL(expr, "invalid function literal"); |
} |
- Type::FunctionType* type = expr->bounds().upper->AsFunction(); |
+ Type* type = expr->bounds().upper; |
Type* save_return_type = return_type_; |
- return_type_ = type->Result(); |
+ return_type_ = type->AsFunction()->Result(); |
in_function_ = true; |
local_variable_type_.Clear(); |
RECURSE(VisitDeclarations(scope->declarations())); |
@@ -527,7 +525,7 @@ void AsmTyper::VisitConditional(Conditional* expr) { |
if (!in_function_) { |
FAIL(expr, "ternary operator inside module body"); |
} |
- RECURSE(VisitWithExpectation(expr->condition(), Type::Number(zone()), |
+ RECURSE(VisitWithExpectation(expr->condition(), Type::Number(), |
"condition expected to be integer")); |
if (!computed_type_->Is(cache_.kAsmInt)) { |
FAIL(expr->condition(), "condition must be of type int"); |
@@ -572,7 +570,7 @@ void AsmTyper::VisitVariableProxy(VariableProxy* expr, bool assignment) { |
} |
if (info == NULL || info->type == NULL) { |
if (var->mode() == TEMPORARY) { |
- SetType(var, Type::Any(zone())); |
+ SetType(var, Type::Any()); |
info = GetVariableInfo(var, false); |
} else { |
FAIL(expr, "unbound variable"); |
@@ -637,13 +635,13 @@ void AsmTyper::VisitObjectLiteral(ObjectLiteral* expr) { |
ZoneList<ObjectLiteralProperty*>* props = expr->properties(); |
for (int i = 0; i < props->length(); ++i) { |
ObjectLiteralProperty* prop = props->at(i); |
- RECURSE(VisitWithExpectation(prop->value(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(prop->value(), Type::Any(), |
"object property expected to be a function")); |
if (!computed_type_->IsFunction()) { |
FAIL(prop->value(), "non-function in function table"); |
} |
} |
- IntersectResult(expr, Type::Object(zone())); |
+ IntersectResult(expr, Type::Object()); |
} |
@@ -653,10 +651,10 @@ void AsmTyper::VisitArrayLiteral(ArrayLiteral* expr) { |
} |
// Allowed for function tables. |
ZoneList<Expression*>* values = expr->values(); |
- Type* elem_type = Type::None(zone()); |
+ Type* elem_type = Type::None(); |
for (int i = 0; i < values->length(); ++i) { |
Expression* value = values->at(i); |
- RECURSE(VisitWithExpectation(value, Type::Any(zone()), "UNREACHABLE")); |
+ RECURSE(VisitWithExpectation(value, Type::Any(), "UNREACHABLE")); |
if (!computed_type_->IsFunction()) { |
FAIL(value, "array component expected to be a function"); |
} |
@@ -693,7 +691,7 @@ void AsmTyper::VisitAssignment(Assignment* expr) { |
VisitVariableProxy(expr->target()->AsVariableProxy(), true); |
} else if (expr->target()->IsProperty()) { |
Property* property = expr->target()->AsProperty(); |
- RECURSE(VisitWithExpectation(property->obj(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(property->obj(), Type::Any(), |
"bad propety object")); |
if (!computed_type_->IsArray()) { |
FAIL(property->obj(), "array expected"); |
@@ -734,9 +732,9 @@ Type* AsmTyper::StorageType(Type* type) { |
void AsmTyper::VisitHeapAccess(Property* expr, bool assigning, |
Type* assignment_type) { |
- Type::ArrayType* array_type = computed_type_->AsArray(); |
+ ArrayType* array_type = computed_type_->AsArray(); |
// size_t size = array_size_; |
- Type* type = array_type->AsArray()->Element(); |
+ Type* type = array_type->Element(); |
if (type->IsFunction()) { |
if (assigning) { |
FAIL(expr, "assigning to function table is illegal"); |
@@ -902,8 +900,7 @@ void AsmTyper::VisitProperty(Property* expr) { |
// Only recurse at this point so that we avoid needing |
// stdlib.Math to have a real type. |
- RECURSE(VisitWithExpectation(expr->obj(), Type::Any(zone()), |
- "bad propety object")); |
+ RECURSE(VisitWithExpectation(expr->obj(), Type::Any(), "bad propety object")); |
// For heap view or function table access. |
if (computed_type_->IsArray()) { |
@@ -928,7 +925,7 @@ void AsmTyper::VisitProperty(Property* expr) { |
void AsmTyper::VisitCall(Call* expr) { |
Type* expected_type = expected_type_; |
- RECURSE(VisitWithExpectation(expr->expression(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(expr->expression(), Type::Any(), |
"callee expected to be any")); |
StandardMember standard_member = kNone; |
VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
@@ -942,7 +939,7 @@ void AsmTyper::VisitCall(Call* expr) { |
FAIL(expr, "calls must be to bound variables or function tables"); |
} |
if (computed_type_->IsFunction()) { |
- Type::FunctionType* fun_type = computed_type_->AsFunction(); |
+ FunctionType* fun_type = computed_type_->AsFunction(); |
Type* result_type = fun_type->Result(); |
ZoneList<Expression*>* args = expr->arguments(); |
if (fun_type->Arity() != args->length()) { |
@@ -983,12 +980,12 @@ void AsmTyper::VisitCall(Call* expr) { |
} |
intish_ = 0; |
IntersectResult(expr, result_type); |
- } else if (computed_type_->Is(Type::Any(zone()))) { |
+ } else if (computed_type_->Is(Type::Any())) { |
// For foreign calls. |
ZoneList<Expression*>* args = expr->arguments(); |
for (int i = 0; i < args->length(); ++i) { |
Expression* arg = args->at(i); |
- RECURSE(VisitWithExpectation(arg, Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(arg, Type::Any(), |
"foreign call argument expected to be any")); |
// Checking for asm extern types explicitly, as the type system |
// doesn't correctly check their inheritance relationship. |
@@ -1000,7 +997,7 @@ void AsmTyper::VisitCall(Call* expr) { |
} |
} |
intish_ = kMaxUncombinedAdditiveSteps; |
- expr->expression()->set_bounds(Bounds(Type::Function(zone()))); |
+ expr->expression()->set_bounds(Bounds(Type::Function())); |
IntersectResult(expr, expected_type); |
} else { |
FAIL(expr, "invalid callee"); |
@@ -1012,10 +1009,10 @@ void AsmTyper::VisitCallNew(CallNew* expr) { |
if (in_function_) { |
FAIL(expr, "new not allowed in module function"); |
} |
- RECURSE(VisitWithExpectation(expr->expression(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(expr->expression(), Type::Any(), |
"expected stdlib function")); |
if (computed_type_->IsFunction()) { |
- Type::FunctionType* fun_type = computed_type_->AsFunction(); |
+ FunctionType* fun_type = computed_type_->AsFunction(); |
ZoneList<Expression*>* args = expr->arguments(); |
if (fun_type->Arity() != args->length()) |
FAIL(expr, "call with wrong arity"); |
@@ -1069,7 +1066,7 @@ void AsmTyper::VisitIntegerBitwiseOperator(BinaryOperation* expr, |
Type* left_expected, |
Type* right_expected, |
Type* result_type, bool conversion) { |
- RECURSE(VisitWithExpectation(expr->left(), Type::Number(zone()), |
+ RECURSE(VisitWithExpectation(expr->left(), Type::Number(), |
"left bitwise operand expected to be a number")); |
int left_intish = intish_; |
Type* left_type = computed_type_; |
@@ -1081,7 +1078,7 @@ void AsmTyper::VisitIntegerBitwiseOperator(BinaryOperation* expr, |
} |
RECURSE( |
- VisitWithExpectation(expr->right(), Type::Number(zone()), |
+ VisitWithExpectation(expr->right(), Type::Number(), |
"right bitwise operand expected to be a number")); |
int right_intish = intish_; |
Type* right_type = computed_type_; |
@@ -1121,9 +1118,9 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
} |
switch (expr->op()) { |
case Token::COMMA: { |
- RECURSE(VisitWithExpectation(expr->left(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(expr->left(), Type::Any(), |
"left comma operand expected to be any")); |
- RECURSE(VisitWithExpectation(expr->right(), Type::Any(zone()), |
+ RECURSE(VisitWithExpectation(expr->right(), Type::Any(), |
"right comma operand expected to be any")); |
IntersectResult(expr, computed_type_); |
return; |
@@ -1133,7 +1130,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
FAIL(expr, "illegal logical operator"); |
case Token::BIT_OR: { |
// BIT_OR allows Any since it is used as a type coercion. |
- VisitIntegerBitwiseOperator(expr, Type::Any(zone()), cache_.kAsmInt, |
+ VisitIntegerBitwiseOperator(expr, Type::Any(), cache_.kAsmInt, |
cache_.kAsmSigned, true); |
if (expr->left()->IsCall() && expr->op() == Token::BIT_OR) { |
expr->left()->set_bounds(Bounds(cache_.kAsmSigned)); |
@@ -1155,7 +1152,7 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
} |
} |
// BIT_XOR allows Number since it is used as a type coercion (via ~~). |
- VisitIntegerBitwiseOperator(expr, Type::Number(zone()), cache_.kAsmInt, |
+ VisitIntegerBitwiseOperator(expr, Type::Number(), cache_.kAsmInt, |
cache_.kAsmSigned, true); |
return; |
} |
@@ -1177,12 +1174,12 @@ void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
case Token::DIV: |
case Token::MOD: { |
RECURSE(VisitWithExpectation( |
- expr->left(), Type::Number(zone()), |
+ expr->left(), Type::Number(), |
"left arithmetic operand expected to be number")); |
Type* left_type = computed_type_; |
int left_intish = intish_; |
RECURSE(VisitWithExpectation( |
- expr->right(), Type::Number(zone()), |
+ expr->right(), Type::Number(), |
"right arithmetic operand expected to be number")); |
Type* right_type = computed_type_; |
int right_intish = intish_; |
@@ -1260,7 +1257,7 @@ void AsmTyper::VisitCompareOperation(CompareOperation* expr) { |
} |
RECURSE( |
- VisitWithExpectation(expr->left(), Type::Number(zone()), |
+ VisitWithExpectation(expr->left(), Type::Number(), |
"left comparison operand expected to be number")); |
Type* left_type = computed_type_; |
if (!left_type->Is(cache_.kAsmComparable)) { |
@@ -1268,7 +1265,7 @@ void AsmTyper::VisitCompareOperation(CompareOperation* expr) { |
} |
RECURSE( |
- VisitWithExpectation(expr->right(), Type::Number(zone()), |
+ VisitWithExpectation(expr->right(), Type::Number(), |
"right comparison operand expected to be number")); |
Type* right_type = computed_type_; |
if (!right_type->Is(cache_.kAsmComparable)) { |
@@ -1327,10 +1324,10 @@ void AsmTyper::VisitSuperCallReference(SuperCallReference* expr) { |
void AsmTyper::InitializeStdlibSIMD() { |
#define V(NAME, Name, name, lane_count, lane_type) \ |
{ \ |
- Type* type = Type::Function(Type::Name(isolate_, zone()), \ |
- Type::Any(zone()), lane_count, zone()); \ |
+ Type* type = Type::Function(Type::Name(isolate_, zone()), Type::Any(), \ |
+ lane_count, zone()); \ |
for (int i = 0; i < lane_count; ++i) { \ |
- type->AsFunction()->InitParameter(i, Type::Number(zone())); \ |
+ type->AsFunction()->InitParameter(i, Type::Number()); \ |
} \ |
stdlib_simd_##name##_constructor_type_ = new (zone()) VariableInfo(type); \ |
stdlib_simd_##name##_constructor_type_->is_constructor_function = true; \ |
@@ -1344,7 +1341,7 @@ void AsmTyper::InitializeStdlib() { |
if (allow_simd_) { |
InitializeStdlibSIMD(); |
} |
- Type* number_type = Type::Number(zone()); |
+ Type* number_type = Type::Number(); |
Type* double_type = cache_.kAsmDouble; |
Type* double_fn1_type = Type::Function(double_type, double_type, zone()); |
Type* double_fn2_type = |
@@ -1401,7 +1398,7 @@ void AsmTyper::InitializeStdlib() { |
stdlib_types_["Infinity"]->standard_member = kInfinity; |
stdlib_types_["NaN"] = new (zone()) VariableInfo(double_type); |
stdlib_types_["NaN"]->standard_member = kNaN; |
- Type* buffer_type = Type::Any(zone()); |
+ Type* buffer_type = Type::Any(); |
#define TYPED_ARRAY(TypeName, type_name, TYPE_NAME, ctype, size) \ |
stdlib_types_[#TypeName "Array"] = new (zone()) VariableInfo( \ |
Type::Function(cache_.k##TypeName##Array, buffer_type, zone())); |
@@ -1518,7 +1515,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(zone()))) { |
+ if (bounded_type->Is(Type::None())) { |
#ifdef DEBUG |
PrintF("Computed type: "); |
computed_type_->Print(); |