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

Side by Side Diff: src/parsing/parser-base.h

Issue 1708193003: Reduce the memory footprint of expression classifiers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Introduce implementation-limit error (too many non-pattern rewrites) Created 4 years, 6 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.cc ('k') | src/parsing/preparser.h » ('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_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/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/hashmap.h" 10 #include "src/hashmap.h"
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 DCHECK(is_resumable()); 378 DCHECK(is_resumable());
379 generator_object_variable_ = variable; 379 generator_object_variable_ = variable;
380 } 380 }
381 typename Traits::Type::GeneratorVariable* generator_object_variable() 381 typename Traits::Type::GeneratorVariable* generator_object_variable()
382 const { 382 const {
383 return generator_object_variable_; 383 return generator_object_variable_;
384 } 384 }
385 385
386 typename Traits::Type::Factory* factory() { return factory_; } 386 typename Traits::Type::Factory* factory() { return factory_; }
387 387
388 const List<DestructuringAssignment>& destructuring_assignments_to_rewrite() 388 const ZoneList<DestructuringAssignment>&
389 const { 389 destructuring_assignments_to_rewrite() const {
390 return destructuring_assignments_to_rewrite_; 390 return destructuring_assignments_to_rewrite_;
391 } 391 }
392 392
393 TailCallExpressionList& tail_call_expressions() { 393 TailCallExpressionList& tail_call_expressions() {
394 return tail_call_expressions_; 394 return tail_call_expressions_;
395 } 395 }
396 void AddImplicitTailCallExpression(ExpressionT expression) { 396 void AddImplicitTailCallExpression(ExpressionT expression) {
397 if (return_expr_context() == 397 if (return_expr_context() ==
398 ReturnExprContext::kInsideValidReturnStatement) { 398 ReturnExprContext::kInsideValidReturnStatement) {
399 tail_call_expressions_.AddImplicitTailCall(expression); 399 tail_call_expressions_.AddImplicitTailCall(expression);
400 } 400 }
401 } 401 }
402 void AddExplicitTailCallExpression(ExpressionT expression, 402 void AddExplicitTailCallExpression(ExpressionT expression,
403 const Scanner::Location& loc) { 403 const Scanner::Location& loc) {
404 DCHECK(expression->IsCall()); 404 DCHECK(expression->IsCall());
405 if (return_expr_context() == 405 if (return_expr_context() ==
406 ReturnExprContext::kInsideValidReturnStatement) { 406 ReturnExprContext::kInsideValidReturnStatement) {
407 tail_call_expressions_.AddExplicitTailCall(expression, loc); 407 tail_call_expressions_.AddExplicitTailCall(expression, loc);
408 } 408 }
409 } 409 }
410 410
411 ZoneList<typename ExpressionClassifier::Error>* GetReportedErrorList() {
412 return &reported_errors_;
413 }
414
411 ReturnExprContext return_expr_context() const { 415 ReturnExprContext return_expr_context() const {
412 return return_expr_context_; 416 return return_expr_context_;
413 } 417 }
414 void set_return_expr_context(ReturnExprContext context) { 418 void set_return_expr_context(ReturnExprContext context) {
415 return_expr_context_ = context; 419 return_expr_context_ = context;
416 } 420 }
417 421
418 ZoneList<ExpressionT>* non_patterns_to_rewrite() { 422 ZoneList<ExpressionT>* non_patterns_to_rewrite() {
419 return &non_patterns_to_rewrite_; 423 return &non_patterns_to_rewrite_;
420 } 424 }
421 425
422 void next_function_is_parenthesized(bool parenthesized) { 426 void next_function_is_parenthesized(bool parenthesized) {
423 next_function_is_parenthesized_ = parenthesized; 427 next_function_is_parenthesized_ = parenthesized;
424 } 428 }
425 429
426 bool this_function_is_parenthesized() const { 430 bool this_function_is_parenthesized() const {
427 return this_function_is_parenthesized_; 431 return this_function_is_parenthesized_;
428 } 432 }
429 433
430 private: 434 private:
431 void AddDestructuringAssignment(DestructuringAssignment pair) { 435 void AddDestructuringAssignment(DestructuringAssignment pair) {
432 destructuring_assignments_to_rewrite_.Add(pair); 436 destructuring_assignments_to_rewrite_.Add(pair, (*scope_stack_)->zone());
433 } 437 }
434 438
435 V8_INLINE Scope* scope() { return *scope_stack_; } 439 V8_INLINE Scope* scope() { return *scope_stack_; }
436 440
437 void AddNonPatternForRewriting(ExpressionT expr) { 441 void AddNonPatternForRewriting(ExpressionT expr, bool* ok) {
438 non_patterns_to_rewrite_.Add(expr, (*scope_stack_)->zone()); 442 non_patterns_to_rewrite_.Add(expr, (*scope_stack_)->zone());
443 if (non_patterns_to_rewrite_.length() >=
444 std::numeric_limits<uint16_t>::max())
445 *ok = false;
439 } 446 }
440 447
441 // Used to assign an index to each literal that needs materialization in 448 // Used to assign an index to each literal that needs materialization in
442 // the function. Includes regexp literals, and boilerplate for object and 449 // the function. Includes regexp literals, and boilerplate for object and
443 // array literals. 450 // array literals.
444 int next_materialized_literal_index_; 451 int next_materialized_literal_index_;
445 452
446 // Properties count estimation. 453 // Properties count estimation.
447 int expected_property_count_; 454 int expected_property_count_;
448 455
(...skipping 10 matching lines...) Expand all
459 // For generators, this variable may hold the generator object. It variable 466 // For generators, this variable may hold the generator object. It variable
460 // is used by yield expressions and return statements. It is not necessary 467 // is used by yield expressions and return statements. It is not necessary
461 // for generator functions to have this variable set. 468 // for generator functions to have this variable set.
462 Variable* generator_object_variable_; 469 Variable* generator_object_variable_;
463 470
464 FunctionState** function_state_stack_; 471 FunctionState** function_state_stack_;
465 FunctionState* outer_function_state_; 472 FunctionState* outer_function_state_;
466 Scope** scope_stack_; 473 Scope** scope_stack_;
467 Scope* outer_scope_; 474 Scope* outer_scope_;
468 475
469 List<DestructuringAssignment> destructuring_assignments_to_rewrite_; 476 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_;
470 TailCallExpressionList tail_call_expressions_; 477 TailCallExpressionList tail_call_expressions_;
471 ReturnExprContext return_expr_context_; 478 ReturnExprContext return_expr_context_;
472 ZoneList<ExpressionT> non_patterns_to_rewrite_; 479 ZoneList<ExpressionT> non_patterns_to_rewrite_;
473 480
481 ZoneList<typename ExpressionClassifier::Error> reported_errors_;
482
474 typename Traits::Type::Factory* factory_; 483 typename Traits::Type::Factory* factory_;
475 484
476 // If true, the next (and immediately following) function literal is 485 // If true, the next (and immediately following) function literal is
477 // preceded by a parenthesis. 486 // preceded by a parenthesis.
478 bool next_function_is_parenthesized_; 487 bool next_function_is_parenthesized_;
479 488
480 // The value of the parents' next_function_is_parenthesized_, as it applies 489 // The value of the parents' next_function_is_parenthesized_, as it applies
481 // to this function. Filled in by constructor. 490 // to this function. Filled in by constructor.
482 bool this_function_is_parenthesized_; 491 bool this_function_is_parenthesized_;
483 492
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 expected_property_count_(0), 1195 expected_property_count_(0),
1187 this_location_(Scanner::Location::invalid()), 1196 this_location_(Scanner::Location::invalid()),
1188 return_location_(Scanner::Location::invalid()), 1197 return_location_(Scanner::Location::invalid()),
1189 super_location_(Scanner::Location::invalid()), 1198 super_location_(Scanner::Location::invalid()),
1190 kind_(kind), 1199 kind_(kind),
1191 generator_object_variable_(NULL), 1200 generator_object_variable_(NULL),
1192 function_state_stack_(function_state_stack), 1201 function_state_stack_(function_state_stack),
1193 outer_function_state_(*function_state_stack), 1202 outer_function_state_(*function_state_stack),
1194 scope_stack_(scope_stack), 1203 scope_stack_(scope_stack),
1195 outer_scope_(*scope_stack), 1204 outer_scope_(*scope_stack),
1205 destructuring_assignments_to_rewrite_(16, scope->zone()),
1196 tail_call_expressions_(scope->zone()), 1206 tail_call_expressions_(scope->zone()),
1197 return_expr_context_(ReturnExprContext::kInsideValidBlock), 1207 return_expr_context_(ReturnExprContext::kInsideValidBlock),
1198 non_patterns_to_rewrite_(0, scope->zone()), 1208 non_patterns_to_rewrite_(0, scope->zone()),
1209 reported_errors_(16, scope->zone()),
1199 factory_(factory), 1210 factory_(factory),
1200 next_function_is_parenthesized_(false), 1211 next_function_is_parenthesized_(false),
1201 this_function_is_parenthesized_(false) { 1212 this_function_is_parenthesized_(false) {
1202 *scope_stack_ = scope; 1213 *scope_stack_ = scope;
1203 *function_state_stack = this; 1214 *function_state_stack = this;
1204 if (outer_function_state_) { 1215 if (outer_function_state_) {
1205 this_function_is_parenthesized_ = 1216 this_function_is_parenthesized_ =
1206 outer_function_state_->next_function_is_parenthesized_; 1217 outer_function_state_->next_function_is_parenthesized_;
1207 outer_function_state_->next_function_is_parenthesized_ = false; 1218 outer_function_state_->next_function_is_parenthesized_ = false;
1208 } 1219 }
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 1556
1546 case Token::LBRACE: 1557 case Token::LBRACE:
1547 return this->ParseObjectLiteral(classifier, ok); 1558 return this->ParseObjectLiteral(classifier, ok);
1548 1559
1549 case Token::LPAREN: { 1560 case Token::LPAREN: {
1550 // Arrow function formal parameters are either a single identifier or a 1561 // Arrow function formal parameters are either a single identifier or a
1551 // list of BindingPattern productions enclosed in parentheses. 1562 // list of BindingPattern productions enclosed in parentheses.
1552 // Parentheses are not valid on the LHS of a BindingPattern, so we use the 1563 // Parentheses are not valid on the LHS of a BindingPattern, so we use the
1553 // is_valid_binding_pattern() check to detect multiple levels of 1564 // is_valid_binding_pattern() check to detect multiple levels of
1554 // parenthesization. 1565 // parenthesization.
1555 if (!classifier->is_valid_binding_pattern()) { 1566 bool pattern_error = !classifier->is_valid_binding_pattern();
1556 ArrowFormalParametersUnexpectedToken(classifier);
1557 }
1558 classifier->RecordPatternError(scanner()->peek_location(), 1567 classifier->RecordPatternError(scanner()->peek_location(),
1559 MessageTemplate::kUnexpectedToken, 1568 MessageTemplate::kUnexpectedToken,
1560 Token::String(Token::LPAREN)); 1569 Token::String(Token::LPAREN));
1570 if (pattern_error) ArrowFormalParametersUnexpectedToken(classifier);
1561 Consume(Token::LPAREN); 1571 Consume(Token::LPAREN);
1562 if (Check(Token::RPAREN)) { 1572 if (Check(Token::RPAREN)) {
1563 // ()=>x. The continuation that looks for the => is in 1573 // ()=>x. The continuation that looks for the => is in
1564 // ParseAssignmentExpression. 1574 // ParseAssignmentExpression.
1565 classifier->RecordExpressionError(scanner()->location(), 1575 classifier->RecordExpressionError(scanner()->location(),
1566 MessageTemplate::kUnexpectedToken, 1576 MessageTemplate::kUnexpectedToken,
1567 Token::String(Token::RPAREN)); 1577 Token::String(Token::RPAREN));
1568 return factory()->NewEmptyParentheses(beg_pos); 1578 return factory()->NewEmptyParentheses(beg_pos);
1569 } else if (Check(Token::ELLIPSIS)) { 1579 } else if (Check(Token::ELLIPSIS)) {
1570 // (...x)=>x. The continuation that looks for the => is in 1580 // (...x)=>x. The continuation that looks for the => is in
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1683 if (peek() == Token::ELLIPSIS) { 1693 if (peek() == Token::ELLIPSIS) {
1684 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only 1694 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only
1685 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a 1695 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a
1686 // valid expression or binding pattern. 1696 // valid expression or binding pattern.
1687 ExpressionUnexpectedToken(classifier); 1697 ExpressionUnexpectedToken(classifier);
1688 BindingPatternUnexpectedToken(classifier); 1698 BindingPatternUnexpectedToken(classifier);
1689 Consume(Token::ELLIPSIS); 1699 Consume(Token::ELLIPSIS);
1690 seen_rest = is_rest = true; 1700 seen_rest = is_rest = true;
1691 } 1701 }
1692 int pos = position(), expr_pos = peek_position(); 1702 int pos = position(), expr_pos = peek_position();
1703 ExpressionClassifier binding_classifier(this);
1693 ExpressionT right = this->ParseAssignmentExpression( 1704 ExpressionT right = this->ParseAssignmentExpression(
1694 accept_IN, &binding_classifier, CHECK_OK); 1705 accept_IN, &binding_classifier, CHECK_OK);
1695 classifier->Accumulate(&binding_classifier, 1706 classifier->Accumulate(&binding_classifier,
1696 ExpressionClassifier::AllProductions); 1707 ExpressionClassifier::AllProductions);
1697 if (is_rest) { 1708 if (is_rest) {
1698 if (!this->IsIdentifier(right) && !IsValidPattern(right)) { 1709 if (!this->IsIdentifier(right) && !IsValidPattern(right)) {
1699 classifier->RecordArrowFormalParametersError( 1710 classifier->RecordArrowFormalParametersError(
1700 Scanner::Location(pos, scanner()->location().end_pos), 1711 Scanner::Location(pos, scanner()->location().end_pos),
1701 MessageTemplate::kInvalidRestParameter); 1712 MessageTemplate::kInvalidRestParameter);
1702 } 1713 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 } 1781 }
1771 Expect(Token::RBRACK, CHECK_OK); 1782 Expect(Token::RBRACK, CHECK_OK);
1772 1783
1773 // Update the scope information before the pre-parsing bailout. 1784 // Update the scope information before the pre-parsing bailout.
1774 int literal_index = function_state_->NextMaterializedLiteralIndex(); 1785 int literal_index = function_state_->NextMaterializedLiteralIndex();
1775 1786
1776 ExpressionT result = factory()->NewArrayLiteral(values, first_spread_index, 1787 ExpressionT result = factory()->NewArrayLiteral(values, first_spread_index,
1777 literal_index, pos); 1788 literal_index, pos);
1778 if (first_spread_index >= 0) { 1789 if (first_spread_index >= 0) {
1779 result = factory()->NewRewritableExpression(result); 1790 result = factory()->NewRewritableExpression(result);
1780 Traits::QueueNonPatternForRewriting(result); 1791 Traits::QueueNonPatternForRewriting(result, ok);
1792 if (!*ok) {
1793 // If the non-pattern rewriting mechanism is used in the future for
1794 // rewriting other things than spreads, this error message will have
1795 // to change. Also, this error message will never appear while pre-
1796 // parsing (this is OK, as it is an implementation limitation).
1797 ReportMessage(MessageTemplate::kTooManySpreads);
1798 return this->EmptyExpression();
1799 }
1781 } 1800 }
1782 return result; 1801 return result;
1783 } 1802 }
1784 1803
1785 template <class Traits> 1804 template <class Traits>
1786 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName( 1805 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName(
1787 IdentifierT* name, bool* is_get, bool* is_set, bool* is_await, 1806 IdentifierT* name, bool* is_get, bool* is_set, bool* is_await,
1788 bool* is_computed_name, ExpressionClassifier* classifier, bool* ok) { 1807 bool* is_computed_name, ExpressionClassifier* classifier, bool* ok) {
1789 Token::Value token = peek(); 1808 Token::Value token = peek();
1790 int pos = peek_position(); 1809 int pos = peek_position();
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
2217 2236
2218 if (is_async && peek_any_identifier() && PeekAhead() == Token::ARROW) { 2237 if (is_async && peek_any_identifier() && PeekAhead() == Token::ARROW) {
2219 // async Identifier => AsyncConciseBody 2238 // async Identifier => AsyncConciseBody
2220 IdentifierT name = 2239 IdentifierT name =
2221 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); 2240 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK);
2222 expression = this->ExpressionFromIdentifier( 2241 expression = this->ExpressionFromIdentifier(
2223 name, position(), scanner()->location().end_pos, scope_, factory()); 2242 name, position(), scanner()->location().end_pos, scope_, factory());
2224 } 2243 }
2225 2244
2226 if (peek() == Token::ARROW) { 2245 if (peek() == Token::ARROW) {
2227 classifier->RecordPatternError(scanner()->peek_location(), 2246 Scanner::Location arrow_loc = scanner()->peek_location();
2228 MessageTemplate::kUnexpectedToken,
2229 Token::String(Token::ARROW));
2230 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, 2247 ValidateArrowFormalParameters(&arrow_formals_classifier, expression,
2231 parenthesized_formals, is_async, CHECK_OK); 2248 parenthesized_formals, is_async, CHECK_OK);
2232 // This reads strangely, but is correct: it checks whether any 2249 // This reads strangely, but is correct: it checks whether any
2233 // sub-expression of the parameter list failed to be a valid formal 2250 // sub-expression of the parameter list failed to be a valid formal
2234 // parameter initializer. Since YieldExpressions are banned anywhere 2251 // parameter initializer. Since YieldExpressions are banned anywhere
2235 // in an arrow parameter list, this is correct. 2252 // in an arrow parameter list, this is correct.
2236 // TODO(adamk): Rename "FormalParameterInitializerError" to refer to 2253 // TODO(adamk): Rename "FormalParameterInitializerError" to refer to
2237 // "YieldExpression", which is its only use. 2254 // "YieldExpression", which is its only use.
2238 ValidateFormalParameterInitializer(&arrow_formals_classifier, ok); 2255 ValidateFormalParameterInitializer(&arrow_formals_classifier, ok);
2239 2256
(...skipping 16 matching lines...) Expand all
2256 scope->set_start_position(lhs_beg_pos); 2273 scope->set_start_position(lhs_beg_pos);
2257 Scanner::Location duplicate_loc = Scanner::Location::invalid(); 2274 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2258 this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc, 2275 this->ParseArrowFunctionFormalParameterList(&parameters, expression, loc,
2259 &duplicate_loc, CHECK_OK); 2276 &duplicate_loc, CHECK_OK);
2260 if (duplicate_loc.IsValid()) { 2277 if (duplicate_loc.IsValid()) {
2261 arrow_formals_classifier.RecordDuplicateFormalParameterError( 2278 arrow_formals_classifier.RecordDuplicateFormalParameterError(
2262 duplicate_loc); 2279 duplicate_loc);
2263 } 2280 }
2264 expression = this->ParseArrowFunctionLiteral( 2281 expression = this->ParseArrowFunctionLiteral(
2265 accept_IN, parameters, is_async, arrow_formals_classifier, CHECK_OK); 2282 accept_IN, parameters, is_async, arrow_formals_classifier, CHECK_OK);
2283 arrow_formals_classifier.Discard();
2284 classifier->RecordPatternError(arrow_loc,
2285 MessageTemplate::kUnexpectedToken,
2286 Token::String(Token::ARROW));
2266 2287
2267 if (fni_ != nullptr) fni_->Infer(); 2288 if (fni_ != nullptr) fni_->Infer();
2268 2289
2269 return expression; 2290 return expression;
2270 } 2291 }
2271 2292
2272 if (this->IsValidReferenceExpression(expression)) { 2293 if (this->IsValidReferenceExpression(expression)) {
2273 arrow_formals_classifier.ForgiveAssignmentPatternError(); 2294 arrow_formals_classifier.ForgiveAssignmentPatternError();
2274 } 2295 }
2275 2296
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
2495 // LogicalOrExpression 2516 // LogicalOrExpression
2496 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression 2517 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
2497 2518
2498 int pos = peek_position(); 2519 int pos = peek_position();
2499 // We start using the binary expression parser for prec >= 4 only! 2520 // We start using the binary expression parser for prec >= 4 only!
2500 ExpressionT expression = 2521 ExpressionT expression =
2501 this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK); 2522 this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK);
2502 if (peek() != Token::CONDITIONAL) return expression; 2523 if (peek() != Token::CONDITIONAL) return expression;
2503 CheckNoTailCallExpressions(classifier, CHECK_OK); 2524 CheckNoTailCallExpressions(classifier, CHECK_OK);
2504 Traits::RewriteNonPattern(classifier, CHECK_OK); 2525 Traits::RewriteNonPattern(classifier, CHECK_OK);
2526 BindingPatternUnexpectedToken(classifier);
2505 ArrowFormalParametersUnexpectedToken(classifier); 2527 ArrowFormalParametersUnexpectedToken(classifier);
2506 BindingPatternUnexpectedToken(classifier);
2507 Consume(Token::CONDITIONAL); 2528 Consume(Token::CONDITIONAL);
2508 // In parsing the first assignment expression in conditional 2529 // In parsing the first assignment expression in conditional
2509 // expressions we always accept the 'in' keyword; see ECMA-262, 2530 // expressions we always accept the 'in' keyword; see ECMA-262,
2510 // section 11.12, page 58. 2531 // section 11.12, page 58.
2511 ExpressionT left = ParseAssignmentExpression(true, classifier, CHECK_OK); 2532 ExpressionT left = ParseAssignmentExpression(true, classifier, CHECK_OK);
2512 Traits::RewriteNonPattern(classifier, CHECK_OK); 2533 Traits::RewriteNonPattern(classifier, CHECK_OK);
2513 Expect(Token::COLON, CHECK_OK); 2534 Expect(Token::COLON, CHECK_OK);
2514 ExpressionT right = 2535 ExpressionT right =
2515 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK); 2536 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK);
2516 Traits::RewriteNonPattern(classifier, CHECK_OK); 2537 Traits::RewriteNonPattern(classifier, CHECK_OK);
(...skipping 1076 matching lines...) Expand 10 before | Expand all | Expand 10 after
3593 has_seen_constructor_ = true; 3614 has_seen_constructor_ = true;
3594 return; 3615 return;
3595 } 3616 }
3596 } 3617 }
3597 3618
3598 3619
3599 } // namespace internal 3620 } // namespace internal
3600 } // namespace v8 3621 } // namespace v8
3601 3622
3602 #endif // V8_PARSING_PARSER_BASE_H 3623 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698