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

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

Issue 1808373003: Implement ES2015 labelled function declaration restrictions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix style Created 4 years, 9 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/preparser.h ('k') | test/cctest/test-parsing.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 <cmath> 5 #include <cmath>
6 6
7 #include "src/allocation.h" 7 #include "src/allocation.h"
8 #include "src/base/logging.h" 8 #include "src/base/logging.h"
9 #include "src/conversions-inl.h" 9 #include "src/conversions-inl.h"
10 #include "src/conversions.h" 10 #include "src/conversions.h"
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 } 187 }
188 break; 188 break;
189 case Token::LET: 189 case Token::LET:
190 if (IsNextLetKeyword()) { 190 if (IsNextLetKeyword()) {
191 return ParseVariableStatement(kStatementListItem, ok); 191 return ParseVariableStatement(kStatementListItem, ok);
192 } 192 }
193 break; 193 break;
194 default: 194 default:
195 break; 195 break;
196 } 196 }
197 return ParseStatement(ok); 197 return ParseStatement(kAllowLabelledFunctionStatement, ok);
198 } 198 }
199 199
200 200
201 void PreParser::ParseStatementList(int end_token, bool* ok, 201 void PreParser::ParseStatementList(int end_token, bool* ok,
202 Scanner::BookmarkScope* bookmark) { 202 Scanner::BookmarkScope* bookmark) {
203 // SourceElements :: 203 // SourceElements ::
204 // (Statement)* <end_token> 204 // (Statement)* <end_token>
205 205
206 // Bookkeeping for trial parse if bookmark is set: 206 // Bookkeeping for trial parse if bookmark is set:
207 DCHECK_IMPLIES(bookmark, bookmark->HasBeenSet()); 207 DCHECK_IMPLIES(bookmark, bookmark->HasBeenSet());
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 } 256 }
257 } 257 }
258 258
259 259
260 #define CHECK_OK ok); \ 260 #define CHECK_OK ok); \
261 if (!*ok) return Statement::Default(); \ 261 if (!*ok) return Statement::Default(); \
262 ((void)0 262 ((void)0
263 #define DUMMY ) // to make indentation work 263 #define DUMMY ) // to make indentation work
264 #undef DUMMY 264 #undef DUMMY
265 265
266 266 PreParser::Statement PreParser::ParseStatement(
267 PreParser::Statement PreParser::ParseStatement(bool* ok) { 267 AllowLabelledFunctionStatement allow_function, bool* ok) {
268 // Statement :: 268 // Statement ::
269 // EmptyStatement 269 // EmptyStatement
270 // ... 270 // ...
271 271
272 if (peek() == Token::SEMICOLON) { 272 if (peek() == Token::SEMICOLON) {
273 Next(); 273 Next();
274 return Statement::Default(); 274 return Statement::Default();
275 } 275 }
276 return ParseSubStatement(ok); 276 return ParseSubStatement(allow_function, ok);
277 } 277 }
278 278
279 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) { 279 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) {
280 if (is_strict(language_mode()) || peek() != Token::FUNCTION || 280 if (is_strict(language_mode()) || peek() != Token::FUNCTION ||
281 (legacy && allow_harmony_restrictive_declarations())) { 281 (legacy && allow_harmony_restrictive_declarations())) {
282 return ParseSubStatement(ok); 282 return ParseSubStatement(kDisallowLabelledFunctionStatement, ok);
283 } else { 283 } else {
284 return ParseFunctionDeclaration(CHECK_OK); 284 return ParseFunctionDeclaration(CHECK_OK);
285 } 285 }
286 } 286 }
287 287
288 PreParser::Statement PreParser::ParseSubStatement(bool* ok) { 288 PreParser::Statement PreParser::ParseSubStatement(
289 AllowLabelledFunctionStatement allow_function, bool* ok) {
289 // Statement :: 290 // Statement ::
290 // Block 291 // Block
291 // VariableStatement 292 // VariableStatement
292 // EmptyStatement 293 // EmptyStatement
293 // ExpressionStatement 294 // ExpressionStatement
294 // IfStatement 295 // IfStatement
295 // IterationStatement 296 // IterationStatement
296 // ContinueStatement 297 // ContinueStatement
297 // BreakStatement 298 // BreakStatement
298 // ReturnStatement 299 // ReturnStatement
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 *ok = false; 366 *ok = false;
366 return Statement::Default(); 367 return Statement::Default();
367 368
368 case Token::DEBUGGER: 369 case Token::DEBUGGER:
369 return ParseDebuggerStatement(ok); 370 return ParseDebuggerStatement(ok);
370 371
371 case Token::VAR: 372 case Token::VAR:
372 return ParseVariableStatement(kStatement, ok); 373 return ParseVariableStatement(kStatement, ok);
373 374
374 default: 375 default:
375 return ParseExpressionOrLabelledStatement(ok); 376 return ParseExpressionOrLabelledStatement(allow_function, ok);
376 } 377 }
377 } 378 }
378 379
379 380
380 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { 381 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
381 // FunctionDeclaration :: 382 // FunctionDeclaration ::
382 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' 383 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
383 // GeneratorDeclaration :: 384 // GeneratorDeclaration ::
384 // 'function' '*' Identifier '(' FormalParameterListopt ')' 385 // 'function' '*' Identifier '(' FormalParameterListopt ')'
385 // '{' FunctionBody '}' 386 // '{' FunctionBody '}'
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 *bindings_loc = 549 *bindings_loc =
549 Scanner::Location(bindings_start, scanner()->location().end_pos); 550 Scanner::Location(bindings_start, scanner()->location().end_pos);
550 } 551 }
551 552
552 if (num_decl != nullptr) *num_decl = nvars; 553 if (num_decl != nullptr) *num_decl = nvars;
553 if (is_lexical != nullptr) *is_lexical = lexical; 554 if (is_lexical != nullptr) *is_lexical = lexical;
554 if (is_binding_pattern != nullptr) *is_binding_pattern = is_pattern; 555 if (is_binding_pattern != nullptr) *is_binding_pattern = is_pattern;
555 return Statement::Default(); 556 return Statement::Default();
556 } 557 }
557 558
558 559 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(
559 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { 560 AllowLabelledFunctionStatement allow_function, bool* ok) {
560 // ExpressionStatement | LabelledStatement :: 561 // ExpressionStatement | LabelledStatement ::
561 // Expression ';' 562 // Expression ';'
562 // Identifier ':' Statement 563 // Identifier ':' Statement
563 564
564 switch (peek()) { 565 switch (peek()) {
565 case Token::FUNCTION: 566 case Token::FUNCTION:
566 case Token::LBRACE: 567 case Token::LBRACE:
567 UNREACHABLE(); // Always handled by the callers. 568 UNREACHABLE(); // Always handled by the callers.
568 case Token::CLASS: 569 case Token::CLASS:
569 ReportUnexpectedToken(Next()); 570 ReportUnexpectedToken(Next());
(...skipping 14 matching lines...) Expand all
584 // an identifier. 585 // an identifier.
585 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { 586 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) {
586 // Expression is a single identifier, and not, e.g., a parenthesized 587 // Expression is a single identifier, and not, e.g., a parenthesized
587 // identifier. 588 // identifier.
588 DCHECK(!expr.AsIdentifier().IsFutureReserved()); 589 DCHECK(!expr.AsIdentifier().IsFutureReserved());
589 DCHECK(is_sloppy(language_mode()) || 590 DCHECK(is_sloppy(language_mode()) ||
590 !IsFutureStrictReserved(expr.AsIdentifier())); 591 !IsFutureStrictReserved(expr.AsIdentifier()));
591 Consume(Token::COLON); 592 Consume(Token::COLON);
592 // ES#sec-labelled-function-declarations Labelled Function Declarations 593 // ES#sec-labelled-function-declarations Labelled Function Declarations
593 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { 594 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) {
594 return ParseFunctionDeclaration(ok); 595 if (allow_function == kAllowLabelledFunctionStatement) {
596 return ParseFunctionDeclaration(ok);
597 } else {
598 return ParseScopedStatement(true, ok);
599 }
595 } 600 }
596 Statement statement = ParseStatement(ok); 601 Statement statement =
602 ParseStatement(kDisallowLabelledFunctionStatement, ok);
597 return statement.IsJumpStatement() ? Statement::Default() : statement; 603 return statement.IsJumpStatement() ? Statement::Default() : statement;
598 // Preparsing is disabled for extensions (because the extension details 604 // Preparsing is disabled for extensions (because the extension details
599 // aren't passed to lazily compiled functions), so we don't 605 // aren't passed to lazily compiled functions), so we don't
600 // accept "native function" in the preparser. 606 // accept "native function" in the preparser.
601 } 607 }
602 // Parsed expression statement. 608 // Parsed expression statement.
603 // Detect attempts at 'let' declarations in sloppy mode. 609 // Detect attempts at 'let' declarations in sloppy mode.
604 if (!allow_harmony_sloppy_let() && peek() == Token::IDENTIFIER && 610 if (!allow_harmony_sloppy_let() && peek() == Token::IDENTIFIER &&
605 is_sloppy(language_mode()) && expr.IsIdentifier() && 611 is_sloppy(language_mode()) && expr.IsIdentifier() &&
606 expr.AsIdentifier().IsLet()) { 612 expr.AsIdentifier().IsLet()) {
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 Expect(Token::RBRACE, CHECK_OK); 1152 Expect(Token::RBRACE, CHECK_OK);
1147 return PreParserExpression::Default(); 1153 return PreParserExpression::Default();
1148 } 1154 }
1149 } 1155 }
1150 1156
1151 #undef CHECK_OK 1157 #undef CHECK_OK
1152 1158
1153 1159
1154 } // namespace internal 1160 } // namespace internal
1155 } // namespace v8 1161 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698