| OLD | NEW | 
|---|
| 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_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H | 
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H | 
| 7 | 7 | 
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" | 
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" | 
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" | 
| (...skipping 1696 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1707 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseRegExpLiteral( | 1707 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseRegExpLiteral( | 
| 1708     bool* ok) { | 1708     bool* ok) { | 
| 1709   int pos = peek_position(); | 1709   int pos = peek_position(); | 
| 1710   if (!scanner()->ScanRegExpPattern()) { | 1710   if (!scanner()->ScanRegExpPattern()) { | 
| 1711     Next(); | 1711     Next(); | 
| 1712     ReportMessage(MessageTemplate::kUnterminatedRegExp); | 1712     ReportMessage(MessageTemplate::kUnterminatedRegExp); | 
| 1713     *ok = false; | 1713     *ok = false; | 
| 1714     return impl()->EmptyExpression(); | 1714     return impl()->EmptyExpression(); | 
| 1715   } | 1715   } | 
| 1716 | 1716 | 
| 1717   int literal_index = function_state_->NextMaterializedLiteralIndex(); | 1717   function_state_->NextMaterializedLiteralIndex(); | 
| 1718 | 1718 | 
| 1719   IdentifierT js_pattern = impl()->GetNextSymbol(); | 1719   IdentifierT js_pattern = impl()->GetNextSymbol(); | 
| 1720   Maybe<RegExp::Flags> flags = scanner()->ScanRegExpFlags(); | 1720   Maybe<RegExp::Flags> flags = scanner()->ScanRegExpFlags(); | 
| 1721   if (flags.IsNothing()) { | 1721   if (flags.IsNothing()) { | 
| 1722     Next(); | 1722     Next(); | 
| 1723     ReportMessage(MessageTemplate::kMalformedRegExpFlags); | 1723     ReportMessage(MessageTemplate::kMalformedRegExpFlags); | 
| 1724     *ok = false; | 1724     *ok = false; | 
| 1725     return impl()->EmptyExpression(); | 1725     return impl()->EmptyExpression(); | 
| 1726   } | 1726   } | 
| 1727   int js_flags = flags.FromJust(); | 1727   int js_flags = flags.FromJust(); | 
| 1728   Next(); | 1728   Next(); | 
| 1729   return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); | 1729   return factory()->NewRegExpLiteral(js_pattern, js_flags, pos); | 
| 1730 } | 1730 } | 
| 1731 | 1731 | 
| 1732 template <typename Impl> | 1732 template <typename Impl> | 
| 1733 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 1733 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( | 
| 1734     bool* is_async, bool* ok) { | 1734     bool* is_async, bool* ok) { | 
| 1735   // PrimaryExpression :: | 1735   // PrimaryExpression :: | 
| 1736   //   'this' | 1736   //   'this' | 
| 1737   //   'null' | 1737   //   'null' | 
| 1738   //   'true' | 1738   //   'true' | 
| 1739   //   'false' | 1739   //   'false' | 
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1997       CheckDestructuringElement(elem, beg_pos, scanner()->location().end_pos); | 1997       CheckDestructuringElement(elem, beg_pos, scanner()->location().end_pos); | 
| 1998     } | 1998     } | 
| 1999     values->Add(elem, zone_); | 1999     values->Add(elem, zone_); | 
| 2000     if (peek() != Token::RBRACK) { | 2000     if (peek() != Token::RBRACK) { | 
| 2001       Expect(Token::COMMA, CHECK_OK); | 2001       Expect(Token::COMMA, CHECK_OK); | 
| 2002     } | 2002     } | 
| 2003   } | 2003   } | 
| 2004   Expect(Token::RBRACK, CHECK_OK); | 2004   Expect(Token::RBRACK, CHECK_OK); | 
| 2005 | 2005 | 
| 2006   // Update the scope information before the pre-parsing bailout. | 2006   // Update the scope information before the pre-parsing bailout. | 
| 2007   int literal_index = function_state_->NextMaterializedLiteralIndex(); | 2007   function_state_->NextMaterializedLiteralIndex(); | 
| 2008 | 2008 | 
| 2009   ExpressionT result = factory()->NewArrayLiteral(values, first_spread_index, | 2009   ExpressionT result = | 
| 2010                                                   literal_index, pos); | 2010       factory()->NewArrayLiteral(values, first_spread_index, pos); | 
| 2011   if (first_spread_index >= 0) { | 2011   if (first_spread_index >= 0) { | 
| 2012     result = factory()->NewRewritableExpression(result); | 2012     result = factory()->NewRewritableExpression(result); | 
| 2013     impl()->QueueNonPatternForRewriting(result, ok); | 2013     impl()->QueueNonPatternForRewriting(result, ok); | 
| 2014     if (!*ok) { | 2014     if (!*ok) { | 
| 2015       // If the non-pattern rewriting mechanism is used in the future for | 2015       // If the non-pattern rewriting mechanism is used in the future for | 
| 2016       // rewriting other things than spreads, this error message will have | 2016       // rewriting other things than spreads, this error message will have | 
| 2017       // to change.  Also, this error message will never appear while pre- | 2017       // to change.  Also, this error message will never appear while pre- | 
| 2018       // parsing (this is OK, as it is an implementation limitation). | 2018       // parsing (this is OK, as it is an implementation limitation). | 
| 2019       ReportMessage(MessageTemplate::kTooManySpreads); | 2019       ReportMessage(MessageTemplate::kTooManySpreads); | 
| 2020       return impl()->EmptyExpression(); | 2020       return impl()->EmptyExpression(); | 
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2598     if (peek() != Token::RBRACE) { | 2598     if (peek() != Token::RBRACE) { | 
| 2599       // Need {} because of the CHECK_OK macro. | 2599       // Need {} because of the CHECK_OK macro. | 
| 2600       Expect(Token::COMMA, CHECK_OK); | 2600       Expect(Token::COMMA, CHECK_OK); | 
| 2601     } | 2601     } | 
| 2602 | 2602 | 
| 2603     if (fni_ != nullptr) fni_->Infer(); | 2603     if (fni_ != nullptr) fni_->Infer(); | 
| 2604   } | 2604   } | 
| 2605   Expect(Token::RBRACE, CHECK_OK); | 2605   Expect(Token::RBRACE, CHECK_OK); | 
| 2606 | 2606 | 
| 2607   // Computation of literal_index must happen before pre parse bailout. | 2607   // Computation of literal_index must happen before pre parse bailout. | 
| 2608   int literal_index = function_state_->NextMaterializedLiteralIndex(); | 2608   function_state_->NextMaterializedLiteralIndex(); | 
| 2609 | 2609 | 
| 2610   // In pattern rewriter, we rewrite rest property to call out to a | 2610   // In pattern rewriter, we rewrite rest property to call out to a | 
| 2611   // runtime function passing all the other properties as arguments to | 2611   // runtime function passing all the other properties as arguments to | 
| 2612   // this runtime function. Here, we make sure that the number of | 2612   // this runtime function. Here, we make sure that the number of | 
| 2613   // properties is less than number of arguments allowed for a runtime | 2613   // properties is less than number of arguments allowed for a runtime | 
| 2614   // call. | 2614   // call. | 
| 2615   if (has_rest_property && properties->length() > Code::kMaxArguments) { | 2615   if (has_rest_property && properties->length() > Code::kMaxArguments) { | 
| 2616     this->classifier()->RecordPatternError(Scanner::Location(pos, position()), | 2616     this->classifier()->RecordPatternError(Scanner::Location(pos, position()), | 
| 2617                                            MessageTemplate::kTooManyArguments); | 2617                                            MessageTemplate::kTooManyArguments); | 
| 2618   } | 2618   } | 
| 2619 | 2619 | 
| 2620   return factory()->NewObjectLiteral(properties, literal_index, | 2620   return factory()->NewObjectLiteral( | 
| 2621                                      number_of_boilerplate_properties, pos, | 2621       properties, number_of_boilerplate_properties, pos, has_rest_property); | 
| 2622                                      has_rest_property); |  | 
| 2623 } | 2622 } | 
| 2624 | 2623 | 
| 2625 template <typename Impl> | 2624 template <typename Impl> | 
| 2626 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( | 2625 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( | 
| 2627     Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { | 2626     Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { | 
| 2628   // Arguments :: | 2627   // Arguments :: | 
| 2629   //   '(' (AssignmentExpression)*[','] ')' | 2628   //   '(' (AssignmentExpression)*[','] ')' | 
| 2630 | 2629 | 
| 2631   Scanner::Location spread_arg = Scanner::Location::invalid(); | 2630   Scanner::Location spread_arg = Scanner::Location::invalid(); | 
| 2632   ExpressionListT result = impl()->NewExpressionList(4); | 2631   ExpressionListT result = impl()->NewExpressionList(4); | 
| (...skipping 1520 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4153       can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables(); | 4152       can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables(); | 
| 4154   bool should_be_used_once_hint = false; | 4153   bool should_be_used_once_hint = false; | 
| 4155   bool has_braces = true; | 4154   bool has_braces = true; | 
| 4156   { | 4155   { | 
| 4157     FunctionState function_state(&function_state_, &scope_state_, | 4156     FunctionState function_state(&function_state_, &scope_state_, | 
| 4158                                  formal_parameters.scope); | 4157                                  formal_parameters.scope); | 
| 4159 | 4158 | 
| 4160     function_state.SkipMaterializedLiterals( | 4159     function_state.SkipMaterializedLiterals( | 
| 4161         formal_parameters.materialized_literals_count); | 4160         formal_parameters.materialized_literals_count); | 
| 4162 | 4161 | 
| 4163     impl()->ReindexLiterals(formal_parameters); |  | 
| 4164 |  | 
| 4165     Expect(Token::ARROW, CHECK_OK); | 4162     Expect(Token::ARROW, CHECK_OK); | 
| 4166 | 4163 | 
| 4167     if (peek() == Token::LBRACE) { | 4164     if (peek() == Token::LBRACE) { | 
| 4168       // Multiple statement body | 4165       // Multiple statement body | 
| 4169       DCHECK_EQ(scope(), formal_parameters.scope); | 4166       DCHECK_EQ(scope(), formal_parameters.scope); | 
| 4170       if (is_lazy_top_level_function) { | 4167       if (is_lazy_top_level_function) { | 
| 4171         // FIXME(marja): Arrow function parameters will be parsed even if the | 4168         // FIXME(marja): Arrow function parameters will be parsed even if the | 
| 4172         // body is preparsed; move relevant parts of parameter handling to | 4169         // body is preparsed; move relevant parts of parameter handling to | 
| 4173         // simulate consistent parameter handling. | 4170         // simulate consistent parameter handling. | 
| 4174         Scanner::BookmarkScope bookmark(scanner()); | 4171         Scanner::BookmarkScope bookmark(scanner()); | 
| (...skipping 1551 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5726     return; | 5723     return; | 
| 5727   } | 5724   } | 
| 5728 } | 5725 } | 
| 5729 | 5726 | 
| 5730 #undef CHECK_OK_VOID | 5727 #undef CHECK_OK_VOID | 
| 5731 | 5728 | 
| 5732 }  // namespace internal | 5729 }  // namespace internal | 
| 5733 }  // namespace v8 | 5730 }  // namespace v8 | 
| 5734 | 5731 | 
| 5735 #endif  // V8_PARSING_PARSER_BASE_H | 5732 #endif  // V8_PARSING_PARSER_BASE_H | 
| OLD | NEW | 
|---|