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

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

Issue 2167713004: Always finalize blocks after parsing, also for do-expressions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase 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/rewriter.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 2273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2284 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 2284 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
2285 proxy->var()->set_initializer_position(position()); 2285 proxy->var()->set_initializer_position(position());
2286 Assignment* assignment = 2286 Assignment* assignment =
2287 factory()->NewAssignment(Token::INIT, proxy, value, pos); 2287 factory()->NewAssignment(Token::INIT, proxy, value, pos);
2288 Statement* assignment_statement = 2288 Statement* assignment_statement =
2289 factory()->NewExpressionStatement(assignment, kNoSourcePosition); 2289 factory()->NewExpressionStatement(assignment, kNoSourcePosition);
2290 if (names) names->Add(variable_name, zone()); 2290 if (names) names->Add(variable_name, zone());
2291 return assignment_statement; 2291 return assignment_statement;
2292 } 2292 }
2293 2293
2294 2294 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
2295 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels,
2296 bool finalize_block_scope, bool* ok) {
2297 // The harmony mode uses block elements instead of statements. 2295 // The harmony mode uses block elements instead of statements.
2298 // 2296 //
2299 // Block :: 2297 // Block ::
2300 // '{' StatementList '}' 2298 // '{' StatementList '}'
2301 2299
2302 // Construct block expecting 16 statements. 2300 // Construct block expecting 16 statements.
2303 Block* body = factory()->NewBlock(labels, 16, false, kNoSourcePosition); 2301 Block* body = factory()->NewBlock(labels, 16, false, kNoSourcePosition);
2304 Scope* block_scope = NewScope(BLOCK_SCOPE); 2302 Scope* block_scope = NewScope(BLOCK_SCOPE);
2305 2303
2306 // Parse the statements and collect escaping labels. 2304 // Parse the statements and collect escaping labels.
2307 Expect(Token::LBRACE, CHECK_OK); 2305 Expect(Token::LBRACE, CHECK_OK);
2308 block_scope->set_start_position(scanner()->location().beg_pos); 2306 block_scope->set_start_position(scanner()->location().beg_pos);
2309 { 2307 {
2310 BlockState block_state(&scope_state_, block_scope); 2308 BlockState block_state(&scope_state_, block_scope);
2311 Target target(&this->target_stack_, body); 2309 Target target(&this->target_stack_, body);
2312 2310
2313 while (peek() != Token::RBRACE) { 2311 while (peek() != Token::RBRACE) {
2314 Statement* stat = ParseStatementListItem(CHECK_OK); 2312 Statement* stat = ParseStatementListItem(CHECK_OK);
2315 if (stat && !stat->IsEmpty()) { 2313 if (stat && !stat->IsEmpty()) {
2316 body->statements()->Add(stat, zone()); 2314 body->statements()->Add(stat, zone());
2317 } 2315 }
2318 } 2316 }
2319 } 2317 }
2320 Expect(Token::RBRACE, CHECK_OK); 2318 Expect(Token::RBRACE, CHECK_OK);
2321 block_scope->set_end_position(scanner()->location().end_pos); 2319 block_scope->set_end_position(scanner()->location().end_pos);
2322 if (finalize_block_scope) { 2320 block_scope = block_scope->FinalizeBlockScope();
2323 block_scope = block_scope->FinalizeBlockScope();
2324 }
2325 body->set_scope(block_scope); 2321 body->set_scope(block_scope);
2326 return body; 2322 return body;
2327 } 2323 }
2328 2324
2329 2325
2330 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
2331 return ParseBlock(labels, true, ok);
2332 }
2333
2334
2335 Block* Parser::DeclarationParsingResult::BuildInitializationBlock( 2326 Block* Parser::DeclarationParsingResult::BuildInitializationBlock(
2336 ZoneList<const AstRawString*>* names, bool* ok) { 2327 ZoneList<const AstRawString*>* names, bool* ok) {
2337 Block* result = descriptor.parser->factory()->NewBlock( 2328 Block* result = descriptor.parser->factory()->NewBlock(
2338 NULL, 1, true, descriptor.declaration_pos); 2329 NULL, 1, true, descriptor.declaration_pos);
2339 for (auto declaration : declarations) { 2330 for (auto declaration : declarations) {
2340 PatternRewriter::DeclareAndInitializeVariables( 2331 PatternRewriter::DeclareAndInitializeVariables(
2341 result, &descriptor, &declaration, names, CHECK_OK); 2332 result, &descriptor, &declaration, names, CHECK_OK);
2342 } 2333 }
2343 return result; 2334 return result;
2344 } 2335 }
(...skipping 1869 matching lines...) Expand 10 before | Expand all | Expand 10 after
4214 } 4205 }
4215 4206
4216 DoExpression* Parser::ParseDoExpression(bool* ok) { 4207 DoExpression* Parser::ParseDoExpression(bool* ok) {
4217 // AssignmentExpression :: 4208 // AssignmentExpression ::
4218 // do '{' StatementList '}' 4209 // do '{' StatementList '}'
4219 int pos = peek_position(); 4210 int pos = peek_position();
4220 4211
4221 Expect(Token::DO, CHECK_OK); 4212 Expect(Token::DO, CHECK_OK);
4222 Variable* result = 4213 Variable* result =
4223 scope()->NewTemporary(ast_value_factory()->dot_result_string()); 4214 scope()->NewTemporary(ast_value_factory()->dot_result_string());
4224 Block* block = ParseBlock(nullptr, false, CHECK_OK); 4215 Block* block = ParseBlock(nullptr, CHECK_OK);
4225 DoExpression* expr = factory()->NewDoExpression(block, result, pos); 4216 DoExpression* expr = factory()->NewDoExpression(block, result, pos);
4226 if (!Rewriter::Rewrite(this, expr, ast_value_factory())) { 4217 if (!Rewriter::Rewrite(this, scope()->ClosureScope(), expr,
4218 ast_value_factory())) {
4227 *ok = false; 4219 *ok = false;
4228 return nullptr; 4220 return nullptr;
4229 } 4221 }
4230 block->set_scope(block->scope()->FinalizeBlockScope());
4231 return expr; 4222 return expr;
4232 } 4223 }
4233 4224
4234 void ParserTraits::ParseArrowFunctionFormalParameterList( 4225 void ParserTraits::ParseArrowFunctionFormalParameterList(
4235 ParserFormalParameters* parameters, Expression* expr, 4226 ParserFormalParameters* parameters, Expression* expr,
4236 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc, 4227 const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
4237 const Scope::Snapshot& scope_snapshot, bool* ok) { 4228 const Scope::Snapshot& scope_snapshot, bool* ok) {
4238 if (expr->IsEmptyParentheses()) return; 4229 if (expr->IsEmptyParentheses()) return;
4239 4230
4240 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos, 4231 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos,
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after
5098 5089
5099 if (property_name != ast_value_factory()->constructor_string()) { 5090 if (property_name != ast_value_factory()->constructor_string()) {
5100 SetFunctionNameFromPropertyName(property, property_name); 5091 SetFunctionNameFromPropertyName(property, property_name);
5101 } 5092 }
5102 } 5093 }
5103 5094
5104 Expect(Token::RBRACE, CHECK_OK); 5095 Expect(Token::RBRACE, CHECK_OK);
5105 int end_pos = scanner()->location().end_pos; 5096 int end_pos = scanner()->location().end_pos;
5106 5097
5107 if (constructor == NULL) { 5098 if (constructor == NULL) {
5108 DCHECK_EQ(this->scope(), block_scope); 5099 DCHECK_EQ(scope(), block_scope);
5109 constructor = DefaultConstructor(name, has_extends, pos, end_pos, 5100 constructor = DefaultConstructor(name, has_extends, pos, end_pos,
5110 block_scope->language_mode()); 5101 block_scope->language_mode());
5111 } 5102 }
5112 5103
5113 // Note that we do not finalize this block scope because it is 5104 // Note that we do not finalize this block scope because it is
5114 // used as a sentinel value indicating an anonymous class. 5105 // used as a sentinel value indicating an anonymous class.
5115 block_scope->set_end_position(end_pos); 5106 block_scope->set_end_position(end_pos);
5116 5107
5117 if (name != NULL) { 5108 if (name != NULL) {
5118 DCHECK_NOT_NULL(proxy); 5109 DCHECK_NOT_NULL(proxy);
5119 proxy->var()->set_initializer_position(end_pos); 5110 proxy->var()->set_initializer_position(end_pos);
5120 } 5111 }
5121 5112
5122 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos); 5113 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos);
5123 do_block->set_scope(block_scope); 5114 do_block->set_scope(block_scope);
5124 Variable* result_var = 5115 Variable* result_var =
5125 block_scope->NewTemporary(ast_value_factory()->empty_string()); 5116 block_scope->NewTemporary(ast_value_factory()->empty_string());
5126 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); 5117 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
5127 5118
5128 ClassLiteral* class_literal = factory()->NewClassLiteral( 5119 ClassLiteral* class_literal = factory()->NewClassLiteral(
5129 proxy, extends, constructor, properties, pos, end_pos); 5120 proxy, extends, constructor, properties, pos, end_pos);
5130 5121
5131 do_block->statements()->Add( 5122 do_block->statements()->Add(
5132 factory()->NewExpressionStatement(class_literal, pos), zone()); 5123 factory()->NewExpressionStatement(class_literal, pos), zone());
5133 do_expr->set_represented_function(constructor); 5124 do_expr->set_represented_function(constructor);
5134 Rewriter::Rewrite(this, do_expr, ast_value_factory()); 5125 Rewriter::Rewrite(this, scope()->ClosureScope(), do_expr,
5126 ast_value_factory());
5135 5127
5136 return do_expr; 5128 return do_expr;
5137 } 5129 }
5138 5130
5139 5131
5140 Expression* Parser::ParseV8Intrinsic(bool* ok) { 5132 Expression* Parser::ParseV8Intrinsic(bool* ok) {
5141 // CallRuntime :: 5133 // CallRuntime ::
5142 // '%' Identifier Arguments 5134 // '%' Identifier Arguments
5143 5135
5144 int pos = peek_position(); 5136 int pos = peek_position();
(...skipping 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after
6633 do_block_->statements()->Add(validate_iterator, zone); 6625 do_block_->statements()->Add(validate_iterator, zone);
6634 do_block_->statements()->Add(loop, zone); 6626 do_block_->statements()->Add(loop, zone);
6635 do_block_->statements()->Add(maybe_return_value, zone); 6627 do_block_->statements()->Add(maybe_return_value, zone);
6636 6628
6637 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos); 6629 Block* do_block = factory->NewBlock(nullptr, 2, false, nopos);
6638 do_block->statements()->Add(do_block_, zone); 6630 do_block->statements()->Add(do_block_, zone);
6639 do_block->statements()->Add(get_value, zone); 6631 do_block->statements()->Add(get_value, zone);
6640 6632
6641 Variable* dot_result = scope->NewTemporary(avfactory->dot_result_string()); 6633 Variable* dot_result = scope->NewTemporary(avfactory->dot_result_string());
6642 yield_star = factory->NewDoExpression(do_block, dot_result, nopos); 6634 yield_star = factory->NewDoExpression(do_block, dot_result, nopos);
6643 Rewriter::Rewrite(parser_, yield_star, avfactory); 6635 Rewriter::Rewrite(parser_, scope->ClosureScope(), yield_star, avfactory);
6644 } 6636 }
6645 6637
6646 return yield_star; 6638 return yield_star;
6647 } 6639 }
6648 6640
6649 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error, 6641 Statement* ParserTraits::CheckCallable(Variable* var, Expression* error,
6650 int pos) { 6642 int pos) {
6651 auto factory = parser_->factory(); 6643 auto factory = parser_->factory();
6652 auto avfactory = parser_->ast_value_factory(); 6644 auto avfactory = parser_->ast_value_factory();
6653 const int nopos = kNoSourcePosition; 6645 const int nopos = kNoSourcePosition;
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
7110 node->Print(Isolate::Current()); 7102 node->Print(Isolate::Current());
7111 } 7103 }
7112 #endif // DEBUG 7104 #endif // DEBUG
7113 7105
7114 #undef CHECK_OK 7106 #undef CHECK_OK
7115 #undef CHECK_OK_VOID 7107 #undef CHECK_OK_VOID
7116 #undef CHECK_FAILED 7108 #undef CHECK_FAILED
7117 7109
7118 } // namespace internal 7110 } // namespace internal
7119 } // namespace v8 7111 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/rewriter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698