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 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 } | 733 } |
734 | 734 |
735 | 735 |
736 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { | 736 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) { |
737 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); | 737 return parser_->scanner()->NextSymbol(parser_->ast_value_factory()); |
738 } | 738 } |
739 | 739 |
740 | 740 |
741 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, | 741 Expression* ParserTraits::ThisExpression(Scope* scope, AstNodeFactory* factory, |
742 int pos) { | 742 int pos) { |
743 return factory->NewVariableProxy(scope->receiver(), pos); | 743 return scope->NewUnresolved(factory, |
| 744 parser_->ast_value_factory()->this_string(), |
| 745 Variable::THIS, pos, pos + 4); |
744 } | 746 } |
745 | 747 |
746 Expression* ParserTraits::SuperReference(Scope* scope, AstNodeFactory* factory, | 748 Expression* ParserTraits::SuperReference(Scope* scope, AstNodeFactory* factory, |
747 int pos) { | 749 int pos) { |
748 return factory->NewSuperReference( | 750 return factory->NewSuperReference( |
749 ThisExpression(scope, factory, pos)->AsVariableProxy(), | 751 ThisExpression(scope, factory, pos)->AsVariableProxy(), |
750 pos); | 752 pos); |
751 } | 753 } |
752 | 754 |
753 | 755 |
(...skipping 27 matching lines...) Expand all Loading... |
781 return NULL; | 783 return NULL; |
782 } | 784 } |
783 | 785 |
784 | 786 |
785 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, | 787 Expression* ParserTraits::ExpressionFromIdentifier(const AstRawString* name, |
786 int start_position, | 788 int start_position, |
787 int end_position, | 789 int end_position, |
788 Scope* scope, | 790 Scope* scope, |
789 AstNodeFactory* factory) { | 791 AstNodeFactory* factory) { |
790 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); | 792 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); |
791 return scope->NewUnresolved(factory, name, start_position, end_position); | 793 return scope->NewUnresolved(factory, name, Variable::NORMAL, start_position, |
| 794 end_position); |
792 } | 795 } |
793 | 796 |
794 | 797 |
795 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, | 798 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, |
796 AstNodeFactory* factory) { | 799 AstNodeFactory* factory) { |
797 const AstRawString* symbol = GetSymbol(scanner); | 800 const AstRawString* symbol = GetSymbol(scanner); |
798 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); | 801 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); |
799 return factory->NewStringLiteral(symbol, pos); | 802 return factory->NewStringLiteral(symbol, pos); |
800 } | 803 } |
801 | 804 |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 // background thread. We should not access anything Isolate / heap dependent | 963 // background thread. We should not access anything Isolate / heap dependent |
961 // via ParseInfo, and also not pass it forward. | 964 // via ParseInfo, and also not pass it forward. |
962 DCHECK(scope_ == NULL); | 965 DCHECK(scope_ == NULL); |
963 DCHECK(target_stack_ == NULL); | 966 DCHECK(target_stack_ == NULL); |
964 | 967 |
965 Mode parsing_mode = FLAG_lazy && allow_lazy() ? PARSE_LAZILY : PARSE_EAGERLY; | 968 Mode parsing_mode = FLAG_lazy && allow_lazy() ? PARSE_LAZILY : PARSE_EAGERLY; |
966 if (allow_natives() || extension_ != NULL) parsing_mode = PARSE_EAGERLY; | 969 if (allow_natives() || extension_ != NULL) parsing_mode = PARSE_EAGERLY; |
967 | 970 |
968 FunctionLiteral* result = NULL; | 971 FunctionLiteral* result = NULL; |
969 { | 972 { |
| 973 // TODO(wingo): Add an outer GLOBAL_SCOPE corresponding to the native |
| 974 // context, which will have the "this" binding for script scopes. |
970 Scope* scope = NewScope(scope_, SCRIPT_SCOPE); | 975 Scope* scope = NewScope(scope_, SCRIPT_SCOPE); |
971 info->set_script_scope(scope); | 976 info->set_script_scope(scope); |
972 if (!info->context().is_null() && !info->context()->IsNativeContext()) { | 977 if (!info->context().is_null() && !info->context()->IsNativeContext()) { |
973 scope = Scope::DeserializeScopeChain(info->isolate(), zone(), | 978 scope = Scope::DeserializeScopeChain(info->isolate(), zone(), |
974 *info->context(), scope); | 979 *info->context(), scope); |
975 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this | 980 // The Scope is backed up by ScopeInfo (which is in the V8 heap); this |
976 // means the Parser cannot operate independent of the V8 heap. Tell the | 981 // means the Parser cannot operate independent of the V8 heap. Tell the |
977 // string table to internalize strings and values right after they're | 982 // string table to internalize strings and values right after they're |
978 // created. This kind of parsing can only be done in the main thread. | 983 // created. This kind of parsing can only be done in the main thread. |
979 DCHECK(parsing_on_main_thread_); | 984 DCHECK(parsing_on_main_thread_); |
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1912 } | 1917 } |
1913 | 1918 |
1914 | 1919 |
1915 VariableProxy* Parser::NewUnresolved(const AstRawString* name, | 1920 VariableProxy* Parser::NewUnresolved(const AstRawString* name, |
1916 VariableMode mode) { | 1921 VariableMode mode) { |
1917 // If we are inside a function, a declaration of a var/const variable is a | 1922 // If we are inside a function, a declaration of a var/const variable is a |
1918 // truly local variable, and the scope of the variable is always the function | 1923 // truly local variable, and the scope of the variable is always the function |
1919 // scope. | 1924 // scope. |
1920 // Let/const variables in harmony mode are always added to the immediately | 1925 // Let/const variables in harmony mode are always added to the immediately |
1921 // enclosing scope. | 1926 // enclosing scope. |
1922 return DeclarationScope(mode)->NewUnresolved(factory(), name, | 1927 return DeclarationScope(mode)->NewUnresolved( |
1923 scanner()->location().beg_pos, | 1928 factory(), name, Variable::NORMAL, scanner()->location().beg_pos, |
1924 scanner()->location().end_pos); | 1929 scanner()->location().end_pos); |
1925 } | 1930 } |
1926 | 1931 |
1927 | 1932 |
1928 Variable* Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { | 1933 Variable* Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { |
1929 VariableProxy* proxy = declaration->proxy(); | 1934 VariableProxy* proxy = declaration->proxy(); |
1930 DCHECK(proxy->raw_name() != NULL); | 1935 DCHECK(proxy->raw_name() != NULL); |
1931 const AstRawString* name = proxy->raw_name(); | 1936 const AstRawString* name = proxy->raw_name(); |
1932 VariableMode mode = declaration->mode(); | 1937 VariableMode mode = declaration->mode(); |
1933 Scope* declaration_scope = DeclarationScope(mode); | 1938 Scope* declaration_scope = DeclarationScope(mode); |
1934 Variable* var = NULL; | 1939 Variable* var = NULL; |
(...skipping 1643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3578 *ok = false; | 3583 *ok = false; |
3579 return nullptr; | 3584 return nullptr; |
3580 } | 3585 } |
3581 ForEachStatement* loop = | 3586 ForEachStatement* loop = |
3582 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3587 factory()->NewForEachStatement(mode, labels, stmt_pos); |
3583 Target target(&this->target_stack_, loop); | 3588 Target target(&this->target_stack_, loop); |
3584 | 3589 |
3585 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3590 Expression* enumerable = ParseExpression(true, CHECK_OK); |
3586 Expect(Token::RPAREN, CHECK_OK); | 3591 Expect(Token::RPAREN, CHECK_OK); |
3587 | 3592 |
3588 VariableProxy* each = | 3593 VariableProxy* each = scope_->NewUnresolved( |
3589 scope_->NewUnresolved(factory(), name, each_beg_pos, each_end_pos); | 3594 factory(), name, Variable::NORMAL, each_beg_pos, each_end_pos); |
3590 Statement* body = ParseSubStatement(NULL, CHECK_OK); | 3595 Statement* body = ParseSubStatement(NULL, CHECK_OK); |
3591 InitializeForEachStatement(loop, each, enumerable, body); | 3596 InitializeForEachStatement(loop, each, enumerable, body); |
3592 Block* result = | 3597 Block* result = |
3593 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); | 3598 factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); |
3594 result->AddStatement(variable_statement, zone()); | 3599 result->AddStatement(variable_statement, zone()); |
3595 result->AddStatement(loop, zone()); | 3600 result->AddStatement(loop, zone()); |
3596 scope_ = saved_scope; | 3601 scope_ = saved_scope; |
3597 for_scope->set_end_position(scanner()->location().end_pos); | 3602 for_scope->set_end_position(scanner()->location().end_pos); |
3598 for_scope = for_scope->FinalizeBlockScope(); | 3603 for_scope = for_scope->FinalizeBlockScope(); |
3599 DCHECK(for_scope == NULL); | 3604 DCHECK(for_scope == NULL); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3660 ForEachStatement* loop = | 3665 ForEachStatement* loop = |
3661 factory()->NewForEachStatement(mode, labels, stmt_pos); | 3666 factory()->NewForEachStatement(mode, labels, stmt_pos); |
3662 Target target(&this->target_stack_, loop); | 3667 Target target(&this->target_stack_, loop); |
3663 | 3668 |
3664 // The expression does not see the loop variable. | 3669 // The expression does not see the loop variable. |
3665 scope_ = saved_scope; | 3670 scope_ = saved_scope; |
3666 Expression* enumerable = ParseExpression(true, CHECK_OK); | 3671 Expression* enumerable = ParseExpression(true, CHECK_OK); |
3667 scope_ = for_scope; | 3672 scope_ = for_scope; |
3668 Expect(Token::RPAREN, CHECK_OK); | 3673 Expect(Token::RPAREN, CHECK_OK); |
3669 | 3674 |
3670 VariableProxy* each = | 3675 VariableProxy* each = scope_->NewUnresolved( |
3671 scope_->NewUnresolved(factory(), name, each_beg_pos, each_end_pos); | 3676 factory(), name, Variable::NORMAL, each_beg_pos, each_end_pos); |
3672 Statement* body = ParseSubStatement(NULL, CHECK_OK); | 3677 Statement* body = ParseSubStatement(NULL, CHECK_OK); |
3673 Block* body_block = | 3678 Block* body_block = |
3674 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); | 3679 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); |
3675 Token::Value init_op = is_const ? Token::INIT_CONST : Token::ASSIGN; | 3680 Token::Value init_op = is_const ? Token::INIT_CONST : Token::ASSIGN; |
3676 Assignment* assignment = factory()->NewAssignment( | 3681 Assignment* assignment = factory()->NewAssignment( |
3677 init_op, each, temp_proxy, RelocInfo::kNoPosition); | 3682 init_op, each, temp_proxy, RelocInfo::kNoPosition); |
3678 Statement* assignment_statement = factory()->NewExpressionStatement( | 3683 Statement* assignment_statement = factory()->NewExpressionStatement( |
3679 assignment, RelocInfo::kNoPosition); | 3684 assignment, RelocInfo::kNoPosition); |
3680 body_block->AddStatement(variable_statement, zone()); | 3685 body_block->AddStatement(variable_statement, zone()); |
3681 body_block->AddStatement(assignment_statement, zone()); | 3686 body_block->AddStatement(assignment_statement, zone()); |
(...skipping 2209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5891 | 5896 |
5892 Expression* Parser::SpreadCallNew(Expression* function, | 5897 Expression* Parser::SpreadCallNew(Expression* function, |
5893 ZoneList<v8::internal::Expression*>* args, | 5898 ZoneList<v8::internal::Expression*>* args, |
5894 int pos) { | 5899 int pos) { |
5895 args->InsertAt(0, function, zone()); | 5900 args->InsertAt(0, function, zone()); |
5896 | 5901 |
5897 return factory()->NewCallRuntime( | 5902 return factory()->NewCallRuntime( |
5898 ast_value_factory()->reflect_construct_string(), NULL, args, pos); | 5903 ast_value_factory()->reflect_construct_string(), NULL, args, pos); |
5899 } | 5904 } |
5900 } } // namespace v8::internal | 5905 } } // namespace v8::internal |
OLD | NEW |