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

Side by Side Diff: src/preparser.h

Issue 1460393003: [es6] Fix parsing of 'yield' in function and generator expressions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 | « no previous file | 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 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 #ifndef V8_PREPARSER_H 5 #ifndef V8_PREPARSER_H
6 #define V8_PREPARSER_H 6 #define V8_PREPARSER_H
7 7
8 #include "src/bailout-reason.h" 8 #include "src/bailout-reason.h"
9 #include "src/expression-classifier.h" 9 #include "src/expression-classifier.h"
10 #include "src/func-name-inferrer.h" 10 #include "src/func-name-inferrer.h"
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 657
658 // Parses an identifier that is valid for the current scope, in particular it 658 // Parses an identifier that is valid for the current scope, in particular it
659 // fails on strict mode future reserved keywords in a strict scope. If 659 // fails on strict mode future reserved keywords in a strict scope. If
660 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or 660 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or
661 // "arguments" as identifier even in strict mode (this is needed in cases like 661 // "arguments" as identifier even in strict mode (this is needed in cases like
662 // "var foo = eval;"). 662 // "var foo = eval;").
663 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok); 663 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok);
664 IdentifierT ParseAndClassifyIdentifier(ExpressionClassifier* classifier, 664 IdentifierT ParseAndClassifyIdentifier(ExpressionClassifier* classifier,
665 bool* ok); 665 bool* ok);
666 // Parses an identifier or a strict mode future reserved word, and indicate 666 // Parses an identifier or a strict mode future reserved word, and indicate
667 // whether it is strict mode future reserved. 667 // whether it is strict mode future reserved. Allows passing in is_generator
668 // for the case of parsing the identifier in a function expression, where the
669 // relevant "is_generator" bit is of the function being parsed, not the
670 // containing
671 // function.
672 IdentifierT ParseIdentifierOrStrictReservedWord(bool is_generator,
673 bool* is_strict_reserved,
674 bool* ok);
668 IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, 675 IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved,
669 bool* ok); 676 bool* ok) {
677 return ParseIdentifierOrStrictReservedWord(this->is_generator(),
678 is_strict_reserved, ok);
679 }
680
670 IdentifierT ParseIdentifierName(bool* ok); 681 IdentifierT ParseIdentifierName(bool* ok);
671 // Parses an identifier and determines whether or not it is 'get' or 'set'. 682 // Parses an identifier and determines whether or not it is 'get' or 'set'.
672 IdentifierT ParseIdentifierNameOrGetOrSet(bool* is_get, bool* is_set, 683 IdentifierT ParseIdentifierNameOrGetOrSet(bool* is_get, bool* is_set,
673 bool* ok); 684 bool* ok);
674 685
675 686
676 ExpressionT ParseRegExpLiteral(bool seen_equal, 687 ExpressionT ParseRegExpLiteral(bool seen_equal,
677 ExpressionClassifier* classifier, bool* ok); 688 ExpressionClassifier* classifier, bool* ok);
678 689
679 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, 690 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier,
(...skipping 1459 matching lines...) Expand 10 before | Expand all | Expand 10 after
2139 return this->GetSymbol(scanner()); 2150 return this->GetSymbol(scanner());
2140 } else { 2151 } else {
2141 this->ReportUnexpectedToken(next); 2152 this->ReportUnexpectedToken(next);
2142 *ok = false; 2153 *ok = false;
2143 return Traits::EmptyIdentifier(); 2154 return Traits::EmptyIdentifier();
2144 } 2155 }
2145 } 2156 }
2146 2157
2147 2158
2148 template <class Traits> 2159 template <class Traits>
2149 typename ParserBase<Traits>::IdentifierT ParserBase< 2160 typename ParserBase<Traits>::IdentifierT
2150 Traits>::ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved, 2161 ParserBase<Traits>::ParseIdentifierOrStrictReservedWord(
2151 bool* ok) { 2162 bool is_generator, bool* is_strict_reserved, bool* ok) {
2152 Token::Value next = Next(); 2163 Token::Value next = Next();
2153 if (next == Token::IDENTIFIER) { 2164 if (next == Token::IDENTIFIER) {
2154 *is_strict_reserved = false; 2165 *is_strict_reserved = false;
2155 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET || 2166 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET ||
2156 next == Token::STATIC || 2167 next == Token::STATIC || (next == Token::YIELD && !is_generator)) {
2157 (next == Token::YIELD && !this->is_generator())) {
2158 *is_strict_reserved = true; 2168 *is_strict_reserved = true;
2159 } else { 2169 } else {
2160 ReportUnexpectedToken(next); 2170 ReportUnexpectedToken(next);
2161 *ok = false; 2171 *ok = false;
2162 return Traits::EmptyIdentifier(); 2172 return Traits::EmptyIdentifier();
2163 } 2173 }
2164 2174
2165 IdentifierT name = this->GetSymbol(scanner()); 2175 IdentifierT name = this->GetSymbol(scanner());
2166 if (this->IsArguments(name)) scope_->RecordArgumentsUsage(); 2176 if (this->IsArguments(name)) scope_->RecordArgumentsUsage();
2167 return name; 2177 return name;
(...skipping 1321 matching lines...) Expand 10 before | Expand all | Expand 10 after
3489 3499
3490 Consume(Token::FUNCTION); 3500 Consume(Token::FUNCTION);
3491 int function_token_position = position(); 3501 int function_token_position = position();
3492 bool is_generator = Check(Token::MUL); 3502 bool is_generator = Check(Token::MUL);
3493 IdentifierT name = this->EmptyIdentifier(); 3503 IdentifierT name = this->EmptyIdentifier();
3494 bool is_strict_reserved_name = false; 3504 bool is_strict_reserved_name = false;
3495 Scanner::Location function_name_location = Scanner::Location::invalid(); 3505 Scanner::Location function_name_location = Scanner::Location::invalid();
3496 FunctionLiteral::FunctionType function_type = 3506 FunctionLiteral::FunctionType function_type =
3497 FunctionLiteral::ANONYMOUS_EXPRESSION; 3507 FunctionLiteral::ANONYMOUS_EXPRESSION;
3498 if (peek_any_identifier()) { 3508 if (peek_any_identifier()) {
3499 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, 3509 name = ParseIdentifierOrStrictReservedWord(
3500 CHECK_OK); 3510 is_generator, &is_strict_reserved_name, CHECK_OK);
3501 function_name_location = scanner()->location(); 3511 function_name_location = scanner()->location();
3502 function_type = FunctionLiteral::NAMED_EXPRESSION; 3512 function_type = FunctionLiteral::NAMED_EXPRESSION;
3503 } 3513 }
3504 result = this->ParseFunctionLiteral( 3514 result = this->ParseFunctionLiteral(
3505 name, function_name_location, 3515 name, function_name_location,
3506 is_strict_reserved_name ? kFunctionNameIsStrictReserved 3516 is_strict_reserved_name ? kFunctionNameIsStrictReserved
3507 : kFunctionNameValidityUnknown, 3517 : kFunctionNameValidityUnknown,
3508 is_generator ? FunctionKind::kGeneratorFunction 3518 is_generator ? FunctionKind::kGeneratorFunction
3509 : FunctionKind::kNormalFunction, 3519 : FunctionKind::kNormalFunction,
3510 function_token_position, function_type, FunctionLiteral::NORMAL_ARITY, 3520 function_token_position, function_type, FunctionLiteral::NORMAL_ARITY,
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
4240 return; 4250 return;
4241 } 4251 }
4242 has_seen_constructor_ = true; 4252 has_seen_constructor_ = true;
4243 return; 4253 return;
4244 } 4254 }
4245 } 4255 }
4246 } // namespace internal 4256 } // namespace internal
4247 } // namespace v8 4257 } // namespace v8
4248 4258
4249 #endif // V8_PREPARSER_H 4259 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698