| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/typing-asm.h" | 7 #include "src/typing-asm.h" |
| 8 | 8 |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 | 374 |
| 375 void AsmTyper::VisitSwitchStatement(SwitchStatement* stmt) { | 375 void AsmTyper::VisitSwitchStatement(SwitchStatement* stmt) { |
| 376 if (!in_function_) { | 376 if (!in_function_) { |
| 377 FAIL(stmt, "switch statement inside module body"); | 377 FAIL(stmt, "switch statement inside module body"); |
| 378 } | 378 } |
| 379 RECURSE(VisitWithExpectation(stmt->tag(), cache_.kAsmSigned, | 379 RECURSE(VisitWithExpectation(stmt->tag(), cache_.kAsmSigned, |
| 380 "switch expression non-integer")); | 380 "switch expression non-integer")); |
| 381 ZoneList<CaseClause*>* clauses = stmt->cases(); | 381 ZoneList<CaseClause*>* clauses = stmt->cases(); |
| 382 for (int i = 0; i < clauses->length(); ++i) { | 382 for (int i = 0; i < clauses->length(); ++i) { |
| 383 CaseClause* clause = clauses->at(i); | 383 CaseClause* clause = clauses->at(i); |
| 384 if (clause->is_default()) continue; | 384 if (!clause->is_default()) { |
| 385 Expression* label = clause->label(); | 385 Expression* label = clause->label(); |
| 386 RECURSE(VisitWithExpectation(label, cache_.kAsmSigned, | 386 RECURSE(VisitWithExpectation(label, cache_.kAsmSigned, |
| 387 "case label non-integer")); | 387 "case label non-integer")); |
| 388 if (!label->IsLiteral()) FAIL(label, "non-literal case label"); | 388 if (!label->IsLiteral()) FAIL(label, "non-literal case label"); |
| 389 Handle<Object> value = label->AsLiteral()->value(); | 389 Handle<Object> value = label->AsLiteral()->value(); |
| 390 int32_t value32; | 390 int32_t value32; |
| 391 if (!value->ToInt32(&value32)) FAIL(label, "illegal case label value"); | 391 if (!value->ToInt32(&value32)) FAIL(label, "illegal case label value"); |
| 392 } |
| 392 // TODO(bradnelson): Detect duplicates. | 393 // TODO(bradnelson): Detect duplicates. |
| 393 ZoneList<Statement*>* stmts = clause->statements(); | 394 ZoneList<Statement*>* stmts = clause->statements(); |
| 394 RECURSE(VisitStatements(stmts)); | 395 RECURSE(VisitStatements(stmts)); |
| 395 } | 396 } |
| 396 } | 397 } |
| 397 | 398 |
| 398 | 399 |
| 399 void AsmTyper::VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } | 400 void AsmTyper::VisitCaseClause(CaseClause* clause) { UNREACHABLE(); } |
| 400 | 401 |
| 401 | 402 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 } | 525 } |
| 525 | 526 |
| 526 IntersectResult(expr, then_type); | 527 IntersectResult(expr, then_type); |
| 527 } | 528 } |
| 528 | 529 |
| 529 | 530 |
| 530 void AsmTyper::VisitVariableProxy(VariableProxy* expr) { | 531 void AsmTyper::VisitVariableProxy(VariableProxy* expr) { |
| 531 Variable* var = expr->var(); | 532 Variable* var = expr->var(); |
| 532 VariableInfo* info = GetVariableInfo(var, false); | 533 VariableInfo* info = GetVariableInfo(var, false); |
| 533 if (info == NULL || info->type == NULL) { | 534 if (info == NULL || info->type == NULL) { |
| 534 FAIL(expr, "unbound variable"); | 535 if (var->mode() == TEMPORARY) { |
| 536 SetType(var, Type::Any(zone())); |
| 537 info = GetVariableInfo(var, false); |
| 538 } else { |
| 539 FAIL(expr, "unbound variable"); |
| 540 } |
| 535 } | 541 } |
| 536 if (property_info_ != NULL) { | 542 if (property_info_ != NULL) { |
| 537 SetVariableInfo(var, property_info_); | 543 SetVariableInfo(var, property_info_); |
| 538 property_info_ = NULL; | 544 property_info_ = NULL; |
| 539 } | 545 } |
| 540 Type* type = Type::Intersect(info->type, expected_type_, zone()); | 546 Type* type = Type::Intersect(info->type, expected_type_, zone()); |
| 541 if (type->Is(cache_.kAsmInt)) { | 547 if (type->Is(cache_.kAsmInt)) { |
| 542 type = cache_.kAsmInt; | 548 type = cache_.kAsmInt; |
| 543 } | 549 } |
| 544 info->type = type; | 550 info->type = type; |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 | 1458 |
| 1453 | 1459 |
| 1454 void AsmTyper::VisitRewritableAssignmentExpression( | 1460 void AsmTyper::VisitRewritableAssignmentExpression( |
| 1455 RewritableAssignmentExpression* expr) { | 1461 RewritableAssignmentExpression* expr) { |
| 1456 RECURSE(Visit(expr->expression())); | 1462 RECURSE(Visit(expr->expression())); |
| 1457 } | 1463 } |
| 1458 | 1464 |
| 1459 | 1465 |
| 1460 } // namespace internal | 1466 } // namespace internal |
| 1461 } // namespace v8 | 1467 } // namespace v8 |
| OLD | NEW |