OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/api.h" | 7 #include "src/api.h" |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/char-predicates-inl.h" | 10 #include "src/char-predicates-inl.h" |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 void ParserTraits::CheckPossibleEvalCall(Expression* expression, | 445 void ParserTraits::CheckPossibleEvalCall(Expression* expression, |
446 Scope* scope) { | 446 Scope* scope) { |
447 VariableProxy* callee = expression->AsVariableProxy(); | 447 VariableProxy* callee = expression->AsVariableProxy(); |
448 if (callee != NULL && | 448 if (callee != NULL && |
449 callee->IsVariable(parser_->isolate()->factory()->eval_string())) { | 449 callee->IsVariable(parser_->isolate()->factory()->eval_string())) { |
450 scope->DeclarationScope()->RecordEvalCall(); | 450 scope->DeclarationScope()->RecordEvalCall(); |
451 } | 451 } |
452 } | 452 } |
453 | 453 |
454 | 454 |
455 Expression* ParserTraits::MarkExpressionAsLValue(Expression* expression) { | 455 Expression* ParserTraits::MarkExpressionAsAssigned(Expression* expression) { |
456 VariableProxy* proxy = expression != NULL | 456 VariableProxy* proxy = |
457 ? expression->AsVariableProxy() | 457 expression != NULL ? expression->AsVariableProxy() : NULL; |
458 : NULL; | 458 if (proxy != NULL) proxy->set_is_assigned(); |
459 if (proxy != NULL) proxy->MarkAsLValue(); | |
460 return expression; | 459 return expression; |
461 } | 460 } |
462 | 461 |
463 | 462 |
464 bool ParserTraits::ShortcutNumericLiteralBinaryExpression( | 463 bool ParserTraits::ShortcutNumericLiteralBinaryExpression( |
465 Expression** x, Expression* y, Token::Value op, int pos, | 464 Expression** x, Expression* y, Token::Value op, int pos, |
466 AstNodeFactory<AstConstructionVisitor>* factory) { | 465 AstNodeFactory<AstConstructionVisitor>* factory) { |
467 if ((*x)->AsLiteral() && (*x)->AsLiteral()->value()->IsNumber() && | 466 if ((*x)->AsLiteral() && (*x)->AsLiteral()->value()->IsNumber() && |
468 y->AsLiteral() && y->AsLiteral()->value()->IsNumber()) { | 467 y->AsLiteral() && y->AsLiteral()->value()->IsNumber()) { |
469 double x_val = (*x)->AsLiteral()->value()->Number(); | 468 double x_val = (*x)->AsLiteral()->value()->Number(); |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1708 if (allow_harmony_scoping() && strict_mode() == STRICT) { | 1707 if (allow_harmony_scoping() && strict_mode() == STRICT) { |
1709 // In harmony we treat re-declarations as early errors. See | 1708 // In harmony we treat re-declarations as early errors. See |
1710 // ES5 16 for a definition of early errors. | 1709 // ES5 16 for a definition of early errors. |
1711 ParserTraits::ReportMessage("var_redeclaration", name); | 1710 ParserTraits::ReportMessage("var_redeclaration", name); |
1712 *ok = false; | 1711 *ok = false; |
1713 return; | 1712 return; |
1714 } | 1713 } |
1715 Expression* expression = NewThrowTypeError( | 1714 Expression* expression = NewThrowTypeError( |
1716 "var_redeclaration", name, declaration->position()); | 1715 "var_redeclaration", name, declaration->position()); |
1717 declaration_scope->SetIllegalRedeclaration(expression); | 1716 declaration_scope->SetIllegalRedeclaration(expression); |
| 1717 } else if (mode == VAR) { |
| 1718 var->set_maybe_assigned(); |
1718 } | 1719 } |
1719 } | 1720 } |
1720 | 1721 |
1721 // We add a declaration node for every declaration. The compiler | 1722 // We add a declaration node for every declaration. The compiler |
1722 // will only generate code if necessary. In particular, declarations | 1723 // will only generate code if necessary. In particular, declarations |
1723 // for inner local variables that do not represent functions won't | 1724 // for inner local variables that do not represent functions won't |
1724 // result in any generated code. | 1725 // result in any generated code. |
1725 // | 1726 // |
1726 // Note that we always add an unresolved proxy even if it's not | 1727 // Note that we always add an unresolved proxy even if it's not |
1727 // used, simply because we don't know in this method (w/o extra | 1728 // used, simply because we don't know in this method (w/o extra |
(...skipping 3098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4826 ASSERT(info()->isolate()->has_pending_exception()); | 4827 ASSERT(info()->isolate()->has_pending_exception()); |
4827 } else { | 4828 } else { |
4828 result = ParseProgram(); | 4829 result = ParseProgram(); |
4829 } | 4830 } |
4830 } | 4831 } |
4831 info()->SetFunction(result); | 4832 info()->SetFunction(result); |
4832 return (result != NULL); | 4833 return (result != NULL); |
4833 } | 4834 } |
4834 | 4835 |
4835 } } // namespace v8::internal | 4836 } } // namespace v8::internal |
OLD | NEW |