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

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

Issue 1575133003: [parser] fix null-dereference in DoExpression rewriting (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 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') | test/mjsunit/harmony/do-expressions.js » ('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-expression-visitor.h" 9 #include "src/ast/ast-expression-visitor.h"
10 #include "src/ast/ast-literal-reindexer.h" 10 #include "src/ast/ast-literal-reindexer.h"
(...skipping 2178 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 2189
2190 Assignment* assignment = 2190 Assignment* assignment =
2191 factory()->NewAssignment(Token::INIT, proxy, value, pos); 2191 factory()->NewAssignment(Token::INIT, proxy, value, pos);
2192 Statement* assignment_statement = 2192 Statement* assignment_statement =
2193 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition); 2193 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition);
2194 if (names) names->Add(name, zone()); 2194 if (names) names->Add(name, zone());
2195 return assignment_statement; 2195 return assignment_statement;
2196 } 2196 }
2197 2197
2198 2198
2199 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) { 2199 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels,
2200 bool finalize_block_scope, bool* ok) {
2200 // The harmony mode uses block elements instead of statements. 2201 // The harmony mode uses block elements instead of statements.
2201 // 2202 //
2202 // Block :: 2203 // Block ::
2203 // '{' StatementList '}' 2204 // '{' StatementList '}'
2204 2205
2205 // Construct block expecting 16 statements. 2206 // Construct block expecting 16 statements.
2206 Block* body = 2207 Block* body =
2207 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); 2208 factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
2208 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); 2209 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
2209 2210
2210 // Parse the statements and collect escaping labels. 2211 // Parse the statements and collect escaping labels.
2211 Expect(Token::LBRACE, CHECK_OK); 2212 Expect(Token::LBRACE, CHECK_OK);
2212 block_scope->set_start_position(scanner()->location().beg_pos); 2213 block_scope->set_start_position(scanner()->location().beg_pos);
2213 { BlockState block_state(&scope_, block_scope); 2214 { BlockState block_state(&scope_, block_scope);
2214 Target target(&this->target_stack_, body); 2215 Target target(&this->target_stack_, body);
2215 2216
2216 while (peek() != Token::RBRACE) { 2217 while (peek() != Token::RBRACE) {
2217 Statement* stat = ParseStatementListItem(CHECK_OK); 2218 Statement* stat = ParseStatementListItem(CHECK_OK);
2218 if (stat && !stat->IsEmpty()) { 2219 if (stat && !stat->IsEmpty()) {
2219 body->statements()->Add(stat, zone()); 2220 body->statements()->Add(stat, zone());
2220 } 2221 }
2221 } 2222 }
2222 } 2223 }
2223 Expect(Token::RBRACE, CHECK_OK); 2224 Expect(Token::RBRACE, CHECK_OK);
2224 block_scope->set_end_position(scanner()->location().end_pos); 2225 block_scope->set_end_position(scanner()->location().end_pos);
2225 block_scope = block_scope->FinalizeBlockScope(); 2226 if (finalize_block_scope) {
2227 block_scope = block_scope->FinalizeBlockScope();
2228 }
2226 body->set_scope(block_scope); 2229 body->set_scope(block_scope);
2227 return body; 2230 return body;
2228 } 2231 }
2229 2232
2230 2233
2234 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
2235 return ParseBlock(labels, true, ok);
2236 }
2237
2238
2231 Block* Parser::DeclarationParsingResult::BuildInitializationBlock( 2239 Block* Parser::DeclarationParsingResult::BuildInitializationBlock(
2232 ZoneList<const AstRawString*>* names, bool* ok) { 2240 ZoneList<const AstRawString*>* names, bool* ok) {
2233 Block* result = descriptor.parser->factory()->NewBlock( 2241 Block* result = descriptor.parser->factory()->NewBlock(
2234 NULL, 1, true, descriptor.declaration_pos); 2242 NULL, 1, true, descriptor.declaration_pos);
2235 for (auto declaration : declarations) { 2243 for (auto declaration : declarations) {
2236 PatternRewriter::DeclareAndInitializeVariables( 2244 PatternRewriter::DeclareAndInitializeVariables(
2237 result, &descriptor, &declaration, names, CHECK_OK); 2245 result, &descriptor, &declaration, names, CHECK_OK);
2238 } 2246 }
2239 return result; 2247 return result;
2240 } 2248 }
(...skipping 1744 matching lines...) Expand 10 before | Expand all | Expand 10 after
3985 3993
3986 3994
3987 DoExpression* Parser::ParseDoExpression(bool* ok) { 3995 DoExpression* Parser::ParseDoExpression(bool* ok) {
3988 // AssignmentExpression :: 3996 // AssignmentExpression ::
3989 // do '{' StatementList '}' 3997 // do '{' StatementList '}'
3990 int pos = peek_position(); 3998 int pos = peek_position();
3991 3999
3992 Expect(Token::DO, CHECK_OK); 4000 Expect(Token::DO, CHECK_OK);
3993 Variable* result = 4001 Variable* result =
3994 scope_->NewTemporary(ast_value_factory()->dot_result_string()); 4002 scope_->NewTemporary(ast_value_factory()->dot_result_string());
3995 Block* block = ParseBlock(nullptr, CHECK_OK); 4003 Block* block = ParseBlock(nullptr, false, CHECK_OK);
3996 DoExpression* expr = factory()->NewDoExpression(block, result, pos); 4004 DoExpression* expr = factory()->NewDoExpression(block, result, pos);
3997 if (!Rewriter::Rewrite(this, expr, ast_value_factory())) { 4005 if (!Rewriter::Rewrite(this, expr, ast_value_factory())) {
3998 *ok = false; 4006 *ok = false;
3999 return nullptr; 4007 return nullptr;
4000 } 4008 }
4009 block->set_scope(block->scope()->FinalizeBlockScope());
4001 return expr; 4010 return expr;
4002 } 4011 }
4003 4012
4004 4013
4005 void ParserTraits::ParseArrowFunctionFormalParameterList( 4014 void ParserTraits::ParseArrowFunctionFormalParameterList(
4006 ParserFormalParameters* parameters, Expression* expr, 4015 ParserFormalParameters* parameters, Expression* expr,
4007 const Scanner::Location& params_loc, 4016 const Scanner::Location& params_loc,
4008 Scanner::Location* duplicate_loc, bool* ok) { 4017 Scanner::Location* duplicate_loc, bool* ok) {
4009 if (expr->IsEmptyParentheses()) return; 4018 if (expr->IsEmptyParentheses()) return;
4010 4019
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
5440 auto class_literal = value->AsClassLiteral(); 5449 auto class_literal = value->AsClassLiteral();
5441 if (class_literal->raw_name() == nullptr) { 5450 if (class_literal->raw_name() == nullptr) {
5442 class_literal->set_raw_name(name); 5451 class_literal->set_raw_name(name);
5443 } 5452 }
5444 } 5453 }
5445 } 5454 }
5446 5455
5447 5456
5448 } // namespace internal 5457 } // namespace internal
5449 } // namespace v8 5458 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | test/mjsunit/harmony/do-expressions.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698