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

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

Issue 2509143003: Treat a '!' preceding a function literal as eager-compile hint. (Closed)
Patch Set: Created 4 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 | « src/parsing/parser.cc ('k') | test/cctest/BUILD.gn » ('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/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 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 } 453 }
454 454
455 ZoneList<ExpressionT>* non_patterns_to_rewrite() { 455 ZoneList<ExpressionT>* non_patterns_to_rewrite() {
456 return &non_patterns_to_rewrite_; 456 return &non_patterns_to_rewrite_;
457 } 457 }
458 458
459 bool next_function_is_parenthesized() const { 459 bool next_function_is_parenthesized() const {
460 return next_function_is_parenthesized_; 460 return next_function_is_parenthesized_;
461 } 461 }
462 462
463 bool this_function_is_parenthesized() const {
464 return this_function_is_parenthesized_;
465 }
466
463 void set_next_function_is_parenthesized(bool parenthesized) { 467 void set_next_function_is_parenthesized(bool parenthesized) {
464 next_function_is_parenthesized_ = parenthesized; 468 next_function_is_parenthesized_ = parenthesized;
465 } 469 }
466 470
467 bool this_function_is_parenthesized() const { 471 bool next_function_is_exclaimed() const {
468 return this_function_is_parenthesized_; 472 return next_function_is_exclaimed_;
473 }
474
475 bool this_function_is_exclaimed() const {
476 return this_function_is_exclaimed_;
477 }
478
479 void set_next_function_is_exclaimed(bool exclaimed) {
480 next_function_is_exclaimed_ = exclaimed;
469 } 481 }
470 482
471 private: 483 private:
472 void AddDestructuringAssignment(DestructuringAssignment pair) { 484 void AddDestructuringAssignment(DestructuringAssignment pair) {
473 destructuring_assignments_to_rewrite_.Add(pair, this->zone()); 485 destructuring_assignments_to_rewrite_.Add(pair, this->zone());
474 } 486 }
475 487
476 void AddNonPatternForRewriting(ExpressionT expr, bool* ok) { 488 void AddNonPatternForRewriting(ExpressionT expr, bool* ok) {
477 non_patterns_to_rewrite_.Add(expr, this->zone()); 489 non_patterns_to_rewrite_.Add(expr, this->zone());
478 if (non_patterns_to_rewrite_.length() >= 490 if (non_patterns_to_rewrite_.length() >=
(...skipping 21 matching lines...) Expand all
500 FunctionState* outer_function_state_; 512 FunctionState* outer_function_state_;
501 513
502 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_; 514 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_;
503 TailCallExpressionList tail_call_expressions_; 515 TailCallExpressionList tail_call_expressions_;
504 ReturnExprContext return_expr_context_; 516 ReturnExprContext return_expr_context_;
505 ZoneList<ExpressionT> non_patterns_to_rewrite_; 517 ZoneList<ExpressionT> non_patterns_to_rewrite_;
506 518
507 ZoneList<typename ExpressionClassifier::Error> reported_errors_; 519 ZoneList<typename ExpressionClassifier::Error> reported_errors_;
508 520
509 // If true, the next (and immediately following) function literal is 521 // If true, the next (and immediately following) function literal is
510 // preceded by a parenthesis. 522 // preceded by a parenthesis / exclamation mark.
511 bool next_function_is_parenthesized_; 523 bool next_function_is_parenthesized_;
524 bool next_function_is_exclaimed_;
512 525
513 // The value of the parents' next_function_is_parenthesized_, as it applies 526 // The value of the parents' next_function_is_*_, as it applies
514 // to this function. Filled in by constructor. 527 // to this function. Filled in by constructor.
515 bool this_function_is_parenthesized_; 528 bool this_function_is_parenthesized_;
529 bool this_function_is_exclaimed_;
516 530
517 friend Impl; 531 friend Impl;
518 friend class Checkpoint; 532 friend class Checkpoint;
519 }; 533 };
520 534
521 // This scope sets current ReturnExprContext to given value. 535 // This scope sets current ReturnExprContext to given value.
522 class ReturnExprScope { 536 class ReturnExprScope {
523 public: 537 public:
524 explicit ReturnExprScope(FunctionState* function_state, 538 explicit ReturnExprScope(FunctionState* function_state,
525 ReturnExprContext return_expr_context) 539 ReturnExprContext return_expr_context)
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 generator_object_variable_(nullptr), 1471 generator_object_variable_(nullptr),
1458 promise_variable_(nullptr), 1472 promise_variable_(nullptr),
1459 function_state_stack_(function_state_stack), 1473 function_state_stack_(function_state_stack),
1460 outer_function_state_(*function_state_stack), 1474 outer_function_state_(*function_state_stack),
1461 destructuring_assignments_to_rewrite_(16, scope->zone()), 1475 destructuring_assignments_to_rewrite_(16, scope->zone()),
1462 tail_call_expressions_(scope->zone()), 1476 tail_call_expressions_(scope->zone()),
1463 return_expr_context_(ReturnExprContext::kInsideValidBlock), 1477 return_expr_context_(ReturnExprContext::kInsideValidBlock),
1464 non_patterns_to_rewrite_(0, scope->zone()), 1478 non_patterns_to_rewrite_(0, scope->zone()),
1465 reported_errors_(16, scope->zone()), 1479 reported_errors_(16, scope->zone()),
1466 next_function_is_parenthesized_(false), 1480 next_function_is_parenthesized_(false),
1467 this_function_is_parenthesized_(false) { 1481 next_function_is_exclaimed_(false),
1482 this_function_is_parenthesized_(false),
1483 this_function_is_exclaimed_(false) {
1468 *function_state_stack = this; 1484 *function_state_stack = this;
1469 if (outer_function_state_) { 1485 if (outer_function_state_) {
1470 this_function_is_parenthesized_ = 1486 this_function_is_parenthesized_ =
1471 outer_function_state_->next_function_is_parenthesized_; 1487 outer_function_state_->next_function_is_parenthesized_;
1472 outer_function_state_->next_function_is_parenthesized_ = false; 1488 outer_function_state_->next_function_is_parenthesized_ = false;
1489 this_function_is_exclaimed_ =
1490 outer_function_state_->next_function_is_exclaimed_;
1491 outer_function_state_->next_function_is_exclaimed_ = false;
vogelheim 2016/11/17 12:09:48 self-nitpick: :) All this flag handling is rather
1473 } 1492 }
1474 } 1493 }
1475 1494
1476 template <typename Impl> 1495 template <typename Impl>
1477 ParserBase<Impl>::FunctionState::~FunctionState() { 1496 ParserBase<Impl>::FunctionState::~FunctionState() {
1478 *function_state_stack_ = outer_function_state_; 1497 *function_state_stack_ = outer_function_state_;
1479 } 1498 }
1480 1499
1481 template <typename Impl> 1500 template <typename Impl>
1482 void ParserBase<Impl>::GetUnexpectedTokenMessage( 1501 void ParserBase<Impl>::GetUnexpectedTokenMessage(
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after
2934 // '!' UnaryExpression 2953 // '!' UnaryExpression
2935 // [+Await] AwaitExpression[?Yield] 2954 // [+Await] AwaitExpression[?Yield]
2936 2955
2937 Token::Value op = peek(); 2956 Token::Value op = peek();
2938 if (Token::IsUnaryOp(op)) { 2957 if (Token::IsUnaryOp(op)) {
2939 BindingPatternUnexpectedToken(); 2958 BindingPatternUnexpectedToken();
2940 ArrowFormalParametersUnexpectedToken(); 2959 ArrowFormalParametersUnexpectedToken();
2941 2960
2942 op = Next(); 2961 op = Next();
2943 int pos = position(); 2962 int pos = position();
2963
2964 // Record occurrence of "! function ..."
2965 function_state_->set_next_function_is_exclaimed(op == Token::NOT &&
2966 peek() == Token::FUNCTION);
2967
2944 ExpressionT expression = ParseUnaryExpression(CHECK_OK); 2968 ExpressionT expression = ParseUnaryExpression(CHECK_OK);
2945 impl()->RewriteNonPattern(CHECK_OK); 2969 impl()->RewriteNonPattern(CHECK_OK);
2946 2970
2947 if (op == Token::DELETE && is_strict(language_mode())) { 2971 if (op == Token::DELETE && is_strict(language_mode())) {
2948 if (impl()->IsIdentifier(expression)) { 2972 if (impl()->IsIdentifier(expression)) {
2949 // "delete identifier" is a syntax error in strict mode. 2973 // "delete identifier" is a syntax error in strict mode.
2950 ReportMessage(MessageTemplate::kStrictDelete); 2974 ReportMessage(MessageTemplate::kStrictDelete);
2951 *ok = false; 2975 *ok = false;
2952 return impl()->EmptyExpression(); 2976 return impl()->EmptyExpression();
2953 } 2977 }
(...skipping 2497 matching lines...) Expand 10 before | Expand all | Expand 10 after
5451 has_seen_constructor_ = true; 5475 has_seen_constructor_ = true;
5452 return; 5476 return;
5453 } 5477 }
5454 } 5478 }
5455 5479
5456 5480
5457 } // namespace internal 5481 } // namespace internal
5458 } // namespace v8 5482 } // namespace v8
5459 5483
5460 #endif // V8_PARSING_PARSER_BASE_H 5484 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | test/cctest/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698