Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: src/parsing/parser.cc

Issue 2226243002: Indirect Get*Scope over parser/parserbase (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast.h" 10 #include "src/ast/ast.h"
(...skipping 1936 matching lines...) Expand 10 before | Expand all | Expand 10 after
1947 } 1947 }
1948 } 1948 }
1949 1949
1950 1950
1951 VariableProxy* Parser::NewUnresolved(const AstRawString* name, 1951 VariableProxy* Parser::NewUnresolved(const AstRawString* name,
1952 VariableMode mode) { 1952 VariableMode mode) {
1953 // If we are inside a function, a declaration of a 'var' variable is a 1953 // If we are inside a function, a declaration of a 'var' variable is a
1954 // truly local variable, and the scope of the variable is always the function 1954 // truly local variable, and the scope of the variable is always the function
1955 // scope. 1955 // scope.
1956 // Let/const variables are always added to the immediately enclosing scope. 1956 // Let/const variables are always added to the immediately enclosing scope.
1957 Scope* scope = IsLexicalVariableMode(mode) 1957 Scope* scope =
1958 ? this->scope() 1958 IsLexicalVariableMode(mode) ? this->scope() : GetDeclarationScope();
1959 : this->scope()->GetDeclarationScope();
1960 return scope->NewUnresolved(factory(), name, Variable::NORMAL, 1959 return scope->NewUnresolved(factory(), name, Variable::NORMAL,
1961 scanner()->location().beg_pos, 1960 scanner()->location().beg_pos,
1962 scanner()->location().end_pos); 1961 scanner()->location().end_pos);
1963 } 1962 }
1964 1963
1965 InitializationFlag Parser::DefaultInitializationFlag(VariableMode mode) { 1964 InitializationFlag Parser::DefaultInitializationFlag(VariableMode mode) {
1966 DCHECK(IsDeclaredVariableMode(mode)); 1965 DCHECK(IsDeclaredVariableMode(mode));
1967 return mode == VAR ? kCreatedInitialized : kNeedsInitialization; 1966 return mode == VAR ? kCreatedInitialized : kNeedsInitialization;
1968 } 1967 }
1969 1968
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
2109 } 2108 }
2110 } 2109 }
2111 Expect(Token::RPAREN, CHECK_OK); 2110 Expect(Token::RPAREN, CHECK_OK);
2112 Expect(Token::SEMICOLON, CHECK_OK); 2111 Expect(Token::SEMICOLON, CHECK_OK);
2113 2112
2114 // Make sure that the function containing the native declaration 2113 // Make sure that the function containing the native declaration
2115 // isn't lazily compiled. The extension structures are only 2114 // isn't lazily compiled. The extension structures are only
2116 // accessible while parsing the first time not when reparsing 2115 // accessible while parsing the first time not when reparsing
2117 // because of lazy compilation. 2116 // because of lazy compilation.
2118 // TODO(adamk): Should this be GetClosureScope()? 2117 // TODO(adamk): Should this be GetClosureScope()?
2119 scope()->GetDeclarationScope()->ForceEagerCompilation(); 2118 GetDeclarationScope()->ForceEagerCompilation();
2120 2119
2121 // TODO(1240846): It's weird that native function declarations are 2120 // TODO(1240846): It's weird that native function declarations are
2122 // introduced dynamically when we meet their declarations, whereas 2121 // introduced dynamically when we meet their declarations, whereas
2123 // other functions are set up when entering the surrounding scope. 2122 // other functions are set up when entering the surrounding scope.
2124 Declaration* decl = DeclareVariable(name, VAR, pos, CHECK_OK); 2123 Declaration* decl = DeclareVariable(name, VAR, pos, CHECK_OK);
2125 NativeFunctionLiteral* lit = 2124 NativeFunctionLiteral* lit =
2126 factory()->NewNativeFunctionLiteral(name, extension_, kNoSourcePosition); 2125 factory()->NewNativeFunctionLiteral(name, extension_, kNoSourcePosition);
2127 return factory()->NewExpressionStatement( 2126 return factory()->NewExpressionStatement(
2128 factory()->NewAssignment(Token::INIT, decl->proxy(), lit, 2127 factory()->NewAssignment(Token::INIT, decl->proxy(), lit,
2129 kNoSourcePosition), 2128 kNoSourcePosition),
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2218 EmptyStatement* empty = factory()->NewEmptyStatement(kNoSourcePosition); 2217 EmptyStatement* empty = factory()->NewEmptyStatement(kNoSourcePosition);
2219 // Async functions don't undergo sloppy mode block scoped hoisting, and don't 2218 // Async functions don't undergo sloppy mode block scoped hoisting, and don't
2220 // allow duplicates in a block. Both are represented by the 2219 // allow duplicates in a block. Both are represented by the
2221 // sloppy_block_function_map. Don't add them to the map for async functions. 2220 // sloppy_block_function_map. Don't add them to the map for async functions.
2222 // Generators are also supposed to be prohibited; currently doing this behind 2221 // Generators are also supposed to be prohibited; currently doing this behind
2223 // a flag and UseCounting violations to assess web compatibility. 2222 // a flag and UseCounting violations to assess web compatibility.
2224 if (is_sloppy(language_mode()) && !scope()->is_declaration_scope() && 2223 if (is_sloppy(language_mode()) && !scope()->is_declaration_scope() &&
2225 !is_async && !(allow_harmony_restrictive_generators() && is_generator)) { 2224 !is_async && !(allow_harmony_restrictive_generators() && is_generator)) {
2226 SloppyBlockFunctionStatement* delegate = 2225 SloppyBlockFunctionStatement* delegate =
2227 factory()->NewSloppyBlockFunctionStatement(empty, scope()); 2226 factory()->NewSloppyBlockFunctionStatement(empty, scope());
2228 DeclarationScope* target_scope = scope()->GetDeclarationScope(); 2227 DeclarationScope* target_scope = GetDeclarationScope();
2229 target_scope->DeclareSloppyBlockFunction(variable_name, delegate); 2228 target_scope->DeclareSloppyBlockFunction(variable_name, delegate);
2230 return delegate; 2229 return delegate;
2231 } 2230 }
2232 return empty; 2231 return empty;
2233 } 2232 }
2234 2233
2235 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names, 2234 Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names,
2236 bool default_export, bool* ok) { 2235 bool default_export, bool* ok) {
2237 // ClassDeclaration :: 2236 // ClassDeclaration ::
2238 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}' 2237 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
2782 ExpectSemicolon(CHECK_OK); 2781 ExpectSemicolon(CHECK_OK);
2783 2782
2784 if (is_generator()) { 2783 if (is_generator()) {
2785 return_value = BuildIteratorResult(return_value, true); 2784 return_value = BuildIteratorResult(return_value, true);
2786 } else if (is_async_function()) { 2785 } else if (is_async_function()) {
2787 return_value = BuildPromiseResolve(return_value, return_value->position()); 2786 return_value = BuildPromiseResolve(return_value, return_value->position());
2788 } 2787 }
2789 2788
2790 result = factory()->NewReturnStatement(return_value, loc.beg_pos); 2789 result = factory()->NewReturnStatement(return_value, loc.beg_pos);
2791 2790
2792 DeclarationScope* decl_scope = scope()->GetDeclarationScope(); 2791 DeclarationScope* decl_scope = GetDeclarationScope();
2793 if (decl_scope->is_script_scope() || decl_scope->is_eval_scope()) { 2792 if (decl_scope->is_script_scope() || decl_scope->is_eval_scope()) {
2794 ReportMessageAt(loc, MessageTemplate::kIllegalReturn); 2793 ReportMessageAt(loc, MessageTemplate::kIllegalReturn);
2795 *ok = false; 2794 *ok = false;
2796 return NULL; 2795 return NULL;
2797 } 2796 }
2798 return result; 2797 return result;
2799 } 2798 }
2800 2799
2801 2800
2802 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels, 2801 Statement* Parser::ParseWithStatement(ZoneList<const AstRawString*>* labels,
(...skipping 1373 matching lines...) Expand 10 before | Expand all | Expand 10 after
4176 DoExpression* Parser::ParseDoExpression(bool* ok) { 4175 DoExpression* Parser::ParseDoExpression(bool* ok) {
4177 // AssignmentExpression :: 4176 // AssignmentExpression ::
4178 // do '{' StatementList '}' 4177 // do '{' StatementList '}'
4179 int pos = peek_position(); 4178 int pos = peek_position();
4180 4179
4181 Expect(Token::DO, CHECK_OK); 4180 Expect(Token::DO, CHECK_OK);
4182 Variable* result = 4181 Variable* result =
4183 scope()->NewTemporary(ast_value_factory()->dot_result_string()); 4182 scope()->NewTemporary(ast_value_factory()->dot_result_string());
4184 Block* block = ParseBlock(nullptr, CHECK_OK); 4183 Block* block = ParseBlock(nullptr, CHECK_OK);
4185 DoExpression* expr = factory()->NewDoExpression(block, result, pos); 4184 DoExpression* expr = factory()->NewDoExpression(block, result, pos);
4186 if (!Rewriter::Rewrite(this, scope()->GetClosureScope(), expr, 4185 if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) {
4187 ast_value_factory())) {
4188 *ok = false; 4186 *ok = false;
4189 return nullptr; 4187 return nullptr;
4190 } 4188 }
4191 return expr; 4189 return expr;
4192 } 4190 }
4193 4191
4194 void ParserTraits::ParseArrowFunctionFormalParameterList( 4192 void ParserTraits::ParseArrowFunctionFormalParameterList(
4195 ParserFormalParameters* parameters, Expression* expr, 4193 ParserFormalParameters* parameters, Expression* expr,
4196 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, 4194 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
4197 const Scope::Snapshot& scope_snapshot, bool* ok) { 4195 const Scope::Snapshot& scope_snapshot, bool* ok) {
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
5111 scope()->NewTemporary(ast_value_factory()->empty_string()); 5109 scope()->NewTemporary(ast_value_factory()->empty_string());
5112 do_block->set_scope(block_state.FinalizedBlockScope()); 5110 do_block->set_scope(block_state.FinalizedBlockScope());
5113 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); 5111 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
5114 5112
5115 ClassLiteral* class_literal = factory()->NewClassLiteral( 5113 ClassLiteral* class_literal = factory()->NewClassLiteral(
5116 proxy, extends, constructor, properties, pos, end_pos); 5114 proxy, extends, constructor, properties, pos, end_pos);
5117 5115
5118 do_block->statements()->Add( 5116 do_block->statements()->Add(
5119 factory()->NewExpressionStatement(class_literal, pos), zone()); 5117 factory()->NewExpressionStatement(class_literal, pos), zone());
5120 do_expr->set_represented_function(constructor); 5118 do_expr->set_represented_function(constructor);
5121 Rewriter::Rewrite(this, scope()->GetClosureScope(), do_expr, 5119 Rewriter::Rewrite(this, GetClosureScope(), do_expr, ast_value_factory());
5122 ast_value_factory());
5123 5120
5124 return do_expr; 5121 return do_expr;
5125 } 5122 }
5126 5123
5127 5124
5128 Expression* Parser::ParseV8Intrinsic(bool* ok) { 5125 Expression* Parser::ParseV8Intrinsic(bool* ok) {
5129 // CallRuntime :: 5126 // CallRuntime ::
5130 // '%' Identifier Arguments 5127 // '%' Identifier Arguments
5131 5128
5132 int pos = peek_position(); 5129 int pos = peek_position();
5133 Expect(Token::MOD, CHECK_OK); 5130 Expect(Token::MOD, CHECK_OK);
5134 // Allow "eval" or "arguments" for backward compatibility. 5131 // Allow "eval" or "arguments" for backward compatibility.
5135 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers, 5132 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers,
5136 CHECK_OK); 5133 CHECK_OK);
5137 Scanner::Location spread_pos; 5134 Scanner::Location spread_pos;
5138 ExpressionClassifier classifier(this); 5135 ExpressionClassifier classifier(this);
5139 ZoneList<Expression*>* args = 5136 ZoneList<Expression*>* args =
5140 ParseArguments(&spread_pos, &classifier, CHECK_OK); 5137 ParseArguments(&spread_pos, &classifier, CHECK_OK);
5141 5138
5142 DCHECK(!spread_pos.IsValid()); 5139 DCHECK(!spread_pos.IsValid());
5143 5140
5144 if (extension_ != NULL) { 5141 if (extension_ != NULL) {
5145 // The extension structures are only accessible while parsing the 5142 // The extension structures are only accessible while parsing the
5146 // very first time not when reparsing because of lazy compilation. 5143 // very first time not when reparsing because of lazy compilation.
5147 scope()->GetDeclarationScope()->ForceEagerCompilation(); 5144 GetDeclarationScope()->ForceEagerCompilation();
5148 } 5145 }
5149 5146
5150 const Runtime::Function* function = Runtime::FunctionForName(name->string()); 5147 const Runtime::Function* function = Runtime::FunctionForName(name->string());
5151 5148
5152 if (function != NULL) { 5149 if (function != NULL) {
5153 // Check for possible name clash. 5150 // Check for possible name clash.
5154 DCHECK_EQ(Context::kNotFound, 5151 DCHECK_EQ(Context::kNotFound,
5155 Context::IntrinsicIndexForName(name->string())); 5152 Context::IntrinsicIndexForName(name->string()));
5156 // Check for built-in IS_VAR macro. 5153 // Check for built-in IS_VAR macro.
5157 if (function->function_id == Runtime::kIS_VAR) { 5154 if (function->function_id == Runtime::kIS_VAR) {
(...skipping 1948 matching lines...) Expand 10 before | Expand all | Expand 10 after
7106 node->Print(Isolate::Current()); 7103 node->Print(Isolate::Current());
7107 } 7104 }
7108 #endif // DEBUG 7105 #endif // DEBUG
7109 7106
7110 #undef CHECK_OK 7107 #undef CHECK_OK
7111 #undef CHECK_OK_VOID 7108 #undef CHECK_OK_VOID
7112 #undef CHECK_FAILED 7109 #undef CHECK_FAILED
7113 7110
7114 } // namespace internal 7111 } // namespace internal
7115 } // namespace v8 7112 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698