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

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

Issue 1900033003: Disallow generator declarations in certain locations (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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
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 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 return Statement::Default(); 271 return Statement::Default();
272 } 272 }
273 return ParseSubStatement(allow_function, ok); 273 return ParseSubStatement(allow_function, ok);
274 } 274 }
275 275
276 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) { 276 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) {
277 if (is_strict(language_mode()) || peek() != Token::FUNCTION || 277 if (is_strict(language_mode()) || peek() != Token::FUNCTION ||
278 (legacy && allow_harmony_restrictive_declarations())) { 278 (legacy && allow_harmony_restrictive_declarations())) {
279 return ParseSubStatement(kDisallowLabelledFunctionStatement, ok); 279 return ParseSubStatement(kDisallowLabelledFunctionStatement, ok);
280 } else { 280 } else {
281 return ParseFunctionDeclaration(CHECK_OK); 281 return ParseOnlyFunctionDeclaration(ok);
282 } 282 }
283 } 283 }
284 284
285 PreParser::Statement PreParser::ParseSubStatement( 285 PreParser::Statement PreParser::ParseSubStatement(
286 AllowLabelledFunctionStatement allow_function, bool* ok) { 286 AllowLabelledFunctionStatement allow_function, bool* ok) {
287 // Statement :: 287 // Statement ::
288 // Block 288 // Block
289 // VariableStatement 289 // VariableStatement
290 // EmptyStatement 290 // EmptyStatement
291 // ExpressionStatement 291 // ExpressionStatement
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 *bindings_loc = 539 *bindings_loc =
540 Scanner::Location(bindings_start, scanner()->location().end_pos); 540 Scanner::Location(bindings_start, scanner()->location().end_pos);
541 } 541 }
542 542
543 if (num_decl != nullptr) *num_decl = nvars; 543 if (num_decl != nullptr) *num_decl = nvars;
544 if (is_lexical != nullptr) *is_lexical = lexical; 544 if (is_lexical != nullptr) *is_lexical = lexical;
545 if (is_binding_pattern != nullptr) *is_binding_pattern = is_pattern; 545 if (is_binding_pattern != nullptr) *is_binding_pattern = is_pattern;
546 return Statement::Default(); 546 return Statement::Default();
547 } 547 }
548 548
549 PreParser::Statement PreParser::ParseOnlyFunctionDeclaration(bool* ok) {
550 Consume(Token::FUNCTION);
551 int pos = position();
552 bool is_generator = Check(Token::MUL);
553 if (allow_harmony_restrictive_declarations() && is_generator) {
554 PreParserTraits::ReportMessageAt(
555 scanner()->location(),
556 MessageTemplate::kGeneratorInLegacyContext);
557 *ok = false;
558 return Statement::Default();
559 }
560 bool is_strict_reserved = false;
561 Identifier name =
562 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
563 ParseFunctionLiteral(name, scanner()->location(),
564 is_strict_reserved ? kFunctionNameIsStrictReserved
565 : kFunctionNameValidityUnknown,
566 is_generator ? FunctionKind::kGeneratorFunction
567 : FunctionKind::kNormalFunction,
568 pos, FunctionLiteral::kDeclaration,
adamk 2016/04/20 19:09:28 This is a lot of boilerplate to copy; what if you
Dan Ehrenberg 2016/04/26 22:24:19 Done
569 language_mode(), CHECK_OK);
570 return Statement::FunctionDeclaration();
571 }
572
549 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement( 573 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(
550 AllowLabelledFunctionStatement allow_function, bool* ok) { 574 AllowLabelledFunctionStatement allow_function, bool* ok) {
551 // ExpressionStatement | LabelledStatement :: 575 // ExpressionStatement | LabelledStatement ::
552 // Expression ';' 576 // Expression ';'
553 // Identifier ':' Statement 577 // Identifier ':' Statement
554 578
555 switch (peek()) { 579 switch (peek()) {
556 case Token::FUNCTION: 580 case Token::FUNCTION:
557 case Token::LBRACE: 581 case Token::LBRACE:
558 UNREACHABLE(); // Always handled by the callers. 582 UNREACHABLE(); // Always handled by the callers.
(...skipping 17 matching lines...) Expand all
576 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { 600 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) {
577 // Expression is a single identifier, and not, e.g., a parenthesized 601 // Expression is a single identifier, and not, e.g., a parenthesized
578 // identifier. 602 // identifier.
579 DCHECK(!expr.AsIdentifier().IsFutureReserved()); 603 DCHECK(!expr.AsIdentifier().IsFutureReserved());
580 DCHECK(is_sloppy(language_mode()) || 604 DCHECK(is_sloppy(language_mode()) ||
581 !IsFutureStrictReserved(expr.AsIdentifier())); 605 !IsFutureStrictReserved(expr.AsIdentifier()));
582 Consume(Token::COLON); 606 Consume(Token::COLON);
583 // ES#sec-labelled-function-declarations Labelled Function Declarations 607 // ES#sec-labelled-function-declarations Labelled Function Declarations
584 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { 608 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) {
585 if (allow_function == kAllowLabelledFunctionStatement) { 609 if (allow_function == kAllowLabelledFunctionStatement) {
586 return ParseFunctionDeclaration(ok); 610 return ParseOnlyFunctionDeclaration(ok);
587 } else { 611 } else {
588 return ParseScopedStatement(true, ok); 612 return ParseScopedStatement(true, ok);
589 } 613 }
590 } 614 }
591 Statement statement = 615 Statement statement =
592 ParseStatement(kDisallowLabelledFunctionStatement, ok); 616 ParseStatement(kDisallowLabelledFunctionStatement, ok);
593 return statement.IsJumpStatement() ? Statement::Default() : statement; 617 return statement.IsJumpStatement() ? Statement::Default() : statement;
594 // Preparsing is disabled for extensions (because the extension details 618 // Preparsing is disabled for extensions (because the extension details
595 // aren't passed to lazily compiled functions), so we don't 619 // aren't passed to lazily compiled functions), so we don't
596 // accept "native function" in the preparser. 620 // accept "native function" in the preparser.
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 Expect(Token::RBRACE, CHECK_OK); 1148 Expect(Token::RBRACE, CHECK_OK);
1125 return PreParserExpression::Default(); 1149 return PreParserExpression::Default();
1126 } 1150 }
1127 } 1151 }
1128 1152
1129 #undef CHECK_OK 1153 #undef CHECK_OK
1130 1154
1131 1155
1132 } // namespace internal 1156 } // namespace internal
1133 } // namespace v8 1157 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698