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

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

Issue 1487603003: [cleanup] Remove redundant fields from DeclarationDescriptor (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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/pattern-rewriter.cc » ('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 "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-literal-reindexer.h" 9 #include "src/ast/ast-literal-reindexer.h"
10 #include "src/ast/scopeinfo.h" 10 #include "src/ast/scopeinfo.h"
(...skipping 2007 matching lines...) Expand 10 before | Expand all | Expand 10 after
2018 } 2018 }
2019 2019
2020 2020
2021 VariableProxy* Parser::NewUnresolved(const AstRawString* name, 2021 VariableProxy* Parser::NewUnresolved(const AstRawString* name,
2022 VariableMode mode) { 2022 VariableMode mode) {
2023 // If we are inside a function, a declaration of a var/const variable is a 2023 // If we are inside a function, a declaration of a var/const variable is a
2024 // truly local variable, and the scope of the variable is always the function 2024 // truly local variable, and the scope of the variable is always the function
2025 // scope. 2025 // scope.
2026 // Let/const variables in harmony mode are always added to the immediately 2026 // Let/const variables in harmony mode are always added to the immediately
2027 // enclosing scope. 2027 // enclosing scope.
2028 return DeclarationScope(mode)->NewUnresolved( 2028 Scope* scope =
2029 factory(), name, Variable::NORMAL, scanner()->location().beg_pos, 2029 IsLexicalVariableMode(mode) ? scope_ : scope_->DeclarationScope();
2030 scanner()->location().end_pos); 2030 return scope->NewUnresolved(factory(), name, Variable::NORMAL,
2031 scanner()->location().beg_pos,
2032 scanner()->location().end_pos);
2031 } 2033 }
2032 2034
2033 2035
2034 Variable* Parser::Declare(Declaration* declaration, 2036 Variable* Parser::Declare(Declaration* declaration,
2035 DeclarationDescriptor::Kind declaration_kind, 2037 DeclarationDescriptor::Kind declaration_kind,
2036 bool resolve, bool* ok, Scope* scope) { 2038 bool resolve, bool* ok, Scope* scope) {
2037 VariableProxy* proxy = declaration->proxy(); 2039 VariableProxy* proxy = declaration->proxy();
2038 DCHECK(proxy->raw_name() != NULL); 2040 DCHECK(proxy->raw_name() != NULL);
2039 const AstRawString* name = proxy->raw_name(); 2041 const AstRawString* name = proxy->raw_name();
2040 VariableMode mode = declaration->mode(); 2042 VariableMode mode = declaration->mode();
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
2203 Expect(Token::COMMA, CHECK_OK); 2205 Expect(Token::COMMA, CHECK_OK);
2204 } 2206 }
2205 } 2207 }
2206 Expect(Token::RPAREN, CHECK_OK); 2208 Expect(Token::RPAREN, CHECK_OK);
2207 Expect(Token::SEMICOLON, CHECK_OK); 2209 Expect(Token::SEMICOLON, CHECK_OK);
2208 2210
2209 // Make sure that the function containing the native declaration 2211 // Make sure that the function containing the native declaration
2210 // isn't lazily compiled. The extension structures are only 2212 // isn't lazily compiled. The extension structures are only
2211 // accessible while parsing the first time not when reparsing 2213 // accessible while parsing the first time not when reparsing
2212 // because of lazy compilation. 2214 // because of lazy compilation.
2213 DeclarationScope(VAR)->ForceEagerCompilation(); 2215 // TODO(adamk): Should this be ClosureScope()?
2216 scope_->DeclarationScope()->ForceEagerCompilation();
2214 2217
2215 // TODO(1240846): It's weird that native function declarations are 2218 // TODO(1240846): It's weird that native function declarations are
2216 // introduced dynamically when we meet their declarations, whereas 2219 // introduced dynamically when we meet their declarations, whereas
2217 // other functions are set up when entering the surrounding scope. 2220 // other functions are set up when entering the surrounding scope.
2218 VariableProxy* proxy = NewUnresolved(name, VAR); 2221 VariableProxy* proxy = NewUnresolved(name, VAR);
2219 Declaration* declaration = 2222 Declaration* declaration =
2220 factory()->NewVariableDeclaration(proxy, VAR, scope_, pos); 2223 factory()->NewVariableDeclaration(proxy, VAR, scope_, pos);
2221 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 2224 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
2222 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral( 2225 NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral(
2223 name, extension_, RelocInfo::kNoPosition); 2226 name, extension_, RelocInfo::kNoPosition);
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
2440 parsing_result->descriptor.parser = this; 2443 parsing_result->descriptor.parser = this;
2441 parsing_result->descriptor.declaration_kind = DeclarationDescriptor::NORMAL; 2444 parsing_result->descriptor.declaration_kind = DeclarationDescriptor::NORMAL;
2442 parsing_result->descriptor.declaration_pos = peek_position(); 2445 parsing_result->descriptor.declaration_pos = peek_position();
2443 parsing_result->descriptor.initialization_pos = peek_position(); 2446 parsing_result->descriptor.initialization_pos = peek_position();
2444 parsing_result->descriptor.mode = VAR; 2447 parsing_result->descriptor.mode = VAR;
2445 // True if the binding needs initialization. 'let' and 'const' declared 2448 // True if the binding needs initialization. 'let' and 'const' declared
2446 // bindings are created uninitialized by their declaration nodes and 2449 // bindings are created uninitialized by their declaration nodes and
2447 // need initialization. 'var' declared bindings are always initialized 2450 // need initialization. 'var' declared bindings are always initialized
2448 // immediately by their declaration nodes. 2451 // immediately by their declaration nodes.
2449 parsing_result->descriptor.needs_init = false; 2452 parsing_result->descriptor.needs_init = false;
2450 parsing_result->descriptor.is_const = false;
2451 if (peek() == Token::VAR) { 2453 if (peek() == Token::VAR) {
2452 if (is_strong(language_mode())) { 2454 if (is_strong(language_mode())) {
2453 Scanner::Location location = scanner()->peek_location(); 2455 Scanner::Location location = scanner()->peek_location();
2454 ReportMessageAt(location, MessageTemplate::kStrongVar); 2456 ReportMessageAt(location, MessageTemplate::kStrongVar);
2455 *ok = false; 2457 *ok = false;
2456 return; 2458 return;
2457 } 2459 }
2458 Consume(Token::VAR); 2460 Consume(Token::VAR);
2459 } else if (peek() == Token::CONST && allow_const()) { 2461 } else if (peek() == Token::CONST && allow_const()) {
2460 Consume(Token::CONST); 2462 Consume(Token::CONST);
2461 if (is_sloppy(language_mode()) && allow_legacy_const()) { 2463 if (is_sloppy(language_mode()) && allow_legacy_const()) {
2462 parsing_result->descriptor.mode = CONST_LEGACY; 2464 parsing_result->descriptor.mode = CONST_LEGACY;
2463 ++use_counts_[v8::Isolate::kLegacyConst]; 2465 ++use_counts_[v8::Isolate::kLegacyConst];
2464 } else { 2466 } else {
2465 DCHECK(is_strict(language_mode()) || allow_harmony_sloppy()); 2467 DCHECK(is_strict(language_mode()) || allow_harmony_sloppy());
2466 DCHECK(var_context != kStatement); 2468 DCHECK(var_context != kStatement);
2467 parsing_result->descriptor.mode = CONST; 2469 parsing_result->descriptor.mode = CONST;
2468 } 2470 }
2469 parsing_result->descriptor.is_const = true;
2470 parsing_result->descriptor.needs_init = true; 2471 parsing_result->descriptor.needs_init = true;
2471 } else if (peek() == Token::LET && allow_let()) { 2472 } else if (peek() == Token::LET && allow_let()) {
2472 Consume(Token::LET); 2473 Consume(Token::LET);
2473 DCHECK(var_context != kStatement); 2474 DCHECK(var_context != kStatement);
2474 parsing_result->descriptor.mode = LET; 2475 parsing_result->descriptor.mode = LET;
2475 parsing_result->descriptor.needs_init = true; 2476 parsing_result->descriptor.needs_init = true;
2476 } else { 2477 } else {
2477 UNREACHABLE(); // by current callers 2478 UNREACHABLE(); // by current callers
2478 } 2479 }
2479 2480
2480 parsing_result->descriptor.declaration_scope =
2481 DeclarationScope(parsing_result->descriptor.mode);
2482 parsing_result->descriptor.scope = scope_; 2481 parsing_result->descriptor.scope = scope_;
2483 parsing_result->descriptor.hoist_scope = nullptr; 2482 parsing_result->descriptor.hoist_scope = nullptr;
2484 2483
2485 2484
2486 bool first_declaration = true; 2485 bool first_declaration = true;
2487 int bindings_start = peek_position(); 2486 int bindings_start = peek_position();
2488 bool is_for_iteration_variable; 2487 bool is_for_iteration_variable;
2489 do { 2488 do {
2490 if (fni_ != NULL) fni_->Enter(); 2489 if (fni_ != NULL) fni_->Enter();
2491 2490
(...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after
3154 3153
3155 block_scope->set_start_position(scanner()->location().beg_pos); 3154 block_scope->set_start_position(scanner()->location().beg_pos);
3156 { 3155 {
3157 BlockState block_state(&scope_, block_scope); 3156 BlockState block_state(&scope_, block_scope);
3158 Target target(&this->target_stack_, catch_block); 3157 Target target(&this->target_stack_, catch_block);
3159 3158
3160 if (!is_simple) { 3159 if (!is_simple) {
3161 DeclarationDescriptor descriptor; 3160 DeclarationDescriptor descriptor;
3162 descriptor.declaration_kind = DeclarationDescriptor::NORMAL; 3161 descriptor.declaration_kind = DeclarationDescriptor::NORMAL;
3163 descriptor.parser = this; 3162 descriptor.parser = this;
3164 descriptor.declaration_scope = scope_;
3165 descriptor.scope = scope_; 3163 descriptor.scope = scope_;
3166 descriptor.hoist_scope = nullptr; 3164 descriptor.hoist_scope = nullptr;
3167 descriptor.mode = LET; 3165 descriptor.mode = LET;
3168 descriptor.is_const = false;
3169 descriptor.needs_init = true; 3166 descriptor.needs_init = true;
3170 descriptor.declaration_pos = pattern->position(); 3167 descriptor.declaration_pos = pattern->position();
3171 descriptor.initialization_pos = pattern->position(); 3168 descriptor.initialization_pos = pattern->position();
3172 3169
3173 DeclarationParsingResult::Declaration decl( 3170 DeclarationParsingResult::Declaration decl(
3174 pattern, pattern->position(), 3171 pattern, pattern->position(),
3175 factory()->NewVariableProxy(catch_variable)); 3172 factory()->NewVariableProxy(catch_variable));
3176 3173
3177 PatternRewriter::DeclareAndInitializeVariables( 3174 PatternRewriter::DeclareAndInitializeVariables(
3178 catch_block, &descriptor, &decl, nullptr, CHECK_OK); 3175 catch_block, &descriptor, &decl, nullptr, CHECK_OK);
(...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after
4529 const ParserFormalParameters& parameters, bool* ok) { 4526 const ParserFormalParameters& parameters, bool* ok) {
4530 DCHECK(!parameters.is_simple); 4527 DCHECK(!parameters.is_simple);
4531 DCHECK(scope_->is_function_scope()); 4528 DCHECK(scope_->is_function_scope());
4532 Block* init_block = 4529 Block* init_block =
4533 factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); 4530 factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition);
4534 for (int i = 0; i < parameters.params.length(); ++i) { 4531 for (int i = 0; i < parameters.params.length(); ++i) {
4535 auto parameter = parameters.params[i]; 4532 auto parameter = parameters.params[i];
4536 DeclarationDescriptor descriptor; 4533 DeclarationDescriptor descriptor;
4537 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; 4534 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER;
4538 descriptor.parser = this; 4535 descriptor.parser = this;
4539 descriptor.declaration_scope = scope_;
4540 descriptor.scope = scope_; 4536 descriptor.scope = scope_;
4541 descriptor.hoist_scope = nullptr; 4537 descriptor.hoist_scope = nullptr;
4542 descriptor.mode = LET; 4538 descriptor.mode = LET;
4543 descriptor.is_const = false;
4544 descriptor.needs_init = true; 4539 descriptor.needs_init = true;
4545 descriptor.declaration_pos = parameter.pattern->position(); 4540 descriptor.declaration_pos = parameter.pattern->position();
4546 // The position that will be used by the AssignmentExpression 4541 // The position that will be used by the AssignmentExpression
4547 // which copies from the temp parameter to the pattern. 4542 // which copies from the temp parameter to the pattern.
4548 // 4543 //
4549 // TODO(adamk): Should this be RelocInfo::kNoPosition, since 4544 // TODO(adamk): Should this be RelocInfo::kNoPosition, since
4550 // it's just copying from a temp var to the real param var? 4545 // it's just copying from a temp var to the real param var?
4551 descriptor.initialization_pos = parameter.pattern->position(); 4546 descriptor.initialization_pos = parameter.pattern->position();
4552 // The initializer position which will end up in, 4547 // The initializer position which will end up in,
4553 // Variable::initializer_position(), used for hole check elimination. 4548 // Variable::initializer_position(), used for hole check elimination.
(...skipping 1901 matching lines...) Expand 10 before | Expand all | Expand 10 after
6455 } 6450 }
6456 6451
6457 6452
6458 void Parser::RaiseLanguageMode(LanguageMode mode) { 6453 void Parser::RaiseLanguageMode(LanguageMode mode) {
6459 SetLanguageMode(scope_, 6454 SetLanguageMode(scope_,
6460 static_cast<LanguageMode>(scope_->language_mode() | mode)); 6455 static_cast<LanguageMode>(scope_->language_mode() | mode));
6461 } 6456 }
6462 6457
6463 } // namespace internal 6458 } // namespace internal
6464 } // namespace v8 6459 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/pattern-rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698