Index: src/typing-asm.cc |
diff --git a/src/typing-asm.cc b/src/typing-asm.cc |
index 6e073f92047898292668b0a70c652de05bfbba9e..14db16ba94b36aeba4e97dfd503ee061f1000e4c 100644 |
--- a/src/typing-asm.cc |
+++ b/src/typing-asm.cc |
@@ -35,6 +35,7 @@ |
if (HasStackOverflow()) return; \ |
if (!valid_) return; \ |
} while (false) |
+ |
AsmTyper::AsmTyper(Isolate* isolate, Zone* zone, Script* script, |
FunctionLiteral* root) |
@@ -61,7 +62,6 @@ |
ZoneAllocationPolicy(zone)), |
in_function_(false), |
building_function_tables_(false), |
- visiting_exports_(false), |
cache_(TypeCache::Get()) { |
InitializeAstVisitor(isolate); |
InitializeStdlib(); |
@@ -135,7 +135,6 @@ |
} |
// Validate exports. |
- visiting_exports_ = true; |
ReturnStatement* stmt = fun->body()->last()->AsReturnStatement(); |
if (stmt == nullptr) { |
FAIL(fun->body()->last(), "last statement in module is not a return"); |
@@ -490,11 +489,11 @@ |
void AsmTyper::VisitFunctionLiteral(FunctionLiteral* expr) { |
+ Scope* scope = expr->scope(); |
+ DCHECK(scope->is_function_scope()); |
if (in_function_) { |
FAIL(expr, "invalid nested function"); |
} |
- Scope* scope = expr->scope(); |
- DCHECK(scope->is_function_scope()); |
if (!expr->bounds().upper->IsFunction()) { |
FAIL(expr, "invalid function literal"); |
@@ -524,9 +523,6 @@ |
void AsmTyper::VisitConditional(Conditional* expr) { |
- if (!in_function_) { |
- FAIL(expr, "ternary operator inside module body"); |
- } |
RECURSE(VisitWithExpectation(expr->condition(), Type::Number(), |
"condition expected to be integer")); |
if (!computed_type_->Is(cache_.kAsmInt)) { |
@@ -558,18 +554,8 @@ |
void AsmTyper::VisitVariableProxy(VariableProxy* expr) { |
- VisitVariableProxy(expr, false); |
-} |
- |
-void AsmTyper::VisitVariableProxy(VariableProxy* expr, bool assignment) { |
Variable* var = expr->var(); |
VariableInfo* info = GetVariableInfo(var, false); |
- if (!assignment && !in_function_ && !building_function_tables_ && |
- !visiting_exports_) { |
- if (var->location() != VariableLocation::PARAMETER || var->index() >= 3) { |
- FAIL(expr, "illegal variable reference in module body"); |
- } |
- } |
if (info == NULL || info->type == NULL) { |
if (var->mode() == TEMPORARY) { |
SetType(var, Type::Any(zone())); |
@@ -689,8 +675,8 @@ |
FAIL(expr, "intish or floatish assignment"); |
} |
if (expr->target()->IsVariableProxy()) { |
- expected_type_ = target_type; |
- VisitVariableProxy(expr->target()->AsVariableProxy(), true); |
+ RECURSE(VisitWithExpectation(expr->target(), target_type, |
+ "assignment target expected to match value")); |
} else if (expr->target()->IsProperty()) { |
Property* property = expr->target()->AsProperty(); |
RECURSE(VisitWithExpectation(property->obj(), Type::Any(), |
@@ -926,7 +912,6 @@ |
void AsmTyper::VisitCall(Call* expr) { |
- Type* expected_type = expected_type_; |
RECURSE(VisitWithExpectation(expr->expression(), Type::Any(), |
"callee expected to be any")); |
StandardMember standard_member = kNone; |
@@ -989,17 +974,9 @@ |
Expression* arg = args->at(i); |
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. |
- if (!computed_type_->Is(cache_.kAsmSigned) && |
- !computed_type_->Is(cache_.kAsmFixnum) && |
- !computed_type_->Is(cache_.kAsmDouble)) { |
- FAIL(arg, |
- "foreign call argument expected to be int, double, or fixnum"); |
- } |
} |
intish_ = kMaxUncombinedAdditiveSteps; |
- IntersectResult(expr, expected_type); |
+ IntersectResult(expr, Type::Number()); |
} else { |
FAIL(expr, "invalid callee"); |
} |
@@ -1037,9 +1014,6 @@ |
void AsmTyper::VisitUnaryOperation(UnaryOperation* expr) { |
- if (!in_function_) { |
- FAIL(expr, "unary operator inside module body"); |
- } |
switch (expr->op()) { |
case Token::NOT: // Used to encode != and !== |
RECURSE(VisitWithExpectation(expr->expression(), cache_.kAsmInt, |
@@ -1067,7 +1041,7 @@ |
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_; |
@@ -1108,15 +1082,6 @@ |
void AsmTyper::VisitBinaryOperation(BinaryOperation* expr) { |
- if (!in_function_) { |
- if (expr->op() != Token::BIT_OR && expr->op() != Token::MUL) { |
- FAIL(expr, "illegal binary operator inside module body"); |
- } |
- if (!(expr->left()->IsProperty() || expr->left()->IsVariableProxy()) || |
- !expr->right()->IsLiteral()) { |
- FAIL(expr, "illegal computation inside module body"); |
- } |
- } |
switch (expr->op()) { |
case Token::COMMA: { |
RECURSE(VisitWithExpectation(expr->left(), Type::Any(), |
@@ -1133,9 +1098,6 @@ |
// BIT_OR allows Any since it is used as a type coercion. |
VisitIntegerBitwiseOperator(expr, Type::Any(), cache_.kAsmInt, |
cache_.kAsmSigned, true); |
- if (expr->left()->IsCall() && expr->op() == Token::BIT_OR) { |
- IntersectResult(expr->left(), cache_.kAsmSigned); |
- } |
return; |
} |
case Token::BIT_XOR: { |
@@ -1222,9 +1184,6 @@ |
} else if (expr->op() == Token::MUL && expr->right()->IsLiteral() && |
right_type->Is(cache_.kAsmDouble)) { |
// For unary +, expressed as x * 1.0 |
- if (expr->left()->IsCall() && expr->op() == Token::MUL) { |
- IntersectResult(expr->left(), cache_.kAsmDouble); |
- } |
IntersectResult(expr, cache_.kAsmDouble); |
return; |
} else if (type->Is(cache_.kAsmFloat) && expr->op() != Token::MOD) { |
@@ -1248,9 +1207,6 @@ |
void AsmTyper::VisitCompareOperation(CompareOperation* expr) { |
- if (!in_function_) { |
- FAIL(expr, "comparison inside module body"); |
- } |
Token::Value op = expr->op(); |
if (op != Token::EQ && op != Token::NE && op != Token::LT && |
op != Token::LTE && op != Token::GT && op != Token::GTE) { |