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/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 } | 666 } |
667 | 667 |
668 | 668 |
669 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 669 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { |
670 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); | 670 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); |
671 } | 671 } |
672 | 672 |
673 | 673 |
674 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, | 674 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, |
675 int pos) { | 675 int pos) { |
676 return factory->NewVariableProxy(scope->receiver(), pos); | 676 return scope->NewUnresolved(factory, |
| 677 parser_->ast_value_factory()->this_string(), |
| 678 Variable::THIS, pos); |
677 } | 679 } |
678 | 680 |
679 Expression* ParserTraits::SuperReference(Scope* scope, AstNodeFactory* factory, | 681 Expression* ParserTraits::SuperReference(Scope* scope, AstNodeFactory* factory, |
680 int pos) { | 682 int pos) { |
681 return factory->NewSuperReference( | 683 return factory->NewSuperReference( |
682 ThisExpression(scope, factory, pos)->AsVariableProxy(), | 684 ThisExpression(scope, factory, pos)->AsVariableProxy(), |
683 pos); | 685 pos); |
684 } | 686 } |
685 | 687 |
686 | 688 |
(...skipping 27 matching lines...) Expand all Loading... |
714 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, | 716 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, |
715 int pos, Scope* scope, | 717 int pos, Scope* scope, |
716 AstNodeFactory* factory) { | 718 AstNodeFactory* factory) { |
717 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); | 719 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); |
718 | 720 |
719 // Arrow function parameters are parsed as an expression. When | 721 // Arrow function parameters are parsed as an expression. When |
720 // parsing lazily, it is enough to create a VariableProxy in order | 722 // parsing lazily, it is enough to create a VariableProxy in order |
721 // for Traits::DeclareArrowParametersFromExpression() to be able to | 723 // for Traits::DeclareArrowParametersFromExpression() to be able to |
722 // pick the names of the parameters. | 724 // pick the names of the parameters. |
723 return parser_->parsing_lazy_arrow_parameters_ | 725 return parser_->parsing_lazy_arrow_parameters_ |
724 ? factory->NewVariableProxy(name, false, pos) | 726 ? factory->NewVariableProxy(name, Variable::NORMAL, pos) |
725 : scope->NewUnresolved(factory, name, pos); | 727 : scope->NewUnresolved(factory, name, Variable::NORMAL, pos); |
726 } | 728 } |
727 | 729 |
728 | 730 |
729 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, | 731 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, |
730 AstNodeFactory* factory) { | 732 AstNodeFactory* factory) { |
731 const AstRawString* symbol = GetSymbol(scanner); | 733 const AstRawString* symbol = GetSymbol(scanner); |
732 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); | 734 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); |
733 return factory->NewStringLiteral(symbol, pos); | 735 return factory->NewStringLiteral(symbol, pos); |
734 } | 736 } |
735 | 737 |
(...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1785 } | 1787 } |
1786 | 1788 |
1787 | 1789 |
1788 VariableProxy* Parser::NewUnresolved(const AstRawString* name, | 1790 VariableProxy* Parser::NewUnresolved(const AstRawString* name, |
1789 VariableMode mode) { | 1791 VariableMode mode) { |
1790 // If we are inside a function, a declaration of a var/const variable is a | 1792 // If we are inside a function, a declaration of a var/const variable is a |
1791 // truly local variable, and the scope of the variable is always the function | 1793 // truly local variable, and the scope of the variable is always the function |
1792 // scope. | 1794 // scope. |
1793 // Let/const variables in harmony mode are always added to the immediately | 1795 // Let/const variables in harmony mode are always added to the immediately |
1794 // enclosing scope. | 1796 // enclosing scope. |
1795 return DeclarationScope(mode)->NewUnresolved(factory(), name, position()); | 1797 return DeclarationScope(mode) |
| 1798 ->NewUnresolved(factory(), name, Variable::NORMAL, position()); |
1796 } | 1799 } |
1797 | 1800 |
1798 | 1801 |
1799 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { | 1802 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { |
1800 VariableProxy* proxy = declaration->proxy(); | 1803 VariableProxy* proxy = declaration->proxy(); |
1801 DCHECK(proxy->raw_name() != NULL); | 1804 DCHECK(proxy->raw_name() != NULL); |
1802 const AstRawString* name = proxy->raw_name(); | 1805 const AstRawString* name = proxy->raw_name(); |
1803 VariableMode mode = declaration->mode(); | 1806 VariableMode mode = declaration->mode(); |
1804 Scope* declaration_scope = DeclarationScope(mode); | 1807 Scope* declaration_scope = DeclarationScope(mode); |
1805 Variable* var = NULL; | 1808 Variable* var = NULL; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1870 // same variable if it is declared several times. This is not a | 1873 // same variable if it is declared several times. This is not a |
1871 // semantic issue as long as we keep the source order, but it may be | 1874 // semantic issue as long as we keep the source order, but it may be |
1872 // a performance issue since it may lead to repeated | 1875 // a performance issue since it may lead to repeated |
1873 // RuntimeHidden_DeclareLookupSlot calls. | 1876 // RuntimeHidden_DeclareLookupSlot calls. |
1874 declaration_scope->AddDeclaration(declaration); | 1877 declaration_scope->AddDeclaration(declaration); |
1875 | 1878 |
1876 if (mode == CONST_LEGACY && declaration_scope->is_script_scope()) { | 1879 if (mode == CONST_LEGACY && declaration_scope->is_script_scope()) { |
1877 // For global const variables we bind the proxy to a variable. | 1880 // For global const variables we bind the proxy to a variable. |
1878 DCHECK(resolve); // should be set by all callers | 1881 DCHECK(resolve); // should be set by all callers |
1879 Variable::Kind kind = Variable::NORMAL; | 1882 Variable::Kind kind = Variable::NORMAL; |
1880 var = new (zone()) Variable(declaration_scope, name, mode, true, kind, | 1883 var = new (zone()) Variable(declaration_scope, name, mode, kind, |
1881 kNeedsInitialization, kNotAssigned); | 1884 kNeedsInitialization, kNotAssigned); |
1882 } else if (declaration_scope->is_eval_scope() && | 1885 } else if (declaration_scope->is_eval_scope() && |
1883 is_sloppy(declaration_scope->language_mode())) { | 1886 is_sloppy(declaration_scope->language_mode())) { |
1884 // For variable declarations in a sloppy eval scope the proxy is bound | 1887 // For variable declarations in a sloppy eval scope the proxy is bound |
1885 // to a lookup variable to force a dynamic declaration using the | 1888 // to a lookup variable to force a dynamic declaration using the |
1886 // DeclareLookupSlot runtime function. | 1889 // DeclareLookupSlot runtime function. |
1887 Variable::Kind kind = Variable::NORMAL; | 1890 Variable::Kind kind = Variable::NORMAL; |
1888 // TODO(sigurds) figure out if kNotAssigned is OK here | 1891 // TODO(sigurds) figure out if kNotAssigned is OK here |
1889 var = new (zone()) Variable(declaration_scope, name, mode, true, kind, | 1892 var = new (zone()) Variable(declaration_scope, name, mode, kind, |
1890 declaration->initialization(), kNotAssigned); | 1893 declaration->initialization(), kNotAssigned); |
1891 var->AllocateTo(Variable::LOOKUP, -1); | 1894 var->AllocateTo(Variable::LOOKUP, -1); |
1892 resolve = true; | 1895 resolve = true; |
1893 } | 1896 } |
1894 | 1897 |
1895 // If requested and we have a local variable, bind the proxy to the variable | 1898 // If requested and we have a local variable, bind the proxy to the variable |
1896 // at parse-time. This is used for functions (and consts) declared inside | 1899 // at parse-time. This is used for functions (and consts) declared inside |
1897 // statements: the corresponding function (or const) variable must be in the | 1900 // statements: the corresponding function (or const) variable must be in the |
1898 // function scope and not a statement-local scope, e.g. as provided with a | 1901 // function scope and not a statement-local scope, e.g. as provided with a |
1899 // 'with' statement: | 1902 // 'with' statement: |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2401 value = NULL; | 2404 value = NULL; |
2402 } | 2405 } |
2403 | 2406 |
2404 // Add an assignment node to the initialization statement block if we still | 2407 // Add an assignment node to the initialization statement block if we still |
2405 // have a pending initialization value. | 2408 // have a pending initialization value. |
2406 if (value != NULL) { | 2409 if (value != NULL) { |
2407 DCHECK(mode == VAR); | 2410 DCHECK(mode == VAR); |
2408 // 'var' initializations are simply assignments (with all the consequences | 2411 // 'var' initializations are simply assignments (with all the consequences |
2409 // if they are inside a 'with' statement - they may change a 'with' object | 2412 // if they are inside a 'with' statement - they may change a 'with' object |
2410 // property). | 2413 // property). |
2411 VariableProxy* proxy = | 2414 VariableProxy* proxy = initialization_scope->NewUnresolved( |
2412 initialization_scope->NewUnresolved(factory(), name); | 2415 factory(), name, Variable::NORMAL); |
2413 Assignment* assignment = | 2416 Assignment* assignment = |
2414 factory()->NewAssignment(init_op, proxy, value, pos); | 2417 factory()->NewAssignment(init_op, proxy, value, pos); |
2415 block->AddStatement( | 2418 block->AddStatement( |
2416 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), | 2419 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
2417 zone()); | 2420 zone()); |
2418 } | 2421 } |
2419 | 2422 |
2420 if (fni_ != NULL) fni_->Leave(); | 2423 if (fni_ != NULL) fni_->Leave(); |
2421 } while (peek() == Token::COMMA); | 2424 } while (peek() == Token::COMMA); |
2422 | 2425 |
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3264 | 3267 |
3265 if (name != NULL && CheckInOrOf(accept_OF, &mode, ok)) { | 3268 if (name != NULL && CheckInOrOf(accept_OF, &mode, ok)) { |
3266 if (!*ok) return nullptr; | 3269 if (!*ok) return nullptr; |
3267 ForEachStatement* loop = | 3270 ForEachStatement* loop = |
3268 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3271 factory()->NewForEachStatement(mode, labels, stmt_pos); |
3269 Target target(&this->target_stack_, loop); | 3272 Target target(&this->target_stack_, loop); |
3270 | 3273 |
3271 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3274 Expression* enumerable = ParseExpression(true, CHECK_OK); |
3272 Expect(Token::RPAREN, CHECK_OK); | 3275 Expect(Token::RPAREN, CHECK_OK); |
3273 | 3276 |
3274 VariableProxy* each = scope_->NewUnresolved(factory(), name, each_pos); | 3277 VariableProxy* each = |
| 3278 scope_->NewUnresolved(factory(), name, Variable::NORMAL, each_pos); |
3275 Statement* body = ParseSubStatement(NULL, CHECK_OK); | 3279 Statement* body = ParseSubStatement(NULL, CHECK_OK); |
3276 InitializeForEachStatement(loop, each, enumerable, body); | 3280 InitializeForEachStatement(loop, each, enumerable, body); |
3277 Block* result = | 3281 Block* result = |
3278 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); | 3282 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); |
3279 result->AddStatement(variable_statement, zone()); | 3283 result->AddStatement(variable_statement, zone()); |
3280 result->AddStatement(loop, zone()); | 3284 result->AddStatement(loop, zone()); |
3281 scope_ = saved_scope; | 3285 scope_ = saved_scope; |
3282 for_scope->set_end_position(scanner()->location().end_pos); | 3286 for_scope->set_end_position(scanner()->location().end_pos); |
3283 for_scope = for_scope->FinalizeBlockScope(); | 3287 for_scope = for_scope->FinalizeBlockScope(); |
3284 DCHECK(for_scope == NULL); | 3288 DCHECK(for_scope == NULL); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3324 ForEachStatement* loop = | 3328 ForEachStatement* loop = |
3325 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3329 factory()->NewForEachStatement(mode, labels, stmt_pos); |
3326 Target target(&this->target_stack_, loop); | 3330 Target target(&this->target_stack_, loop); |
3327 | 3331 |
3328 // The expression does not see the loop variable. | 3332 // The expression does not see the loop variable. |
3329 scope_ = saved_scope; | 3333 scope_ = saved_scope; |
3330 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3334 Expression* enumerable = ParseExpression(true, CHECK_OK); |
3331 scope_ = for_scope; | 3335 scope_ = for_scope; |
3332 Expect(Token::RPAREN, CHECK_OK); | 3336 Expect(Token::RPAREN, CHECK_OK); |
3333 | 3337 |
3334 VariableProxy* each = scope_->NewUnresolved(factory(), name, each_pos); | 3338 VariableProxy* each = |
| 3339 scope_->NewUnresolved(factory(), name, Variable::NORMAL, each_pos); |
3335 Statement* body = ParseSubStatement(NULL, CHECK_OK); | 3340 Statement* body = ParseSubStatement(NULL, CHECK_OK); |
3336 Block* body_block = | 3341 Block* body_block = |
3337 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); | 3342 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); |
3338 Token::Value init_op = is_const ? Token::INIT_CONST : Token::ASSIGN; | 3343 Token::Value init_op = is_const ? Token::INIT_CONST : Token::ASSIGN; |
3339 Assignment* assignment = factory()->NewAssignment( | 3344 Assignment* assignment = factory()->NewAssignment( |
3340 init_op, each, temp_proxy, RelocInfo::kNoPosition); | 3345 init_op, each, temp_proxy, RelocInfo::kNoPosition); |
3341 Statement* assignment_statement = factory()->NewExpressionStatement( | 3346 Statement* assignment_statement = factory()->NewExpressionStatement( |
3342 assignment, RelocInfo::kNoPosition); | 3347 assignment, RelocInfo::kNoPosition); |
3343 body_block->AddStatement(variable_statement, zone()); | 3348 body_block->AddStatement(variable_statement, zone()); |
3344 body_block->AddStatement(assignment_statement, zone()); | 3349 body_block->AddStatement(assignment_statement, zone()); |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3765 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY; | 3770 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY; |
3766 if (function_type == FunctionLiteral::NAMED_EXPRESSION) { | 3771 if (function_type == FunctionLiteral::NAMED_EXPRESSION) { |
3767 if (allow_harmony_scoping() && is_strict(language_mode())) { | 3772 if (allow_harmony_scoping() && is_strict(language_mode())) { |
3768 fvar_init_op = Token::INIT_CONST; | 3773 fvar_init_op = Token::INIT_CONST; |
3769 } | 3774 } |
3770 VariableMode fvar_mode = | 3775 VariableMode fvar_mode = |
3771 allow_harmony_scoping() && is_strict(language_mode()) ? CONST | 3776 allow_harmony_scoping() && is_strict(language_mode()) ? CONST |
3772 : CONST_LEGACY; | 3777 : CONST_LEGACY; |
3773 DCHECK(function_name != NULL); | 3778 DCHECK(function_name != NULL); |
3774 fvar = new (zone()) | 3779 fvar = new (zone()) |
3775 Variable(scope_, function_name, fvar_mode, true /* is valid LHS */, | 3780 Variable(scope_, function_name, fvar_mode, Variable::NORMAL, |
3776 Variable::NORMAL, kCreatedInitialized, kNotAssigned); | 3781 kCreatedInitialized, kNotAssigned); |
3777 VariableProxy* proxy = factory()->NewVariableProxy(fvar); | 3782 VariableProxy* proxy = factory()->NewVariableProxy(fvar); |
3778 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( | 3783 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( |
3779 proxy, fvar_mode, scope_, RelocInfo::kNoPosition); | 3784 proxy, fvar_mode, scope_, RelocInfo::kNoPosition); |
3780 scope_->DeclareFunctionVar(fvar_declaration); | 3785 scope_->DeclareFunctionVar(fvar_declaration); |
3781 } | 3786 } |
3782 | 3787 |
3783 // Determine if the function can be parsed lazily. Lazy parsing is different | 3788 // Determine if the function can be parsed lazily. Lazy parsing is different |
3784 // from lazy compilation; we need to parse more eagerly than we compile. | 3789 // from lazy compilation; we need to parse more eagerly than we compile. |
3785 | 3790 |
3786 // We can only parse lazily if we also compile lazily. The heuristics for | 3791 // We can only parse lazily if we also compile lazily. The heuristics for |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3957 | 3962 |
3958 | 3963 |
3959 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 3964 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( |
3960 const AstRawString* function_name, int pos, Variable* fvar, | 3965 const AstRawString* function_name, int pos, Variable* fvar, |
3961 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { | 3966 Token::Value fvar_init_op, FunctionKind kind, bool* ok) { |
3962 // Everything inside an eagerly parsed function will be parsed eagerly | 3967 // Everything inside an eagerly parsed function will be parsed eagerly |
3963 // (see comment above). | 3968 // (see comment above). |
3964 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); | 3969 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
3965 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); | 3970 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); |
3966 if (fvar != NULL) { | 3971 if (fvar != NULL) { |
3967 VariableProxy* fproxy = scope_->NewUnresolved(factory(), function_name); | 3972 VariableProxy* fproxy = |
| 3973 scope_->NewUnresolved(factory(), function_name, Variable::NORMAL); |
3968 fproxy->BindTo(fvar); | 3974 fproxy->BindTo(fvar); |
3969 body->Add(factory()->NewExpressionStatement( | 3975 body->Add(factory()->NewExpressionStatement( |
3970 factory()->NewAssignment(fvar_init_op, | 3976 factory()->NewAssignment(fvar_init_op, |
3971 fproxy, | 3977 fproxy, |
3972 factory()->NewThisFunction(pos), | 3978 factory()->NewThisFunction(pos), |
3973 RelocInfo::kNoPosition), | 3979 RelocInfo::kNoPosition), |
3974 RelocInfo::kNoPosition), zone()); | 3980 RelocInfo::kNoPosition), zone()); |
3975 } | 3981 } |
3976 | 3982 |
3977 | 3983 |
(...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5485 } else { | 5491 } else { |
5486 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5492 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
5487 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5493 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
5488 raw_string->length()); | 5494 raw_string->length()); |
5489 } | 5495 } |
5490 } | 5496 } |
5491 | 5497 |
5492 return running_hash; | 5498 return running_hash; |
5493 } | 5499 } |
5494 } } // namespace v8::internal | 5500 } } // namespace v8::internal |
OLD | NEW |