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
3 // found in the LICENSE file.
4
5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H
7
8 #include "src/ast/ast.h"
9 #include "src/ast/scopes.h"
10 #include "src/bailout-reason.h"
11 #include "src/base/hashmap.h"
12 #include "src/counters.h"
13 #include "src/globals.h"
14 #include "src/messages.h"
15 #include "src/parsing/expression-classifier.h"
16 #include "src/parsing/func-name-inferrer.h"
17 #include "src/parsing/scanner.h"
18 #include "src/parsing/token.h"
19
20 namespace v8 {
21 namespace internal {
22
23
24 enum FunctionNameValidity {
25 kFunctionNameIsStrictReserved,
26 kSkipFunctionNameCheck,
27 kFunctionNameValidityUnknown
28 };
29
30 enum AllowLabelledFunctionStatement {
31 kAllowLabelledFunctionStatement,
32 kDisallowLabelledFunctionStatement,
33 };
34
35 enum class ParseFunctionFlags {
36 kIsNormal = 0,
37 kIsGenerator = 1,
38 kIsAsync = 2,
39 kIsDefault = 4
40 };
41
42 static inline ParseFunctionFlags operator|(ParseFunctionFlags lhs,
43 ParseFunctionFlags rhs) {
44 typedef unsigned char T;
45 return static_cast<ParseFunctionFlags>(static_cast<T>(lhs) |
46 static_cast<T>(rhs));
47 }
48
49 static inline ParseFunctionFlags& operator|=(ParseFunctionFlags& lhs,
50 const ParseFunctionFlags& rhs) {
51 lhs = lhs | rhs;
52 return lhs;
53 }
54
55 static inline bool operator&(ParseFunctionFlags bitfield,
56 ParseFunctionFlags mask) {
57 typedef unsigned char T;
58 return static_cast<T>(bitfield) & static_cast<T>(mask);
59 }
60
61 struct FormalParametersBase {
FormalParametersBaseFormalParametersBase62 explicit FormalParametersBase(DeclarationScope* scope) : scope(scope) {}
63
num_parametersFormalParametersBase64 int num_parameters() const {
65 // Don't include the rest parameter into the function's formal parameter
66 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count,
67 // which says whether we need to create an arguments adaptor frame).
68 return arity - has_rest;
69 }
70
UpdateArityAndFunctionLengthFormalParametersBase71 void UpdateArityAndFunctionLength(bool is_optional, bool is_rest) {
72 if (!is_optional && !is_rest && function_length == arity) {
73 ++function_length;
74 }
75 ++arity;
76 }
77
78 DeclarationScope* scope;
79 bool has_rest = false;
80 bool is_simple = true;
81 int materialized_literals_count = 0;
82 int function_length = 0;
83 int arity = 0;
84 };
85
86
87 // ----------------------------------------------------------------------------
88 // The CHECK_OK macro is a convenient macro to enforce error
89 // handling for functions that may fail (by returning !*ok).
90 //
91 // CAUTION: This macro appends extra statements after a call,
92 // thus it must never be used where only a single statement
93 // is correct (e.g. an if statement branch w/o braces)!
94
95 #define CHECK_OK_CUSTOM(x, ...) ok); \
96 if (!*ok) return impl()->x(__VA_ARGS__); \
97 ((void)0
98 #define DUMMY ) // to make indentation work
99 #undef DUMMY
100
101 // Used in functions where the return type is ExpressionT.
102 #define CHECK_OK CHECK_OK_CUSTOM(EmptyExpression)
103
104 #define CHECK_OK_VOID ok); \
105 if (!*ok) return; \
106 ((void)0
107 #define DUMMY ) // to make indentation work
108 #undef DUMMY
109
110 // Common base class template shared between parser and pre-parser.
111 // The Impl parameter is the actual class of the parser/pre-parser,
112 // following the Curiously Recurring Template Pattern (CRTP).
113 // The structure of the parser objects is roughly the following:
114 //
115 // // A structure template containing type definitions, needed to
116 // // avoid a cyclic dependency.
117 // template <typename Impl>
118 // struct ParserTypes;
119 //
120 // // The parser base object, which should just implement pure
121 // // parser behavior. The Impl parameter is the actual derived
122 // // class (according to CRTP), which implements impure parser
123 // // behavior.
124 // template <typename Impl>
125 // class ParserBase { ... };
126 //
127 // // And then, for each parser variant (e.g., parser, preparser, etc):
128 // class Parser;
129 //
130 // template <>
131 // class ParserTypes<Parser> { ... };
132 //
133 // class Parser : public ParserBase<Parser> { ... };
134 //
135 // The parser base object implements pure parsing, according to the
136 // language grammar. Different parser implementations may exhibit
137 // different parser-driven behavior that is not considered as pure
138 // parsing, e.g., early error detection and reporting, AST generation, etc.
139
140 // The ParserTypes structure encapsulates the differences in the
141 // types used in parsing methods. E.g., Parser methods use Expression*
142 // and PreParser methods use PreParserExpression. For any given parser
143 // implementation class Impl, it is expected to contain the following typedefs:
144 //
145 // template <>
146 // struct ParserTypes<Impl> {
147 // // Synonyms for ParserBase<Impl> and Impl, respectively.
148 // typedef Base;
149 // typedef Impl;
150 // // TODO(nikolaos): this one will probably go away, as it is
151 // // not related to pure parsing.
152 // typedef Variable;
153 // // Return types for traversing functions.
154 // typedef Identifier;
155 // typedef Expression;
156 // typedef FunctionLiteral;
157 // typedef ObjectLiteralProperty;
158 // typedef ClassLiteralProperty;
159 // typedef ExpressionList;
160 // typedef ObjectPropertyList;
161 // typedef ClassPropertyList;
162 // typedef FormalParameters;
163 // typedef Statement;
164 // typedef StatementList;
165 // typedef Block;
166 // typedef BreakableStatement;
167 // typedef IterationStatement;
168 // // For constructing objects returned by the traversing functions.
169 // typedef Factory;
170 // // For other implementation-specific tasks.
171 // typedef Target;
172 // typedef TargetScope;
173 // };
174
175 template <typename Impl>
176 struct ParserTypes;
177
178 template <typename Impl>
179 class ParserBase {
180 public:
181 // Shorten type names defined by ParserTypes<Impl>.
182 typedef ParserTypes<Impl> Types;
183 typedef typename Types::Identifier IdentifierT;
184 typedef typename Types::Expression ExpressionT;
185 typedef typename Types::FunctionLiteral FunctionLiteralT;
186 typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT;
187 typedef typename Types::ClassLiteralProperty ClassLiteralPropertyT;
188 typedef typename Types::ExpressionList ExpressionListT;
189 typedef typename Types::FormalParameters FormalParametersT;
190 typedef typename Types::Statement StatementT;
191 typedef typename Types::StatementList StatementListT;
192 typedef typename Types::Block BlockT;
193 typedef typename v8::internal::ExpressionClassifier<Types>
194 ExpressionClassifier;
195
196 // All implementation-specific methods must be called through this.
impl()197 Impl* impl() { return static_cast<Impl*>(this); }
impl()198 const Impl* impl() const { return static_cast<const Impl*>(this); }
199
200 ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit,
201 v8::Extension* extension, AstValueFactory* ast_value_factory,
202 RuntimeCallStats* runtime_call_stats,
203 bool parsing_on_main_thread = true)
scope_(nullptr)204 : scope_(nullptr),
205 function_state_(nullptr),
206 extension_(extension),
207 fni_(nullptr),
208 ast_value_factory_(ast_value_factory),
209 ast_node_factory_(ast_value_factory),
210 runtime_call_stats_(runtime_call_stats),
211 parsing_on_main_thread_(parsing_on_main_thread),
212 parsing_module_(false),
213 stack_limit_(stack_limit),
214 zone_(zone),
215 classifier_(nullptr),
216 scanner_(scanner),
217 stack_overflow_(false),
218 default_eager_compile_hint_(FunctionLiteral::kShouldLazyCompile),
219 function_literal_id_(0),
220 allow_natives_(false),
221 allow_tailcalls_(false),
222 allow_harmony_do_expressions_(false),
223 allow_harmony_function_sent_(false),
224 allow_harmony_restrictive_generators_(false),
225 allow_harmony_trailing_commas_(false),
226 allow_harmony_class_fields_(false),
227 allow_harmony_object_rest_spread_(false),
228 allow_harmony_dynamic_import_(false),
229 allow_harmony_async_iteration_(false),
230 allow_harmony_template_escapes_(false) {}
231
232 #define ALLOW_ACCESSORS(name) \
233 bool allow_##name() const { return allow_##name##_; } \
234 void set_allow_##name(bool allow) { allow_##name##_ = allow; }
235
236 ALLOW_ACCESSORS(natives);
237 ALLOW_ACCESSORS(tailcalls);
238 ALLOW_ACCESSORS(harmony_do_expressions);
239 ALLOW_ACCESSORS(harmony_function_sent);
240 ALLOW_ACCESSORS(harmony_restrictive_generators);
241 ALLOW_ACCESSORS(harmony_trailing_commas);
242 ALLOW_ACCESSORS(harmony_class_fields);
243 ALLOW_ACCESSORS(harmony_object_rest_spread);
244 ALLOW_ACCESSORS(harmony_dynamic_import);
245 ALLOW_ACCESSORS(harmony_async_iteration);
246 ALLOW_ACCESSORS(harmony_template_escapes);
247
248 #undef ALLOW_ACCESSORS
249
stack_limit()250 uintptr_t stack_limit() const { return stack_limit_; }
251
set_stack_limit(uintptr_t stack_limit)252 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; }
253
set_default_eager_compile_hint(FunctionLiteral::EagerCompileHint eager_compile_hint)254 void set_default_eager_compile_hint(
255 FunctionLiteral::EagerCompileHint eager_compile_hint) {
256 default_eager_compile_hint_ = eager_compile_hint;
257 }
258
default_eager_compile_hint()259 FunctionLiteral::EagerCompileHint default_eager_compile_hint() const {
260 return default_eager_compile_hint_;
261 }
262
GetNextFunctionLiteralId()263 int GetNextFunctionLiteralId() { return ++function_literal_id_; }
GetLastFunctionLiteralId()264 int GetLastFunctionLiteralId() const { return function_literal_id_; }
265
SkipFunctionLiterals(int delta)266 void SkipFunctionLiterals(int delta) { function_literal_id_ += delta; }
267
ResetFunctionLiteralId()268 void ResetFunctionLiteralId() { function_literal_id_ = 0; }
269
zone()270 Zone* zone() const { return zone_; }
271
272 protected:
273 friend class v8::internal::ExpressionClassifier<ParserTypes<Impl>>;
274
275 enum AllowRestrictedIdentifiers {
276 kAllowRestrictedIdentifiers,
277 kDontAllowRestrictedIdentifiers
278 };
279
280 enum LazyParsingResult { kLazyParsingComplete, kLazyParsingAborted };
281
282 enum VariableDeclarationContext {
283 kStatementListItem,
284 kStatement,
285 kForStatement
286 };
287
288 enum class FunctionBodyType { kNormal, kSingleExpression };
289
290 class Checkpoint;
291 class ClassLiteralChecker;
292 class ObjectLiteralChecker;
293
294 // ---------------------------------------------------------------------------
295 // BlockState and FunctionState implement the parser's scope stack.
296 // The parser's current scope is in scope_. BlockState and FunctionState
297 // constructors push on the scope stack and the destructors pop. They are also
298 // used to hold the parser's per-funcion state.
299 class BlockState BASE_EMBEDDED {
300 public:
BlockState(Scope ** scope_stack,Scope * scope)301 BlockState(Scope** scope_stack, Scope* scope)
302 : scope_stack_(scope_stack), outer_scope_(*scope_stack) {
303 *scope_stack_ = scope;
304 }
305
BlockState(Zone * zone,Scope ** scope_stack)306 BlockState(Zone* zone, Scope** scope_stack)
307 : BlockState(scope_stack,
308 new (zone) Scope(zone, *scope_stack, BLOCK_SCOPE)) {}
309
~BlockState()310 ~BlockState() { *scope_stack_ = outer_scope_; }
311
312 private:
313 Scope** const scope_stack_;
314 Scope* const outer_scope_;
315 };
316
317 struct DestructuringAssignment {
318 public:
DestructuringAssignmentDestructuringAssignment319 DestructuringAssignment(ExpressionT expression, Scope* scope)
320 : assignment(expression), scope(scope) {}
321
322 ExpressionT assignment;
323 Scope* scope;
324 };
325
326 class TailCallExpressionList {
327 public:
TailCallExpressionList(Zone * zone)328 explicit TailCallExpressionList(Zone* zone)
329 : zone_(zone), expressions_(0, zone), has_explicit_tail_calls_(false) {}
330
expressions()331 const ZoneList<ExpressionT>& expressions() const { return expressions_; }
location()332 const Scanner::Location& location() const { return loc_; }
333
has_explicit_tail_calls()334 bool has_explicit_tail_calls() const { return has_explicit_tail_calls_; }
335
Swap(TailCallExpressionList & other)336 void Swap(TailCallExpressionList& other) {
337 expressions_.Swap(&other.expressions_);
338 std::swap(loc_, other.loc_);
339 std::swap(has_explicit_tail_calls_, other.has_explicit_tail_calls_);
340 }
341
AddImplicitTailCall(ExpressionT expr)342 void AddImplicitTailCall(ExpressionT expr) {
343 expressions_.Add(expr, zone_);
344 }
345
Append(const TailCallExpressionList & other)346 void Append(const TailCallExpressionList& other) {
347 if (!has_explicit_tail_calls()) {
348 loc_ = other.loc_;
349 has_explicit_tail_calls_ = other.has_explicit_tail_calls_;
350 }
351 expressions_.AddAll(other.expressions_, zone_);
352 }
353
354 private:
355 Zone* zone_;
356 ZoneList<ExpressionT> expressions_;
357 Scanner::Location loc_;
358 bool has_explicit_tail_calls_;
359 };
360
361 // Defines whether tail call expressions are allowed or not.
362 enum class ReturnExprContext {
363 // We are inside return statement which is allowed to contain tail call
364 // expressions. Tail call expressions are allowed.
365 kInsideValidReturnStatement,
366
367 // We are inside a block in which tail call expressions are allowed but
368 // not yet inside a return statement.
369 kInsideValidBlock,
370
371 // Tail call expressions are not allowed in the following blocks.
372 kInsideTryBlock,
373 kInsideForInOfBody,
374 };
375
376 class FunctionState final : public BlockState {
377 public:
378 FunctionState(FunctionState** function_state_stack, Scope** scope_stack,
379 DeclarationScope* scope);
380 ~FunctionState();
381
scope()382 DeclarationScope* scope() const { return scope_->AsDeclarationScope(); }
383
AddProperty()384 void AddProperty() { expected_property_count_++; }
expected_property_count()385 int expected_property_count() { return expected_property_count_; }
386
kind()387 FunctionKind kind() const { return scope()->function_kind(); }
outer()388 FunctionState* outer() const { return outer_function_state_; }
389
generator_object_variable()390 typename Types::Variable* generator_object_variable() const {
391 return scope()->generator_object_var();
392 }
393
promise_variable()394 typename Types::Variable* promise_variable() const {
395 return scope()->promise_var();
396 }
397
RewindDestructuringAssignments(int pos)398 void RewindDestructuringAssignments(int pos) {
399 destructuring_assignments_to_rewrite_.Rewind(pos);
400 }
401
SetDestructuringAssignmentsScope(int pos,Scope * scope)402 void SetDestructuringAssignmentsScope(int pos, Scope* scope) {
403 for (int i = pos; i < destructuring_assignments_to_rewrite_.length();
404 ++i) {
405 destructuring_assignments_to_rewrite_[i].scope = scope;
406 }
407 }
408
409 const ZoneList<DestructuringAssignment>&
destructuring_assignments_to_rewrite()410 destructuring_assignments_to_rewrite() const {
411 return destructuring_assignments_to_rewrite_;
412 }
413
tail_call_expressions()414 TailCallExpressionList& tail_call_expressions() {
415 return tail_call_expressions_;
416 }
AddImplicitTailCallExpression(ExpressionT expression)417 void AddImplicitTailCallExpression(ExpressionT expression) {
418 if (return_expr_context() ==
419 ReturnExprContext::kInsideValidReturnStatement) {
420 tail_call_expressions_.AddImplicitTailCall(expression);
421 }
422 }
423
GetReportedErrorList()424 ZoneList<typename ExpressionClassifier::Error>* GetReportedErrorList() {
425 return &reported_errors_;
426 }
427
return_expr_context()428 ReturnExprContext return_expr_context() const {
429 return return_expr_context_;
430 }
set_return_expr_context(ReturnExprContext context)431 void set_return_expr_context(ReturnExprContext context) {
432 return_expr_context_ = context;
433 }
434
non_patterns_to_rewrite()435 ZoneList<ExpressionT>* non_patterns_to_rewrite() {
436 return &non_patterns_to_rewrite_;
437 }
438
next_function_is_likely_called()439 bool next_function_is_likely_called() const {
440 return next_function_is_likely_called_;
441 }
442
previous_function_was_likely_called()443 bool previous_function_was_likely_called() const {
444 return previous_function_was_likely_called_;
445 }
446
set_next_function_is_likely_called()447 void set_next_function_is_likely_called() {
448 next_function_is_likely_called_ = true;
449 }
450
451 private:
AddDestructuringAssignment(DestructuringAssignment pair)452 void AddDestructuringAssignment(DestructuringAssignment pair) {
453 destructuring_assignments_to_rewrite_.Add(pair, scope_->zone());
454 }
455
AddNonPatternForRewriting(ExpressionT expr,bool * ok)456 void AddNonPatternForRewriting(ExpressionT expr, bool* ok) {
457 non_patterns_to_rewrite_.Add(expr, scope_->zone());
458 if (non_patterns_to_rewrite_.length() >=
459 std::numeric_limits<uint16_t>::max())
460 *ok = false;
461 }
462
463 // Used to assign an index to each literal that needs materialization in
464 // the function. Includes regexp literals, and boilerplate for object and
465 // array literals.
466 int next_materialized_literal_index_;
467
468 // Properties count estimation.
469 int expected_property_count_;
470
471 FunctionState** function_state_stack_;
472 FunctionState* outer_function_state_;
473 DeclarationScope* scope_;
474
475 ZoneList<DestructuringAssignment> destructuring_assignments_to_rewrite_;
476 TailCallExpressionList tail_call_expressions_;
477 ReturnExprContext return_expr_context_;
478 ZoneList<ExpressionT> non_patterns_to_rewrite_;
479
480 ZoneList<typename ExpressionClassifier::Error> reported_errors_;
481
482 // Record whether the next (=== immediately following) function literal is
483 // preceded by a parenthesis / exclamation mark. Also record the previous
484 // state.
485 // These are managed by the FunctionState constructor; the caller may only
486 // call set_next_function_is_likely_called.
487 bool next_function_is_likely_called_;
488 bool previous_function_was_likely_called_;
489
490 friend Impl;
491 friend class Checkpoint;
492 };
493
494 // This scope sets current ReturnExprContext to given value.
495 class ReturnExprScope {
496 public:
ReturnExprScope(FunctionState * function_state,ReturnExprContext return_expr_context)497 explicit ReturnExprScope(FunctionState* function_state,
498 ReturnExprContext return_expr_context)
499 : function_state_(function_state),
500 sav_return_expr_context_(function_state->return_expr_context()) {
501 // Don't update context if we are requested to enable tail call
502 // expressions but current block does not allow them.
503 if (return_expr_context !=
504 ReturnExprContext::kInsideValidReturnStatement ||
505 sav_return_expr_context_ == ReturnExprContext::kInsideValidBlock) {
506 function_state->set_return_expr_context(return_expr_context);
507 }
508 }
~ReturnExprScope()509 ~ReturnExprScope() {
510 function_state_->set_return_expr_context(sav_return_expr_context_);
511 }
512
513 private:
514 FunctionState* function_state_;
515 ReturnExprContext sav_return_expr_context_;
516 };
517
518 // Collects all return expressions at tail call position in this scope
519 // to a separate list.
520 class CollectExpressionsInTailPositionToListScope {
521 public:
CollectExpressionsInTailPositionToListScope(FunctionState * function_state,TailCallExpressionList * list)522 CollectExpressionsInTailPositionToListScope(FunctionState* function_state,
523 TailCallExpressionList* list)
524 : function_state_(function_state), list_(list) {
525 function_state->tail_call_expressions().Swap(*list_);
526 }
~CollectExpressionsInTailPositionToListScope()527 ~CollectExpressionsInTailPositionToListScope() {
528 function_state_->tail_call_expressions().Swap(*list_);
529 }
530
531 private:
532 FunctionState* function_state_;
533 TailCallExpressionList* list_;
534 };
535
536 // Annoyingly, arrow functions first parse as comma expressions, then when we
537 // see the => we have to go back and reinterpret the arguments as being formal
538 // parameters. To do so we need to reset some of the parser state back to
539 // what it was before the arguments were first seen.
540 class Checkpoint BASE_EMBEDDED {
541 public:
Checkpoint(ParserBase * parser)542 explicit Checkpoint(ParserBase* parser) {
543 function_state_ = parser->function_state_;
544 next_materialized_literal_index_ =
545 function_state_->next_materialized_literal_index_;
546 expected_property_count_ = function_state_->expected_property_count_;
547 }
548
Restore(int * materialized_literal_index_delta)549 void Restore(int* materialized_literal_index_delta) {
550 *materialized_literal_index_delta =
551 function_state_->next_materialized_literal_index_ -
552 next_materialized_literal_index_;
553 function_state_->next_materialized_literal_index_ =
554 next_materialized_literal_index_;
555 function_state_->expected_property_count_ = expected_property_count_;
556 }
557
558 private:
559 FunctionState* function_state_;
560 int next_materialized_literal_index_;
561 int expected_property_count_;
562 };
563
564 struct DeclarationDescriptor {
565 enum Kind { NORMAL, PARAMETER };
566 Scope* scope;
567 VariableMode mode;
568 int declaration_pos;
569 int initialization_pos;
570 Kind declaration_kind;
571 };
572
573 struct DeclarationParsingResult {
574 struct Declaration {
DeclarationDeclarationParsingResult::Declaration575 Declaration(ExpressionT pattern, int initializer_position,
576 ExpressionT initializer)
577 : pattern(pattern),
578 initializer_position(initializer_position),
579 initializer(initializer) {}
580
581 ExpressionT pattern;
582 int initializer_position;
583 ExpressionT initializer;
584 };
585
DeclarationParsingResultDeclarationParsingResult586 DeclarationParsingResult()
587 : declarations(4),
588 first_initializer_loc(Scanner::Location::invalid()),
589 bindings_loc(Scanner::Location::invalid()) {}
590
591 DeclarationDescriptor descriptor;
592 List<Declaration> declarations;
593 Scanner::Location first_initializer_loc;
594 Scanner::Location bindings_loc;
595 };
596
597 struct CatchInfo {
598 public:
CatchInfoCatchInfo599 explicit CatchInfo(ParserBase* parser)
600 : name(parser->impl()->EmptyIdentifier()),
601 variable(nullptr),
602 pattern(parser->impl()->EmptyExpression()),
603 scope(nullptr),
604 init_block(parser->impl()->NullBlock()),
605 inner_block(parser->impl()->NullBlock()),
606 bound_names(1, parser->zone()),
607 tail_call_expressions(parser->zone()) {}
608 IdentifierT name;
609 Variable* variable;
610 ExpressionT pattern;
611 Scope* scope;
612 BlockT init_block;
613 BlockT inner_block;
614 ZoneList<const AstRawString*> bound_names;
615 TailCallExpressionList tail_call_expressions;
616 };
617
618 struct ForInfo {
619 public:
ForInfoForInfo620 explicit ForInfo(ParserBase* parser)
621 : bound_names(1, parser->zone()),
622 mode(ForEachStatement::ENUMERATE),
623 position(kNoSourcePosition),
624 parsing_result() {}
625 ZoneList<const AstRawString*> bound_names;
626 ForEachStatement::VisitMode mode;
627 int position;
628 DeclarationParsingResult parsing_result;
629 };
630
631 struct ClassInfo {
632 public:
ClassInfoClassInfo633 explicit ClassInfo(ParserBase* parser)
634 : proxy(nullptr),
635 extends(parser->impl()->EmptyExpression()),
636 properties(parser->impl()->NewClassPropertyList(4)),
637 constructor(parser->impl()->EmptyFunctionLiteral()),
638 has_seen_constructor(false),
639 has_name_static_property(false),
640 has_static_computed_names(false) {}
641 VariableProxy* proxy;
642 ExpressionT extends;
643 typename Types::ClassPropertyList properties;
644 FunctionLiteralT constructor;
645 bool has_seen_constructor;
646 bool has_name_static_property;
647 bool has_static_computed_names;
648 };
649
NewScriptScope()650 DeclarationScope* NewScriptScope() const {
651 return new (zone()) DeclarationScope(zone(), ast_value_factory());
652 }
653
NewVarblockScope()654 DeclarationScope* NewVarblockScope() const {
655 return new (zone()) DeclarationScope(zone(), scope(), BLOCK_SCOPE);
656 }
657
NewModuleScope(DeclarationScope * parent)658 ModuleScope* NewModuleScope(DeclarationScope* parent) const {
659 return new (zone()) ModuleScope(parent, ast_value_factory());
660 }
661
NewEvalScope(Scope * parent)662 DeclarationScope* NewEvalScope(Scope* parent) const {
663 return new (zone()) DeclarationScope(zone(), parent, EVAL_SCOPE);
664 }
665
NewScope(ScopeType scope_type)666 Scope* NewScope(ScopeType scope_type) const {
667 return NewScopeWithParent(scope(), scope_type);
668 }
669
670 // This constructor should only be used when absolutely necessary. Most scopes
671 // should automatically use scope() as parent, and be fine with
672 // NewScope(ScopeType) above.
NewScopeWithParent(Scope * parent,ScopeType scope_type)673 Scope* NewScopeWithParent(Scope* parent, ScopeType scope_type) const {
674 // Must always use the specific constructors for the blacklisted scope
675 // types.
676 DCHECK_NE(FUNCTION_SCOPE, scope_type);
677 DCHECK_NE(SCRIPT_SCOPE, scope_type);
678 DCHECK_NE(MODULE_SCOPE, scope_type);
679 DCHECK_NOT_NULL(parent);
680 return new (zone()) Scope(zone(), parent, scope_type);
681 }
682
683 // Creates a function scope that always allocates in zone(). The function
684 // scope itself is either allocated in zone() or in target_zone if one is
685 // passed in.
686 DeclarationScope* NewFunctionScope(FunctionKind kind,
687 Zone* target_zone = nullptr) const {
688 DCHECK(ast_value_factory());
689 if (target_zone == nullptr) target_zone = zone();
690 DeclarationScope* result = new (target_zone)
691 DeclarationScope(zone(), scope(), FUNCTION_SCOPE, kind);
692 // TODO(verwaest): Move into the DeclarationScope constructor.
693 if (!IsArrowFunction(kind)) {
694 result->DeclareDefaultFunctionVariables(ast_value_factory());
695 }
696 return result;
697 }
698
GetDeclarationScope()699 V8_INLINE DeclarationScope* GetDeclarationScope() const {
700 return scope()->GetDeclarationScope();
701 }
GetClosureScope()702 V8_INLINE DeclarationScope* GetClosureScope() const {
703 return scope()->GetClosureScope();
704 }
705
scanner()706 Scanner* scanner() const { return scanner_; }
ast_value_factory()707 AstValueFactory* ast_value_factory() const { return ast_value_factory_; }
position()708 int position() const { return scanner_->location().beg_pos; }
peek_position()709 int peek_position() const { return scanner_->peek_location().beg_pos; }
stack_overflow()710 bool stack_overflow() const { return stack_overflow_; }
set_stack_overflow()711 void set_stack_overflow() { stack_overflow_ = true; }
712
INLINE(Token::Value peek ())713 INLINE(Token::Value peek()) {
714 if (stack_overflow_) return Token::ILLEGAL;
715 return scanner()->peek();
716 }
717
INLINE(Token::Value PeekAhead ())718 INLINE(Token::Value PeekAhead()) {
719 if (stack_overflow_) return Token::ILLEGAL;
720 return scanner()->PeekAhead();
721 }
722
INLINE(Token::Value Next ())723 INLINE(Token::Value Next()) {
724 if (stack_overflow_) return Token::ILLEGAL;
725 {
726 if (GetCurrentStackPosition() < stack_limit_) {
727 // Any further calls to Next or peek will return the illegal token.
728 // The current call must return the next token, which might already
729 // have been peek'ed.
730 stack_overflow_ = true;
731 }
732 }
733 return scanner()->Next();
734 }
735
Consume(Token::Value token)736 void Consume(Token::Value token) {
737 Token::Value next = Next();
738 USE(next);
739 USE(token);
740 DCHECK(next == token);
741 }
742
Check(Token::Value token)743 bool Check(Token::Value token) {
744 Token::Value next = peek();
745 if (next == token) {
746 Consume(next);
747 return true;
748 }
749 return false;
750 }
751
Expect(Token::Value token,bool * ok)752 void Expect(Token::Value token, bool* ok) {
753 Token::Value next = Next();
754 if (next != token) {
755 ReportUnexpectedToken(next);
756 *ok = false;
757 }
758 }
759
ExpectSemicolon(bool * ok)760 void ExpectSemicolon(bool* ok) {
761 // Check for automatic semicolon insertion according to
762 // the rules given in ECMA-262, section 7.9, page 21.
763 Token::Value tok = peek();
764 if (tok == Token::SEMICOLON) {
765 Next();
766 return;
767 }
768 if (scanner()->HasAnyLineTerminatorBeforeNext() ||
769 tok == Token::RBRACE ||
770 tok == Token::EOS) {
771 return;
772 }
773 Expect(Token::SEMICOLON, ok);
774 }
775
776 // Dummy functions, just useful as arguments to CHECK_OK_CUSTOM.
Void()777 static void Void() {}
778 template <typename T>
Return(T result)779 static T Return(T result) {
780 return result;
781 }
782
is_any_identifier(Token::Value token)783 bool is_any_identifier(Token::Value token) {
784 return token == Token::IDENTIFIER || token == Token::ENUM ||
785 token == Token::AWAIT || token == Token::ASYNC ||
786 token == Token::ESCAPED_STRICT_RESERVED_WORD ||
787 token == Token::FUTURE_STRICT_RESERVED_WORD || token == Token::LET ||
788 token == Token::STATIC || token == Token::YIELD;
789 }
peek_any_identifier()790 bool peek_any_identifier() { return is_any_identifier(peek()); }
791
CheckContextualKeyword(Vector<const char> keyword)792 bool CheckContextualKeyword(Vector<const char> keyword) {
793 if (PeekContextualKeyword(keyword)) {
794 Consume(Token::IDENTIFIER);
795 return true;
796 }
797 return false;
798 }
799
PeekContextualKeyword(Vector<const char> keyword)800 bool PeekContextualKeyword(Vector<const char> keyword) {
801 return peek() == Token::IDENTIFIER &&
802 scanner()->is_next_contextual_keyword(keyword);
803 }
804
805 void ExpectMetaProperty(Vector<const char> property_name,
806 const char* full_name, int pos, bool* ok);
807
ExpectContextualKeyword(Vector<const char> keyword,bool * ok)808 void ExpectContextualKeyword(Vector<const char> keyword, bool* ok) {
809 Expect(Token::IDENTIFIER, CHECK_OK_CUSTOM(Void));
810 if (!scanner()->is_literal_contextual_keyword(keyword)) {
811 ReportUnexpectedToken(scanner()->current_token());
812 *ok = false;
813 }
814 }
815
CheckInOrOf(ForEachStatement::VisitMode * visit_mode)816 bool CheckInOrOf(ForEachStatement::VisitMode* visit_mode) {
817 if (Check(Token::IN)) {
818 *visit_mode = ForEachStatement::ENUMERATE;
819 return true;
820 } else if (CheckContextualKeyword(CStrVector("of"))) {
821 *visit_mode = ForEachStatement::ITERATE;
822 return true;
823 }
824 return false;
825 }
826
PeekInOrOf()827 bool PeekInOrOf() {
828 return peek() == Token::IN || PeekContextualKeyword(CStrVector("of"));
829 }
830
831 // Checks whether an octal literal was last seen between beg_pos and end_pos.
832 // Only called for strict mode strings.
CheckStrictOctalLiteral(int beg_pos,int end_pos,bool * ok)833 void CheckStrictOctalLiteral(int beg_pos, int end_pos, bool* ok) {
834 Scanner::Location octal = scanner()->octal_position();
835 if (octal.IsValid() && beg_pos <= octal.beg_pos &&
836 octal.end_pos <= end_pos) {
837 MessageTemplate::Template message = scanner()->octal_message();
838 DCHECK_NE(message, MessageTemplate::kNone);
839 impl()->ReportMessageAt(octal, message);
840 scanner()->clear_octal_position();
841 if (message == MessageTemplate::kStrictDecimalWithLeadingZero) {
842 impl()->CountUsage(v8::Isolate::kDecimalWithLeadingZeroInStrictMode);
843 }
844 *ok = false;
845 }
846 }
847
848 // Checks if an octal literal or an invalid hex or unicode escape sequence
849 // appears in a template literal. In the presence of such, either
850 // returns false or reports an error, depending on should_throw. Otherwise
851 // returns true.
CheckTemplateEscapes(bool should_throw,bool * ok)852 inline bool CheckTemplateEscapes(bool should_throw, bool* ok) {
853 if (!scanner()->has_invalid_template_escape()) {
854 return true;
855 }
856
857 // Handle error case(s)
858 if (should_throw) {
859 impl()->ReportMessageAt(scanner()->invalid_template_escape_location(),
860 scanner()->invalid_template_escape_message());
861 *ok = false;
862 }
863 scanner()->clear_invalid_template_escape();
864 return false;
865 }
866
867 void CheckDestructuringElement(ExpressionT element, int beg_pos, int end_pos);
868
869 // Checking the name of a function literal. This has to be done after parsing
870 // the function, since the function can declare itself strict.
CheckFunctionName(LanguageMode language_mode,IdentifierT function_name,FunctionNameValidity function_name_validity,const Scanner::Location & function_name_loc,bool * ok)871 void CheckFunctionName(LanguageMode language_mode, IdentifierT function_name,
872 FunctionNameValidity function_name_validity,
873 const Scanner::Location& function_name_loc, bool* ok) {
874 if (function_name_validity == kSkipFunctionNameCheck) return;
875 // The function name needs to be checked in strict mode.
876 if (is_sloppy(language_mode)) return;
877
878 if (impl()->IsEvalOrArguments(function_name)) {
879 impl()->ReportMessageAt(function_name_loc,
880 MessageTemplate::kStrictEvalArguments);
881 *ok = false;
882 return;
883 }
884 if (function_name_validity == kFunctionNameIsStrictReserved) {
885 impl()->ReportMessageAt(function_name_loc,
886 MessageTemplate::kUnexpectedStrictReserved);
887 *ok = false;
888 return;
889 }
890 }
891
892 // Determine precedence of given token.
Precedence(Token::Value token,bool accept_IN)893 static int Precedence(Token::Value token, bool accept_IN) {
894 if (token == Token::IN && !accept_IN)
895 return 0; // 0 precedence will terminate binary expression parsing
896 return Token::Precedence(token);
897 }
898
factory()899 typename Types::Factory* factory() { return &ast_node_factory_; }
900
GetReceiverScope()901 DeclarationScope* GetReceiverScope() const {
902 return scope()->GetReceiverScope();
903 }
language_mode()904 LanguageMode language_mode() { return scope()->language_mode(); }
RaiseLanguageMode(LanguageMode mode)905 void RaiseLanguageMode(LanguageMode mode) {
906 LanguageMode old = scope()->language_mode();
907 impl()->SetLanguageMode(scope(), old > mode ? old : mode);
908 }
is_generator()909 bool is_generator() const {
910 return IsGeneratorFunction(function_state_->kind());
911 }
is_async_function()912 bool is_async_function() const {
913 return IsAsyncFunction(function_state_->kind());
914 }
is_resumable()915 bool is_resumable() const {
916 return IsResumableFunction(function_state_->kind());
917 }
918
919 // Report syntax errors.
ReportMessage(MessageTemplate::Template message)920 void ReportMessage(MessageTemplate::Template message) {
921 Scanner::Location source_location = scanner()->location();
922 impl()->ReportMessageAt(source_location, message,
923 static_cast<const char*>(nullptr), kSyntaxError);
924 }
925
926 template <typename T>
927 void ReportMessage(MessageTemplate::Template message, T arg,
928 ParseErrorType error_type = kSyntaxError) {
929 Scanner::Location source_location = scanner()->location();
930 impl()->ReportMessageAt(source_location, message, arg, error_type);
931 }
932
ReportMessageAt(Scanner::Location location,MessageTemplate::Template message,ParseErrorType error_type)933 void ReportMessageAt(Scanner::Location location,
934 MessageTemplate::Template message,
935 ParseErrorType error_type) {
936 impl()->ReportMessageAt(location, message,
937 static_cast<const char*>(nullptr), error_type);
938 }
939
940 void GetUnexpectedTokenMessage(
941 Token::Value token, MessageTemplate::Template* message,
942 Scanner::Location* location, const char** arg,
943 MessageTemplate::Template default_ = MessageTemplate::kUnexpectedToken);
944
945 void ReportUnexpectedToken(Token::Value token);
946 void ReportUnexpectedTokenAt(
947 Scanner::Location location, Token::Value token,
948 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken);
949
ReportClassifierError(const typename ExpressionClassifier::Error & error)950 void ReportClassifierError(
951 const typename ExpressionClassifier::Error& error) {
952 impl()->ReportMessageAt(error.location, error.message, error.arg,
953 error.type);
954 }
955
ValidateExpression(bool * ok)956 void ValidateExpression(bool* ok) {
957 if (!classifier()->is_valid_expression()) {
958 ReportClassifierError(classifier()->expression_error());
959 *ok = false;
960 }
961 }
962
ValidateFormalParameterInitializer(bool * ok)963 void ValidateFormalParameterInitializer(bool* ok) {
964 if (!classifier()->is_valid_formal_parameter_initializer()) {
965 ReportClassifierError(classifier()->formal_parameter_initializer_error());
966 *ok = false;
967 }
968 }
969
ValidateBindingPattern(bool * ok)970 void ValidateBindingPattern(bool* ok) {
971 if (!classifier()->is_valid_binding_pattern()) {
972 ReportClassifierError(classifier()->binding_pattern_error());
973 *ok = false;
974 }
975 }
976
ValidateAssignmentPattern(bool * ok)977 void ValidateAssignmentPattern(bool* ok) {
978 if (!classifier()->is_valid_assignment_pattern()) {
979 ReportClassifierError(classifier()->assignment_pattern_error());
980 *ok = false;
981 }
982 }
983
ValidateFormalParameters(LanguageMode language_mode,bool allow_duplicates,bool * ok)984 void ValidateFormalParameters(LanguageMode language_mode,
985 bool allow_duplicates, bool* ok) {
986 if (!allow_duplicates &&
987 !classifier()->is_valid_formal_parameter_list_without_duplicates()) {
988 ReportClassifierError(classifier()->duplicate_formal_parameter_error());
989 *ok = false;
990 } else if (is_strict(language_mode) &&
991 !classifier()->is_valid_strict_mode_formal_parameters()) {
992 ReportClassifierError(classifier()->strict_mode_formal_parameter_error());
993 *ok = false;
994 }
995 }
996
IsValidArrowFormalParametersStart(Token::Value token)997 bool IsValidArrowFormalParametersStart(Token::Value token) {
998 return is_any_identifier(token) || token == Token::LPAREN;
999 }
1000
ValidateArrowFormalParameters(ExpressionT expr,bool parenthesized_formals,bool is_async,bool * ok)1001 void ValidateArrowFormalParameters(ExpressionT expr,
1002 bool parenthesized_formals, bool is_async,
1003 bool* ok) {
1004 if (classifier()->is_valid_binding_pattern()) {
1005 // A simple arrow formal parameter: IDENTIFIER => BODY.
1006 if (!impl()->IsIdentifier(expr)) {
1007 impl()->ReportMessageAt(scanner()->location(),
1008 MessageTemplate::kUnexpectedToken,
1009 Token::String(scanner()->current_token()));
1010 *ok = false;
1011 }
1012 } else if (!classifier()->is_valid_arrow_formal_parameters()) {
1013 // If after parsing the expr, we see an error but the expression is
1014 // neither a valid binding pattern nor a valid parenthesized formal
1015 // parameter list, show the "arrow formal parameters" error if the formals
1016 // started with a parenthesis, and the binding pattern error otherwise.
1017 const typename ExpressionClassifier::Error& error =
1018 parenthesized_formals ? classifier()->arrow_formal_parameters_error()
1019 : classifier()->binding_pattern_error();
1020 ReportClassifierError(error);
1021 *ok = false;
1022 }
1023 if (is_async && !classifier()->is_valid_async_arrow_formal_parameters()) {
1024 const typename ExpressionClassifier::Error& error =
1025 classifier()->async_arrow_formal_parameters_error();
1026 ReportClassifierError(error);
1027 *ok = false;
1028 }
1029 }
1030
ValidateLetPattern(bool * ok)1031 void ValidateLetPattern(bool* ok) {
1032 if (!classifier()->is_valid_let_pattern()) {
1033 ReportClassifierError(classifier()->let_pattern_error());
1034 *ok = false;
1035 }
1036 }
1037
BindingPatternUnexpectedToken()1038 void BindingPatternUnexpectedToken() {
1039 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken;
1040 const char* arg;
1041 Scanner::Location location = scanner()->peek_location();
1042 GetUnexpectedTokenMessage(peek(), &message, &location, &arg);
1043 classifier()->RecordBindingPatternError(location, message, arg);
1044 }
1045
ArrowFormalParametersUnexpectedToken()1046 void ArrowFormalParametersUnexpectedToken() {
1047 MessageTemplate::Template message = MessageTemplate::kUnexpectedToken;
1048 const char* arg;
1049 Scanner::Location location = scanner()->peek_location();
1050 GetUnexpectedTokenMessage(peek(), &message, &location, &arg);
1051 classifier()->RecordArrowFormalParametersError(location, message, arg);
1052 }
1053
1054 // Recursive descent functions.
1055 // All ParseXXX functions take as the last argument an *ok parameter
1056 // which is set to false if parsing failed; it is unchanged otherwise.
1057 // By making the 'exception handling' explicit, we are forced to check
1058 // for failure at the call sites. The family of CHECK_OK* macros can
1059 // be useful for this.
1060
1061 // Parses an identifier that is valid for the current scope, in particular it
1062 // fails on strict mode future reserved keywords in a strict scope. If
1063 // allow_eval_or_arguments is kAllowEvalOrArguments, we allow "eval" or
1064 // "arguments" as identifier even in strict mode (this is needed in cases like
1065 // "var foo = eval;").
1066 IdentifierT ParseIdentifier(AllowRestrictedIdentifiers, bool* ok);
1067 IdentifierT ParseAndClassifyIdentifier(bool* ok);
1068 // Parses an identifier or a strict mode future reserved word, and indicate
1069 // whether it is strict mode future reserved. Allows passing in function_kind
1070 // for the case of parsing the identifier in a function expression, where the
1071 // relevant "function_kind" bit is of the function being parsed, not the
1072 // containing function.
1073 IdentifierT ParseIdentifierOrStrictReservedWord(FunctionKind function_kind,
1074 bool* is_strict_reserved,
1075 bool* ok);
ParseIdentifierOrStrictReservedWord(bool * is_strict_reserved,bool * ok)1076 IdentifierT ParseIdentifierOrStrictReservedWord(bool* is_strict_reserved,
1077 bool* ok) {
1078 return ParseIdentifierOrStrictReservedWord(function_state_->kind(),
1079 is_strict_reserved, ok);
1080 }
1081
1082 IdentifierT ParseIdentifierName(bool* ok);
1083
1084 ExpressionT ParseRegExpLiteral(bool* ok);
1085
1086 ExpressionT ParsePrimaryExpression(bool* is_async, bool* ok);
ParsePrimaryExpression(bool * ok)1087 ExpressionT ParsePrimaryExpression(bool* ok) {
1088 bool is_async;
1089 return ParsePrimaryExpression(&is_async, ok);
1090 }
1091
1092 // This method wraps the parsing of the expression inside a new expression
1093 // classifier and calls RewriteNonPattern if parsing is successful.
1094 // It should be used whenever we're parsing an expression that will be
1095 // used as a non-pattern (i.e., in most cases).
1096 V8_INLINE ExpressionT ParseExpression(bool accept_IN, bool* ok);
1097
1098 // This method does not wrap the parsing of the expression inside a
1099 // new expression classifier; it uses the top-level classifier instead.
1100 // It should be used whenever we're parsing something with the "cover"
1101 // grammar that recognizes both patterns and non-patterns (which roughly
1102 // corresponds to what's inside the parentheses generated by the symbol
1103 // "CoverParenthesizedExpressionAndArrowParameterList" in the ES 2017
1104 // specification).
1105 ExpressionT ParseExpressionCoverGrammar(bool accept_IN, bool* ok);
1106
1107 ExpressionT ParseArrayLiteral(bool* ok);
1108
1109 enum class PropertyKind {
1110 kAccessorProperty,
1111 kValueProperty,
1112 kShorthandProperty,
1113 kMethodProperty,
1114 kClassField,
1115 kSpreadProperty,
1116 kNotSet
1117 };
1118
1119 bool SetPropertyKindFromToken(Token::Value token, PropertyKind* kind);
1120 ExpressionT ParsePropertyName(IdentifierT* name, PropertyKind* kind,
1121 bool* is_generator, bool* is_get, bool* is_set,
1122 bool* is_async, bool* is_computed_name,
1123 bool* ok);
1124 ExpressionT ParseObjectLiteral(bool* ok);
1125 ClassLiteralPropertyT ParseClassPropertyDefinition(
1126 ClassLiteralChecker* checker, bool has_extends, bool* is_computed_name,
1127 bool* has_seen_constructor, ClassLiteralProperty::Kind* property_kind,
1128 bool* is_static, bool* has_name_static_property, bool* ok);
1129 FunctionLiteralT ParseClassFieldForInitializer(bool has_initializer,
1130 bool* ok);
1131 ObjectLiteralPropertyT ParseObjectPropertyDefinition(
1132 ObjectLiteralChecker* checker, bool* is_computed_name,
1133 bool* is_rest_property, bool* ok);
1134 ExpressionListT ParseArguments(Scanner::Location* first_spread_pos,
1135 bool maybe_arrow, bool* ok);
ParseArguments(Scanner::Location * first_spread_pos,bool * ok)1136 ExpressionListT ParseArguments(Scanner::Location* first_spread_pos,
1137 bool* ok) {
1138 return ParseArguments(first_spread_pos, false, ok);
1139 }
1140
1141 ExpressionT ParseAssignmentExpression(bool accept_IN, bool* ok);
1142 ExpressionT ParseYieldExpression(bool accept_IN, bool* ok);
1143 ExpressionT ParseConditionalExpression(bool accept_IN, bool* ok);
1144 ExpressionT ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
1145 ExpressionT ParseUnaryExpression(bool* ok);
1146 ExpressionT ParsePostfixExpression(bool* ok);
1147 ExpressionT ParseLeftHandSideExpression(bool* ok);
1148 ExpressionT ParseMemberWithNewPrefixesExpression(bool* is_async, bool* ok);
1149 ExpressionT ParseMemberExpression(bool* is_async, bool* ok);
1150 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression,
1151 bool* is_async, bool* ok);
1152
1153 // `rewritable_length`: length of the destructuring_assignments_to_rewrite()
1154 // queue in the parent function state, prior to parsing of formal parameters.
1155 // If the arrow function is lazy, any items added during formal parameter
1156 // parsing are removed from the queue.
1157 ExpressionT ParseArrowFunctionLiteral(bool accept_IN,
1158 const FormalParametersT& parameters,
1159 int rewritable_length, bool* ok);
1160 void ParseAsyncFunctionBody(Scope* scope, StatementListT body,
1161 FunctionKind kind, FunctionBodyType type,
1162 bool accept_IN, int pos, bool* ok);
1163 ExpressionT ParseAsyncFunctionLiteral(bool* ok);
1164 ExpressionT ParseClassLiteral(IdentifierT name,
1165 Scanner::Location class_name_location,
1166 bool name_is_strict_reserved,
1167 int class_token_pos, bool* ok);
1168 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool tagged,
1169 bool* ok);
1170 ExpressionT ParseSuperExpression(bool is_new, bool* ok);
1171 ExpressionT ParseDynamicImportExpression(bool* ok);
1172 ExpressionT ParseNewTargetExpression(bool* ok);
1173
1174 void ParseFormalParameter(FormalParametersT* parameters, bool* ok);
1175 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok);
1176 void CheckArityRestrictions(int param_count, FunctionKind function_type,
1177 bool has_rest, int formals_start_pos,
1178 int formals_end_pos, bool* ok);
1179
1180 BlockT ParseVariableDeclarations(VariableDeclarationContext var_context,
1181 DeclarationParsingResult* parsing_result,
1182 ZoneList<const AstRawString*>* names,
1183 bool* ok);
1184 StatementT ParseAsyncFunctionDeclaration(ZoneList<const AstRawString*>* names,
1185 bool default_export, bool* ok);
1186 StatementT ParseFunctionDeclaration(bool* ok);
1187 StatementT ParseHoistableDeclaration(ZoneList<const AstRawString*>* names,
1188 bool default_export, bool* ok);
1189 StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags,
1190 ZoneList<const AstRawString*>* names,
1191 bool default_export, bool* ok);
1192 StatementT ParseClassDeclaration(ZoneList<const AstRawString*>* names,
1193 bool default_export, bool* ok);
1194 StatementT ParseNativeDeclaration(bool* ok);
1195
1196 // Consumes the ending }.
1197 void ParseFunctionBody(StatementListT result, IdentifierT function_name,
1198 int pos, const FormalParametersT& parameters,
1199 FunctionKind kind,
1200 FunctionLiteral::FunctionType function_type, bool* ok);
1201
1202 // Under some circumstances, we allow preparsing to abort if the preparsed
1203 // function is "long and trivial", and fully parse instead. Our current
1204 // definition of "long and trivial" is:
1205 // - over kLazyParseTrialLimit statements
1206 // - all starting with an identifier (i.e., no if, for, while, etc.)
1207 static const int kLazyParseTrialLimit = 200;
1208
1209 // TODO(nikolaos, marja): The first argument should not really be passed
1210 // by value. The method is expected to add the parsed statements to the
1211 // list. This works because in the case of the parser, StatementListT is
1212 // a pointer whereas the preparser does not really modify the body.
ParseStatementList(StatementListT body,int end_token,bool * ok)1213 V8_INLINE void ParseStatementList(StatementListT body, int end_token,
1214 bool* ok) {
1215 LazyParsingResult result = ParseStatementList(body, end_token, false, ok);
1216 USE(result);
1217 DCHECK_EQ(result, kLazyParsingComplete);
1218 }
1219 LazyParsingResult ParseStatementList(StatementListT body, int end_token,
1220 bool may_abort, bool* ok);
1221 StatementT ParseStatementListItem(bool* ok);
ParseStatement(ZoneList<const AstRawString * > * labels,bool * ok)1222 StatementT ParseStatement(ZoneList<const AstRawString*>* labels, bool* ok) {
1223 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok);
1224 }
1225 StatementT ParseStatement(ZoneList<const AstRawString*>* labels,
1226 AllowLabelledFunctionStatement allow_function,
1227 bool* ok);
1228 StatementT ParseStatementAsUnlabelled(ZoneList<const AstRawString*>* labels,
1229 bool* ok);
1230 BlockT ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok);
1231
1232 // Parse a SubStatement in strict mode, or with an extra block scope in
1233 // sloppy mode to handle
1234 // ES#sec-functiondeclarations-in-ifstatement-statement-clauses
1235 StatementT ParseScopedStatement(ZoneList<const AstRawString*>* labels,
1236 bool* ok);
1237
1238 StatementT ParseVariableStatement(VariableDeclarationContext var_context,
1239 ZoneList<const AstRawString*>* names,
1240 bool* ok);
1241
1242 // Magical syntax support.
1243 ExpressionT ParseV8Intrinsic(bool* ok);
1244
1245 ExpressionT ParseDoExpression(bool* ok);
1246
1247 StatementT ParseDebuggerStatement(bool* ok);
1248
1249 StatementT ParseExpressionOrLabelledStatement(
1250 ZoneList<const AstRawString*>* labels,
1251 AllowLabelledFunctionStatement allow_function, bool* ok);
1252 StatementT ParseIfStatement(ZoneList<const AstRawString*>* labels, bool* ok);
1253 StatementT ParseContinueStatement(bool* ok);
1254 StatementT ParseBreakStatement(ZoneList<const AstRawString*>* labels,
1255 bool* ok);
1256 StatementT ParseReturnStatement(bool* ok);
1257 StatementT ParseWithStatement(ZoneList<const AstRawString*>* labels,
1258 bool* ok);
1259 StatementT ParseDoWhileStatement(ZoneList<const AstRawString*>* labels,
1260 bool* ok);
1261 StatementT ParseWhileStatement(ZoneList<const AstRawString*>* labels,
1262 bool* ok);
1263 StatementT ParseThrowStatement(bool* ok);
1264 StatementT ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
1265 bool* ok);
1266 StatementT ParseTryStatement(bool* ok);
1267 StatementT ParseForStatement(ZoneList<const AstRawString*>* labels, bool* ok);
1268 StatementT ParseForEachStatementWithDeclarations(
1269 int stmt_pos, ForInfo* for_info, ZoneList<const AstRawString*>* labels,
1270 bool* ok);
1271 StatementT ParseForEachStatementWithoutDeclarations(
1272 int stmt_pos, ExpressionT expression, int lhs_beg_pos, int lhs_end_pos,
1273 ForInfo* for_info, ZoneList<const AstRawString*>* labels, bool* ok);
1274
1275 // Parse a C-style for loop: 'for (<init>; <cond>; <step>) { ... }'
1276 StatementT ParseStandardForLoop(int stmt_pos, StatementT init,
1277 bool bound_names_are_lexical,
1278 ForInfo* for_info, BlockState* for_state,
1279 ZoneList<const AstRawString*>* labels,
1280 bool* ok);
1281 StatementT ParseForAwaitStatement(ZoneList<const AstRawString*>* labels,
1282 bool* ok);
1283
1284 bool IsNextLetKeyword();
1285 bool IsTrivialExpression();
1286
1287 // Checks if the expression is a valid reference expression (e.g., on the
1288 // left-hand side of assignments). Although ruled out by ECMA as early errors,
1289 // we allow calls for web compatibility and rewrite them to a runtime throw.
1290 ExpressionT CheckAndRewriteReferenceExpression(
1291 ExpressionT expression, int beg_pos, int end_pos,
1292 MessageTemplate::Template message, bool* ok);
1293 ExpressionT CheckAndRewriteReferenceExpression(
1294 ExpressionT expression, int beg_pos, int end_pos,
1295 MessageTemplate::Template message, ParseErrorType type, bool* ok);
1296
1297 bool IsValidReferenceExpression(ExpressionT expression);
1298
IsAssignableIdentifier(ExpressionT expression)1299 bool IsAssignableIdentifier(ExpressionT expression) {
1300 if (!impl()->IsIdentifier(expression)) return false;
1301 if (is_strict(language_mode()) &&
1302 impl()->IsEvalOrArguments(impl()->AsIdentifier(expression))) {
1303 return false;
1304 }
1305 return true;
1306 }
1307
IsValidPattern(ExpressionT expression)1308 bool IsValidPattern(ExpressionT expression) {
1309 return expression->IsObjectLiteral() || expression->IsArrayLiteral();
1310 }
1311
1312 // Due to hoisting, the value of a 'var'-declared variable may actually change
1313 // even if the code contains only the "initial" assignment, namely when that
1314 // assignment occurs inside a loop. For example:
1315 //
1316 // let i = 10;
1317 // do { var x = i } while (i--):
1318 //
1319 // As a simple and very conservative approximation of this, we explicitly mark
1320 // as maybe-assigned any non-lexical variable whose initializing "declaration"
1321 // does not syntactically occur in the function scope. (In the example above,
1322 // it occurs in a block scope.)
1323 //
1324 // Note that non-lexical variables include temporaries, which may also get
1325 // assigned inside a loop due to the various rewritings that the parser
1326 // performs.
1327 //
1328 static void MarkLoopVariableAsAssigned(Scope* scope, Variable* var);
1329
1330 // Keep track of eval() calls since they disable all local variable
1331 // optimizations. This checks if expression is an eval call, and if yes,
1332 // forwards the information to scope.
CheckPossibleEvalCall(ExpressionT expression,Scope * scope)1333 Call::PossiblyEval CheckPossibleEvalCall(ExpressionT expression,
1334 Scope* scope) {
1335 if (impl()->IsIdentifier(expression) &&
1336 impl()->IsEval(impl()->AsIdentifier(expression))) {
1337 scope->RecordEvalCall();
1338 if (is_sloppy(scope->language_mode())) {
1339 // For sloppy scopes we also have to record the call at function level,
1340 // in case it includes declarations that will be hoisted.
1341 scope->GetDeclarationScope()->RecordEvalCall();
1342 }
1343 return Call::IS_POSSIBLY_EVAL;
1344 }
1345 return Call::NOT_EVAL;
1346 }
1347
1348 // Convenience method which determines the type of return statement to emit
1349 // depending on the current function type.
BuildReturnStatement(ExpressionT expr,int pos)1350 inline StatementT BuildReturnStatement(ExpressionT expr, int pos) {
1351 if (V8_UNLIKELY(is_async_function())) {
1352 return factory()->NewAsyncReturnStatement(expr, pos);
1353 }
1354 return factory()->NewReturnStatement(expr, pos);
1355 }
1356
1357 // Validation per ES6 object literals.
1358 class ObjectLiteralChecker {
1359 public:
ObjectLiteralChecker(ParserBase * parser)1360 explicit ObjectLiteralChecker(ParserBase* parser)
1361 : parser_(parser), has_seen_proto_(false) {}
1362
1363 void CheckDuplicateProto(Token::Value property);
1364
1365 private:
IsProto()1366 bool IsProto() { return this->scanner()->LiteralMatches("__proto__", 9); }
1367
parser()1368 ParserBase* parser() const { return parser_; }
scanner()1369 Scanner* scanner() const { return parser_->scanner(); }
1370
1371 ParserBase* parser_;
1372 bool has_seen_proto_;
1373 };
1374
1375 // Validation per ES6 class literals.
1376 class ClassLiteralChecker {
1377 public:
ClassLiteralChecker(ParserBase * parser)1378 explicit ClassLiteralChecker(ParserBase* parser)
1379 : parser_(parser), has_seen_constructor_(false) {}
1380
1381 void CheckClassMethodName(Token::Value property, PropertyKind type,
1382 bool is_generator, bool is_async, bool is_static,
1383 bool* ok);
1384
1385 private:
IsConstructor()1386 bool IsConstructor() {
1387 return this->scanner()->LiteralMatches("constructor", 11);
1388 }
IsPrototype()1389 bool IsPrototype() {
1390 return this->scanner()->LiteralMatches("prototype", 9);
1391 }
1392
parser()1393 ParserBase* parser() const { return parser_; }
scanner()1394 Scanner* scanner() const { return parser_->scanner(); }
1395
1396 ParserBase* parser_;
1397 bool has_seen_constructor_;
1398 };
1399
module()1400 ModuleDescriptor* module() const {
1401 return scope()->AsModuleScope()->module();
1402 }
scope()1403 Scope* scope() const { return scope_; }
1404
1405 // Stack of expression classifiers.
1406 // The top of the stack is always pointed to by classifier().
classifier()1407 V8_INLINE ExpressionClassifier* classifier() const {
1408 DCHECK_NOT_NULL(classifier_);
1409 return classifier_;
1410 }
1411
1412 // Accumulates the classifier that is on top of the stack (inner) to
1413 // the one that is right below (outer) and pops the inner.
1414 V8_INLINE void Accumulate(unsigned productions,
1415 bool merge_non_patterns = true) {
1416 DCHECK_NOT_NULL(classifier_);
1417 ExpressionClassifier* previous = classifier_->previous();
1418 DCHECK_NOT_NULL(previous);
1419 previous->Accumulate(classifier_, productions, merge_non_patterns);
1420 classifier_ = previous;
1421 }
1422
1423 // Pops and discards the classifier that is on top of the stack
1424 // without accumulating.
Discard()1425 V8_INLINE void Discard() {
1426 DCHECK_NOT_NULL(classifier_);
1427 classifier_->Discard();
1428 classifier_ = classifier_->previous();
1429 }
1430
1431 // Accumulate errors that can be arbitrarily deep in an expression.
1432 // These correspond to the ECMAScript spec's 'Contains' operation
1433 // on productions. This includes:
1434 //
1435 // - YieldExpression is disallowed in arrow parameters in a generator.
1436 // - AwaitExpression is disallowed in arrow parameters in an async function.
1437 // - AwaitExpression is disallowed in async arrow parameters.
1438 //
AccumulateFormalParameterContainmentErrors()1439 V8_INLINE void AccumulateFormalParameterContainmentErrors() {
1440 Accumulate(ExpressionClassifier::FormalParameterInitializerProduction |
1441 ExpressionClassifier::AsyncArrowFormalParametersProduction);
1442 }
1443
1444 // Parser base's protected field members.
1445
1446 Scope* scope_; // Scope stack.
1447 FunctionState* function_state_; // Function state stack.
1448 v8::Extension* extension_;
1449 FuncNameInferrer* fni_;
1450 AstValueFactory* ast_value_factory_; // Not owned.
1451 typename Types::Factory ast_node_factory_;
1452 RuntimeCallStats* runtime_call_stats_;
1453 bool parsing_on_main_thread_;
1454 bool parsing_module_;
1455 uintptr_t stack_limit_;
1456
1457 // Parser base's private field members.
1458
1459 private:
1460 Zone* zone_;
1461 ExpressionClassifier* classifier_;
1462
1463 Scanner* scanner_;
1464 bool stack_overflow_;
1465
1466 FunctionLiteral::EagerCompileHint default_eager_compile_hint_;
1467
1468 int function_literal_id_;
1469
1470 bool allow_natives_;
1471 bool allow_tailcalls_;
1472 bool allow_harmony_do_expressions_;
1473 bool allow_harmony_function_sent_;
1474 bool allow_harmony_restrictive_generators_;
1475 bool allow_harmony_trailing_commas_;
1476 bool allow_harmony_class_fields_;
1477 bool allow_harmony_object_rest_spread_;
1478 bool allow_harmony_dynamic_import_;
1479 bool allow_harmony_async_iteration_;
1480 bool allow_harmony_template_escapes_;
1481
1482 friend class DiscardableZoneScope;
1483 };
1484
1485 template <typename Impl>
FunctionState(FunctionState ** function_state_stack,Scope ** scope_stack,DeclarationScope * scope)1486 ParserBase<Impl>::FunctionState::FunctionState(
1487 FunctionState** function_state_stack, Scope** scope_stack,
1488 DeclarationScope* scope)
1489 : BlockState(scope_stack, scope),
1490 next_materialized_literal_index_(0),
1491 expected_property_count_(0),
1492 function_state_stack_(function_state_stack),
1493 outer_function_state_(*function_state_stack),
1494 scope_(scope),
1495 destructuring_assignments_to_rewrite_(16, scope->zone()),
1496 tail_call_expressions_(scope->zone()),
1497 return_expr_context_(ReturnExprContext::kInsideValidBlock),
1498 non_patterns_to_rewrite_(0, scope->zone()),
1499 reported_errors_(16, scope->zone()),
1500 next_function_is_likely_called_(false),
1501 previous_function_was_likely_called_(false) {
1502 *function_state_stack = this;
1503 if (outer_function_state_) {
1504 outer_function_state_->previous_function_was_likely_called_ =
1505 outer_function_state_->next_function_is_likely_called_;
1506 outer_function_state_->next_function_is_likely_called_ = false;
1507 }
1508 }
1509
1510 template <typename Impl>
~FunctionState()1511 ParserBase<Impl>::FunctionState::~FunctionState() {
1512 *function_state_stack_ = outer_function_state_;
1513 }
1514
1515 template <typename Impl>
GetUnexpectedTokenMessage(Token::Value token,MessageTemplate::Template * message,Scanner::Location * location,const char ** arg,MessageTemplate::Template default_)1516 void ParserBase<Impl>::GetUnexpectedTokenMessage(
1517 Token::Value token, MessageTemplate::Template* message,
1518 Scanner::Location* location, const char** arg,
1519 MessageTemplate::Template default_) {
1520 *arg = nullptr;
1521 switch (token) {
1522 case Token::EOS:
1523 *message = MessageTemplate::kUnexpectedEOS;
1524 break;
1525 case Token::SMI:
1526 case Token::NUMBER:
1527 *message = MessageTemplate::kUnexpectedTokenNumber;
1528 break;
1529 case Token::STRING:
1530 *message = MessageTemplate::kUnexpectedTokenString;
1531 break;
1532 case Token::IDENTIFIER:
1533 *message = MessageTemplate::kUnexpectedTokenIdentifier;
1534 break;
1535 case Token::AWAIT:
1536 case Token::ENUM:
1537 *message = MessageTemplate::kUnexpectedReserved;
1538 break;
1539 case Token::LET:
1540 case Token::STATIC:
1541 case Token::YIELD:
1542 case Token::FUTURE_STRICT_RESERVED_WORD:
1543 *message = is_strict(language_mode())
1544 ? MessageTemplate::kUnexpectedStrictReserved
1545 : MessageTemplate::kUnexpectedTokenIdentifier;
1546 break;
1547 case Token::TEMPLATE_SPAN:
1548 case Token::TEMPLATE_TAIL:
1549 *message = MessageTemplate::kUnexpectedTemplateString;
1550 break;
1551 case Token::ESCAPED_STRICT_RESERVED_WORD:
1552 case Token::ESCAPED_KEYWORD:
1553 *message = MessageTemplate::kInvalidEscapedReservedWord;
1554 break;
1555 case Token::ILLEGAL:
1556 if (scanner()->has_error()) {
1557 *message = scanner()->error();
1558 *location = scanner()->error_location();
1559 } else {
1560 *message = MessageTemplate::kInvalidOrUnexpectedToken;
1561 }
1562 break;
1563 case Token::REGEXP_LITERAL:
1564 *message = MessageTemplate::kUnexpectedTokenRegExp;
1565 break;
1566 default:
1567 const char* name = Token::String(token);
1568 DCHECK(name != NULL);
1569 *arg = name;
1570 break;
1571 }
1572 }
1573
1574 template <typename Impl>
ReportUnexpectedToken(Token::Value token)1575 void ParserBase<Impl>::ReportUnexpectedToken(Token::Value token) {
1576 return ReportUnexpectedTokenAt(scanner_->location(), token);
1577 }
1578
1579 template <typename Impl>
ReportUnexpectedTokenAt(Scanner::Location source_location,Token::Value token,MessageTemplate::Template message)1580 void ParserBase<Impl>::ReportUnexpectedTokenAt(
1581 Scanner::Location source_location, Token::Value token,
1582 MessageTemplate::Template message) {
1583 const char* arg;
1584 GetUnexpectedTokenMessage(token, &message, &source_location, &arg);
1585 impl()->ReportMessageAt(source_location, message, arg);
1586 }
1587
1588 template <typename Impl>
ParseIdentifier(AllowRestrictedIdentifiers allow_restricted_identifiers,bool * ok)1589 typename ParserBase<Impl>::IdentifierT ParserBase<Impl>::ParseIdentifier(
1590 AllowRestrictedIdentifiers allow_restricted_identifiers, bool* ok) {
1591 ExpressionClassifier classifier(this);
1592 auto result = ParseAndClassifyIdentifier(CHECK_OK_CUSTOM(EmptyIdentifier));
1593
1594 if (allow_restricted_identifiers == kDontAllowRestrictedIdentifiers) {
1595 ValidateAssignmentPattern(CHECK_OK_CUSTOM(EmptyIdentifier));
1596 ValidateBindingPattern(CHECK_OK_CUSTOM(EmptyIdentifier));
1597 }
1598
1599 return result;
1600 }
1601
1602 template <typename Impl>
1603 typename ParserBase<Impl>::IdentifierT
ParseAndClassifyIdentifier(bool * ok)1604 ParserBase<Impl>::ParseAndClassifyIdentifier(bool* ok) {
1605 Token::Value next = Next();
1606 if (next == Token::IDENTIFIER || next == Token::ASYNC ||
1607 (next == Token::AWAIT && !parsing_module_ && !is_async_function())) {
1608 IdentifierT name = impl()->GetSymbol();
1609 // When this function is used to read a formal parameter, we don't always
1610 // know whether the function is going to be strict or sloppy. Indeed for
1611 // arrow functions we don't always know that the identifier we are reading
1612 // is actually a formal parameter. Therefore besides the errors that we
1613 // must detect because we know we're in strict mode, we also record any
1614 // error that we might make in the future once we know the language mode.
1615 if (impl()->IsEvalOrArguments(name)) {
1616 classifier()->RecordStrictModeFormalParameterError(
1617 scanner()->location(), MessageTemplate::kStrictEvalArguments);
1618 if (is_strict(language_mode())) {
1619 classifier()->RecordBindingPatternError(
1620 scanner()->location(), MessageTemplate::kStrictEvalArguments);
1621 }
1622 } else if (next == Token::AWAIT) {
1623 classifier()->RecordAsyncArrowFormalParametersError(
1624 scanner()->location(), MessageTemplate::kAwaitBindingIdentifier);
1625 }
1626
1627 if (classifier()->duplicate_finder() != nullptr &&
1628 scanner()->FindSymbol(classifier()->duplicate_finder())) {
1629 classifier()->RecordDuplicateFormalParameterError(scanner()->location());
1630 }
1631 return name;
1632 } else if (is_sloppy(language_mode()) &&
1633 (next == Token::FUTURE_STRICT_RESERVED_WORD ||
1634 next == Token::ESCAPED_STRICT_RESERVED_WORD ||
1635 next == Token::LET || next == Token::STATIC ||
1636 (next == Token::YIELD && !is_generator()))) {
1637 classifier()->RecordStrictModeFormalParameterError(
1638 scanner()->location(), MessageTemplate::kUnexpectedStrictReserved);
1639 if (next == Token::ESCAPED_STRICT_RESERVED_WORD &&
1640 is_strict(language_mode())) {
1641 ReportUnexpectedToken(next);
1642 *ok = false;
1643 return impl()->EmptyIdentifier();
1644 }
1645 if (next == Token::LET ||
1646 (next == Token::ESCAPED_STRICT_RESERVED_WORD &&
1647 scanner()->is_literal_contextual_keyword(CStrVector("let")))) {
1648 classifier()->RecordLetPatternError(
1649 scanner()->location(), MessageTemplate::kLetInLexicalBinding);
1650 }
1651 return impl()->GetSymbol();
1652 } else {
1653 ReportUnexpectedToken(next);
1654 *ok = false;
1655 return impl()->EmptyIdentifier();
1656 }
1657 }
1658
1659 template <class Impl>
1660 typename ParserBase<Impl>::IdentifierT
ParseIdentifierOrStrictReservedWord(FunctionKind function_kind,bool * is_strict_reserved,bool * ok)1661 ParserBase<Impl>::ParseIdentifierOrStrictReservedWord(
1662 FunctionKind function_kind, bool* is_strict_reserved, bool* ok) {
1663 Token::Value next = Next();
1664 if (next == Token::IDENTIFIER || (next == Token::AWAIT && !parsing_module_ &&
1665 !IsAsyncFunction(function_kind)) ||
1666 next == Token::ASYNC) {
1667 *is_strict_reserved = false;
1668 } else if (next == Token::ESCAPED_STRICT_RESERVED_WORD ||
1669 next == Token::FUTURE_STRICT_RESERVED_WORD || next == Token::LET ||
1670 next == Token::STATIC ||
1671 (next == Token::YIELD && !IsGeneratorFunction(function_kind))) {
1672 *is_strict_reserved = true;
1673 } else {
1674 ReportUnexpectedToken(next);
1675 *ok = false;
1676 return impl()->EmptyIdentifier();
1677 }
1678
1679 return impl()->GetSymbol();
1680 }
1681
1682 template <typename Impl>
ParseIdentifierName(bool * ok)1683 typename ParserBase<Impl>::IdentifierT ParserBase<Impl>::ParseIdentifierName(
1684 bool* ok) {
1685 Token::Value next = Next();
1686 if (next != Token::IDENTIFIER && next != Token::ASYNC &&
1687 next != Token::ENUM && next != Token::AWAIT && next != Token::LET &&
1688 next != Token::STATIC && next != Token::YIELD &&
1689 next != Token::FUTURE_STRICT_RESERVED_WORD &&
1690 next != Token::ESCAPED_KEYWORD &&
1691 next != Token::ESCAPED_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) {
1692 ReportUnexpectedToken(next);
1693 *ok = false;
1694 return impl()->EmptyIdentifier();
1695 }
1696
1697 return impl()->GetSymbol();
1698 }
1699
1700 template <typename Impl>
ParseRegExpLiteral(bool * ok)1701 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseRegExpLiteral(
1702 bool* ok) {
1703 int pos = peek_position();
1704 if (!scanner()->ScanRegExpPattern()) {
1705 Next();
1706 ReportMessage(MessageTemplate::kUnterminatedRegExp);
1707 *ok = false;
1708 return impl()->EmptyExpression();
1709 }
1710
1711 IdentifierT js_pattern = impl()->GetNextSymbol();
1712 Maybe<RegExp::Flags> flags = scanner()->ScanRegExpFlags();
1713 if (flags.IsNothing()) {
1714 Next();
1715 ReportMessage(MessageTemplate::kMalformedRegExpFlags);
1716 *ok = false;
1717 return impl()->EmptyExpression();
1718 }
1719 int js_flags = flags.FromJust();
1720 Next();
1721 return factory()->NewRegExpLiteral(js_pattern, js_flags, pos);
1722 }
1723
1724 template <typename Impl>
ParsePrimaryExpression(bool * is_async,bool * ok)1725 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression(
1726 bool* is_async, bool* ok) {
1727 // PrimaryExpression ::
1728 // 'this'
1729 // 'null'
1730 // 'true'
1731 // 'false'
1732 // Identifier
1733 // Number
1734 // String
1735 // ArrayLiteral
1736 // ObjectLiteral
1737 // RegExpLiteral
1738 // ClassLiteral
1739 // '(' Expression ')'
1740 // TemplateLiteral
1741 // do Block
1742 // AsyncFunctionLiteral
1743
1744 int beg_pos = peek_position();
1745 switch (peek()) {
1746 case Token::THIS: {
1747 BindingPatternUnexpectedToken();
1748 Consume(Token::THIS);
1749 return impl()->ThisExpression(beg_pos);
1750 }
1751
1752 case Token::NULL_LITERAL:
1753 case Token::TRUE_LITERAL:
1754 case Token::FALSE_LITERAL:
1755 case Token::SMI:
1756 case Token::NUMBER:
1757 BindingPatternUnexpectedToken();
1758 return impl()->ExpressionFromLiteral(Next(), beg_pos);
1759
1760 case Token::ASYNC:
1761 if (!scanner()->HasAnyLineTerminatorAfterNext() &&
1762 PeekAhead() == Token::FUNCTION) {
1763 Consume(Token::ASYNC);
1764 return ParseAsyncFunctionLiteral(CHECK_OK);
1765 }
1766 // CoverCallExpressionAndAsyncArrowHead
1767 *is_async = true;
1768 /* falls through */
1769 case Token::IDENTIFIER:
1770 case Token::LET:
1771 case Token::STATIC:
1772 case Token::YIELD:
1773 case Token::AWAIT:
1774 case Token::ESCAPED_STRICT_RESERVED_WORD:
1775 case Token::FUTURE_STRICT_RESERVED_WORD: {
1776 // Using eval or arguments in this context is OK even in strict mode.
1777 IdentifierT name = ParseAndClassifyIdentifier(CHECK_OK);
1778 return impl()->ExpressionFromIdentifier(name, beg_pos);
1779 }
1780
1781 case Token::STRING: {
1782 BindingPatternUnexpectedToken();
1783 Consume(Token::STRING);
1784 return impl()->ExpressionFromString(beg_pos);
1785 }
1786
1787 case Token::ASSIGN_DIV:
1788 case Token::DIV:
1789 classifier()->RecordBindingPatternError(
1790 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp);
1791 return ParseRegExpLiteral(ok);
1792
1793 case Token::LBRACK:
1794 return ParseArrayLiteral(ok);
1795
1796 case Token::LBRACE:
1797 return ParseObjectLiteral(ok);
1798
1799 case Token::LPAREN: {
1800 // Arrow function formal parameters are either a single identifier or a
1801 // list of BindingPattern productions enclosed in parentheses.
1802 // Parentheses are not valid on the LHS of a BindingPattern, so we use the
1803 // is_valid_binding_pattern() check to detect multiple levels of
1804 // parenthesization.
1805 bool pattern_error = !classifier()->is_valid_binding_pattern();
1806 classifier()->RecordPatternError(scanner()->peek_location(),
1807 MessageTemplate::kUnexpectedToken,
1808 Token::String(Token::LPAREN));
1809 if (pattern_error) ArrowFormalParametersUnexpectedToken();
1810 Consume(Token::LPAREN);
1811 if (Check(Token::RPAREN)) {
1812 // ()=>x. The continuation that looks for the => is in
1813 // ParseAssignmentExpression.
1814 classifier()->RecordExpressionError(scanner()->location(),
1815 MessageTemplate::kUnexpectedToken,
1816 Token::String(Token::RPAREN));
1817 return factory()->NewEmptyParentheses(beg_pos);
1818 }
1819 // Heuristically try to detect immediately called functions before
1820 // seeing the call parentheses.
1821 if (peek() == Token::FUNCTION ||
1822 (peek() == Token::ASYNC && PeekAhead() == Token::FUNCTION)) {
1823 function_state_->set_next_function_is_likely_called();
1824 }
1825 ExpressionT expr = ParseExpressionCoverGrammar(true, CHECK_OK);
1826 Expect(Token::RPAREN, CHECK_OK);
1827 return expr;
1828 }
1829
1830 case Token::CLASS: {
1831 BindingPatternUnexpectedToken();
1832 Consume(Token::CLASS);
1833 int class_token_pos = position();
1834 IdentifierT name = impl()->EmptyIdentifier();
1835 bool is_strict_reserved_name = false;
1836 Scanner::Location class_name_location = Scanner::Location::invalid();
1837 if (peek_any_identifier()) {
1838 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
1839 CHECK_OK);
1840 class_name_location = scanner()->location();
1841 }
1842 return ParseClassLiteral(name, class_name_location,
1843 is_strict_reserved_name, class_token_pos, ok);
1844 }
1845
1846 case Token::TEMPLATE_SPAN:
1847 case Token::TEMPLATE_TAIL:
1848 BindingPatternUnexpectedToken();
1849 return ParseTemplateLiteral(impl()->NoTemplateTag(), beg_pos, false, ok);
1850
1851 case Token::MOD:
1852 if (allow_natives() || extension_ != NULL) {
1853 BindingPatternUnexpectedToken();
1854 return ParseV8Intrinsic(ok);
1855 }
1856 break;
1857
1858 case Token::DO:
1859 if (allow_harmony_do_expressions()) {
1860 BindingPatternUnexpectedToken();
1861 return ParseDoExpression(ok);
1862 }
1863 break;
1864
1865 default:
1866 break;
1867 }
1868
1869 ReportUnexpectedToken(Next());
1870 *ok = false;
1871 return impl()->EmptyExpression();
1872 }
1873
1874 template <typename Impl>
ParseExpression(bool accept_IN,bool * ok)1875 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression(
1876 bool accept_IN, bool* ok) {
1877 ExpressionClassifier classifier(this);
1878 ExpressionT result = ParseExpressionCoverGrammar(accept_IN, CHECK_OK);
1879 impl()->RewriteNonPattern(CHECK_OK);
1880 return result;
1881 }
1882
1883 template <typename Impl>
1884 typename ParserBase<Impl>::ExpressionT
ParseExpressionCoverGrammar(bool accept_IN,bool * ok)1885 ParserBase<Impl>::ParseExpressionCoverGrammar(bool accept_IN, bool* ok) {
1886 // Expression ::
1887 // AssignmentExpression
1888 // Expression ',' AssignmentExpression
1889
1890 ExpressionT result = impl()->EmptyExpression();
1891 while (true) {
1892 int comma_pos = position();
1893 ExpressionClassifier binding_classifier(this);
1894 ExpressionT right;
1895 if (Check(Token::ELLIPSIS)) {
1896 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only
1897 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a
1898 // valid expression.
1899 classifier()->RecordExpressionError(scanner()->location(),
1900 MessageTemplate::kUnexpectedToken,
1901 Token::String(Token::ELLIPSIS));
1902 int ellipsis_pos = position();
1903 int pattern_pos = peek_position();
1904 ExpressionT pattern = ParsePrimaryExpression(CHECK_OK);
1905 ValidateBindingPattern(CHECK_OK);
1906 right = factory()->NewSpread(pattern, ellipsis_pos, pattern_pos);
1907 } else {
1908 right = ParseAssignmentExpression(accept_IN, CHECK_OK);
1909 }
1910 // No need to accumulate binding pattern-related errors, since
1911 // an Expression can't be a binding pattern anyway.
1912 impl()->Accumulate(ExpressionClassifier::AllProductions &
1913 ~(ExpressionClassifier::BindingPatternProduction |
1914 ExpressionClassifier::LetPatternProduction));
1915 if (!impl()->IsIdentifier(right)) classifier()->RecordNonSimpleParameter();
1916 if (impl()->IsEmptyExpression(result)) {
1917 // First time through the loop.
1918 result = right;
1919 } else {
1920 result =
1921 factory()->NewBinaryOperation(Token::COMMA, result, right, comma_pos);
1922 }
1923
1924 if (!Check(Token::COMMA)) break;
1925
1926 if (right->IsSpread()) {
1927 classifier()->RecordArrowFormalParametersError(
1928 scanner()->location(), MessageTemplate::kParamAfterRest);
1929 }
1930
1931 if (allow_harmony_trailing_commas() && peek() == Token::RPAREN &&
1932 PeekAhead() == Token::ARROW) {
1933 // a trailing comma is allowed at the end of an arrow parameter list
1934 break;
1935 }
1936
1937 // Pass on the 'set_next_function_is_likely_called' flag if we have
1938 // several function literals separated by comma.
1939 if (peek() == Token::FUNCTION &&
1940 function_state_->previous_function_was_likely_called()) {
1941 function_state_->set_next_function_is_likely_called();
1942 }
1943 }
1944
1945 return result;
1946 }
1947
1948 template <typename Impl>
ParseArrayLiteral(bool * ok)1949 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral(
1950 bool* ok) {
1951 // ArrayLiteral ::
1952 // '[' Expression? (',' Expression?)* ']'
1953
1954 int pos = peek_position();
1955 ExpressionListT values = impl()->NewExpressionList(4);
1956 int first_spread_index = -1;
1957 Expect(Token::LBRACK, CHECK_OK);
1958 while (peek() != Token::RBRACK) {
1959 ExpressionT elem;
1960 if (peek() == Token::COMMA) {
1961 elem = impl()->GetLiteralTheHole(peek_position());
1962 } else if (peek() == Token::ELLIPSIS) {
1963 int start_pos = peek_position();
1964 Consume(Token::ELLIPSIS);
1965 int expr_pos = peek_position();
1966 ExpressionT argument = ParseAssignmentExpression(true, CHECK_OK);
1967 elem = factory()->NewSpread(argument, start_pos, expr_pos);
1968
1969 if (first_spread_index < 0) {
1970 first_spread_index = values->length();
1971 }
1972
1973 if (argument->IsAssignment()) {
1974 classifier()->RecordPatternError(
1975 Scanner::Location(start_pos, scanner()->location().end_pos),
1976 MessageTemplate::kInvalidDestructuringTarget);
1977 } else {
1978 CheckDestructuringElement(argument, start_pos,
1979 scanner()->location().end_pos);
1980 }
1981
1982 if (peek() == Token::COMMA) {
1983 classifier()->RecordPatternError(
1984 Scanner::Location(start_pos, scanner()->location().end_pos),
1985 MessageTemplate::kElementAfterRest);
1986 }
1987 } else {
1988 int beg_pos = peek_position();
1989 elem = ParseAssignmentExpression(true, CHECK_OK);
1990 CheckDestructuringElement(elem, beg_pos, scanner()->location().end_pos);
1991 }
1992 values->Add(elem, zone_);
1993 if (peek() != Token::RBRACK) {
1994 Expect(Token::COMMA, CHECK_OK);
1995 }
1996 }
1997 Expect(Token::RBRACK, CHECK_OK);
1998
1999 ExpressionT result =
2000 factory()->NewArrayLiteral(values, first_spread_index, pos);
2001 if (first_spread_index >= 0) {
2002 result = factory()->NewRewritableExpression(result);
2003 impl()->QueueNonPatternForRewriting(result, ok);
2004 if (!*ok) {
2005 // If the non-pattern rewriting mechanism is used in the future for
2006 // rewriting other things than spreads, this error message will have
2007 // to change. Also, this error message will never appear while pre-
2008 // parsing (this is OK, as it is an implementation limitation).
2009 ReportMessage(MessageTemplate::kTooManySpreads);
2010 return impl()->EmptyExpression();
2011 }
2012 }
2013 return result;
2014 }
2015
2016 template <class Impl>
SetPropertyKindFromToken(Token::Value token,PropertyKind * kind)2017 bool ParserBase<Impl>::SetPropertyKindFromToken(Token::Value token,
2018 PropertyKind* kind) {
2019 // This returns true, setting the property kind, iff the given token is one
2020 // which must occur after a property name, indicating that the previous token
2021 // was in fact a name and not a modifier (like the "get" in "get x").
2022 switch (token) {
2023 case Token::COLON:
2024 *kind = PropertyKind::kValueProperty;
2025 return true;
2026 case Token::COMMA:
2027 case Token::RBRACE:
2028 case Token::ASSIGN:
2029 *kind = PropertyKind::kShorthandProperty;
2030 return true;
2031 case Token::LPAREN:
2032 *kind = PropertyKind::kMethodProperty;
2033 return true;
2034 case Token::MUL:
2035 case Token::SEMICOLON:
2036 *kind = PropertyKind::kClassField;
2037 return true;
2038 default:
2039 break;
2040 }
2041 return false;
2042 }
2043
2044 template <class Impl>
ParsePropertyName(IdentifierT * name,PropertyKind * kind,bool * is_generator,bool * is_get,bool * is_set,bool * is_async,bool * is_computed_name,bool * ok)2045 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePropertyName(
2046 IdentifierT* name, PropertyKind* kind, bool* is_generator, bool* is_get,
2047 bool* is_set, bool* is_async, bool* is_computed_name, bool* ok) {
2048 DCHECK(*kind == PropertyKind::kNotSet);
2049 DCHECK(!*is_generator);
2050 DCHECK(!*is_get);
2051 DCHECK(!*is_set);
2052 DCHECK(!*is_async);
2053 DCHECK(!*is_computed_name);
2054
2055 *is_generator = Check(Token::MUL);
2056 if (*is_generator) {
2057 *kind = PropertyKind::kMethodProperty;
2058 }
2059
2060 Token::Value token = peek();
2061 int pos = peek_position();
2062
2063 if (!*is_generator && token == Token::ASYNC &&
2064 !scanner()->HasAnyLineTerminatorAfterNext()) {
2065 Consume(Token::ASYNC);
2066 token = peek();
2067 if (SetPropertyKindFromToken(token, kind)) {
2068 *name = impl()->GetSymbol(); // TODO(bakkot) specialize on 'async'
2069 impl()->PushLiteralName(*name);
2070 return factory()->NewStringLiteral(*name, pos);
2071 }
2072 *kind = PropertyKind::kMethodProperty;
2073 *is_async = true;
2074 pos = peek_position();
2075 }
2076
2077 if (token == Token::IDENTIFIER && !*is_generator && !*is_async) {
2078 // This is checking for 'get' and 'set' in particular.
2079 Consume(Token::IDENTIFIER);
2080 token = peek();
2081 if (SetPropertyKindFromToken(token, kind) ||
2082 !scanner()->IsGetOrSet(is_get, is_set)) {
2083 *name = impl()->GetSymbol();
2084 impl()->PushLiteralName(*name);
2085 return factory()->NewStringLiteral(*name, pos);
2086 }
2087 *kind = PropertyKind::kAccessorProperty;
2088 pos = peek_position();
2089 }
2090
2091 // For non computed property names we normalize the name a bit:
2092 //
2093 // "12" -> 12
2094 // 12.3 -> "12.3"
2095 // 12.30 -> "12.3"
2096 // identifier -> "identifier"
2097 //
2098 // This is important because we use the property name as a key in a hash
2099 // table when we compute constant properties.
2100 ExpressionT expression = impl()->EmptyExpression();
2101 switch (token) {
2102 case Token::STRING:
2103 Consume(Token::STRING);
2104 *name = impl()->GetSymbol();
2105 break;
2106
2107 case Token::SMI:
2108 Consume(Token::SMI);
2109 *name = impl()->GetNumberAsSymbol();
2110 break;
2111
2112 case Token::NUMBER:
2113 Consume(Token::NUMBER);
2114 *name = impl()->GetNumberAsSymbol();
2115 break;
2116
2117 case Token::LBRACK: {
2118 *name = impl()->EmptyIdentifier();
2119 *is_computed_name = true;
2120 Consume(Token::LBRACK);
2121 ExpressionClassifier computed_name_classifier(this);
2122 expression = ParseAssignmentExpression(true, CHECK_OK);
2123 impl()->RewriteNonPattern(CHECK_OK);
2124 impl()->AccumulateFormalParameterContainmentErrors();
2125 Expect(Token::RBRACK, CHECK_OK);
2126 break;
2127 }
2128
2129 case Token::ELLIPSIS:
2130 if (allow_harmony_object_rest_spread()) {
2131 *name = impl()->EmptyIdentifier();
2132 Consume(Token::ELLIPSIS);
2133 expression = ParseAssignmentExpression(true, CHECK_OK);
2134 *kind = PropertyKind::kSpreadProperty;
2135
2136 if (expression->IsAssignment()) {
2137 classifier()->RecordPatternError(
2138 scanner()->location(),
2139 MessageTemplate::kInvalidDestructuringTarget);
2140 } else {
2141 CheckDestructuringElement(expression, pos,
2142 scanner()->location().end_pos);
2143 }
2144
2145 if (peek() != Token::RBRACE) {
2146 classifier()->RecordPatternError(scanner()->location(),
2147 MessageTemplate::kElementAfterRest);
2148 }
2149 return expression;
2150 }
2151
2152 default:
2153 *name = ParseIdentifierName(CHECK_OK);
2154 break;
2155 }
2156
2157 if (*kind == PropertyKind::kNotSet) {
2158 SetPropertyKindFromToken(peek(), kind);
2159 }
2160
2161 if (*is_computed_name) {
2162 return expression;
2163 }
2164
2165 impl()->PushLiteralName(*name);
2166
2167 uint32_t index;
2168 return impl()->IsArrayIndex(*name, &index)
2169 ? factory()->NewNumberLiteral(index, pos)
2170 : factory()->NewStringLiteral(*name, pos);
2171 }
2172
2173 template <typename Impl>
2174 typename ParserBase<Impl>::ClassLiteralPropertyT
ParseClassPropertyDefinition(ClassLiteralChecker * checker,bool has_extends,bool * is_computed_name,bool * has_seen_constructor,ClassLiteralProperty::Kind * property_kind,bool * is_static,bool * has_name_static_property,bool * ok)2175 ParserBase<Impl>::ParseClassPropertyDefinition(
2176 ClassLiteralChecker* checker, bool has_extends, bool* is_computed_name,
2177 bool* has_seen_constructor, ClassLiteralProperty::Kind* property_kind,
2178 bool* is_static, bool* has_name_static_property, bool* ok) {
2179 DCHECK_NOT_NULL(has_seen_constructor);
2180 DCHECK_NOT_NULL(has_name_static_property);
2181 bool is_get = false;
2182 bool is_set = false;
2183 bool is_generator = false;
2184 bool is_async = false;
2185 *is_static = false;
2186 *property_kind = ClassLiteralProperty::METHOD;
2187 PropertyKind kind = PropertyKind::kNotSet;
2188
2189 Token::Value name_token = peek();
2190
2191 int function_token_position = scanner()->peek_location().beg_pos;
2192 IdentifierT name = impl()->EmptyIdentifier();
2193 ExpressionT name_expression;
2194 if (name_token == Token::STATIC) {
2195 Consume(Token::STATIC);
2196 function_token_position = scanner()->peek_location().beg_pos;
2197 if (peek() == Token::LPAREN) {
2198 kind = PropertyKind::kMethodProperty;
2199 name = impl()->GetSymbol(); // TODO(bakkot) specialize on 'static'
2200 name_expression = factory()->NewStringLiteral(name, position());
2201 } else if (peek() == Token::ASSIGN || peek() == Token::SEMICOLON ||
2202 peek() == Token::RBRACE) {
2203 name = impl()->GetSymbol(); // TODO(bakkot) specialize on 'static'
2204 name_expression = factory()->NewStringLiteral(name, position());
2205 } else {
2206 *is_static = true;
2207 name_expression = ParsePropertyName(
2208 &name, &kind, &is_generator, &is_get, &is_set, &is_async,
2209 is_computed_name, CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2210 }
2211 } else {
2212 name_expression = ParsePropertyName(
2213 &name, &kind, &is_generator, &is_get, &is_set, &is_async,
2214 is_computed_name, CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2215 }
2216
2217 if (!*has_name_static_property && *is_static && impl()->IsName(name)) {
2218 *has_name_static_property = true;
2219 }
2220
2221 switch (kind) {
2222 case PropertyKind::kClassField:
2223 case PropertyKind::kNotSet: // This case is a name followed by a name or
2224 // other property. Here we have to assume
2225 // that's an uninitialized field followed by a
2226 // linebreak followed by a property, with ASI
2227 // adding the semicolon. If not, there will be
2228 // a syntax error after parsing the first name
2229 // as an uninitialized field.
2230 case PropertyKind::kShorthandProperty:
2231 case PropertyKind::kValueProperty:
2232 if (allow_harmony_class_fields()) {
2233 bool has_initializer = Check(Token::ASSIGN);
2234 ExpressionT function_literal = ParseClassFieldForInitializer(
2235 has_initializer, CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2236 ExpectSemicolon(CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2237 *property_kind = ClassLiteralProperty::FIELD;
2238 return factory()->NewClassLiteralProperty(
2239 name_expression, function_literal, *property_kind, *is_static,
2240 *is_computed_name);
2241 } else {
2242 ReportUnexpectedToken(Next());
2243 *ok = false;
2244 return impl()->EmptyClassLiteralProperty();
2245 }
2246
2247 case PropertyKind::kMethodProperty: {
2248 DCHECK(!is_get && !is_set);
2249
2250 // MethodDefinition
2251 // PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'
2252 // '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'
2253
2254 if (!*is_computed_name) {
2255 checker->CheckClassMethodName(
2256 name_token, PropertyKind::kMethodProperty, is_generator, is_async,
2257 *is_static, CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2258 }
2259
2260 FunctionKind kind = is_generator
2261 ? FunctionKind::kConciseGeneratorMethod
2262 : is_async ? FunctionKind::kAsyncConciseMethod
2263 : FunctionKind::kConciseMethod;
2264
2265 if (!*is_static && impl()->IsConstructor(name)) {
2266 *has_seen_constructor = true;
2267 kind = has_extends ? FunctionKind::kDerivedConstructor
2268 : FunctionKind::kBaseConstructor;
2269 }
2270
2271 ExpressionT value = impl()->ParseFunctionLiteral(
2272 name, scanner()->location(), kSkipFunctionNameCheck, kind,
2273 FLAG_harmony_function_tostring ? function_token_position
2274 : kNoSourcePosition,
2275 FunctionLiteral::kAccessorOrMethod, language_mode(),
2276 CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2277
2278 *property_kind = ClassLiteralProperty::METHOD;
2279 return factory()->NewClassLiteralProperty(name_expression, value,
2280 *property_kind, *is_static,
2281 *is_computed_name);
2282 }
2283
2284 case PropertyKind::kAccessorProperty: {
2285 DCHECK((is_get || is_set) && !is_generator && !is_async);
2286
2287 if (!*is_computed_name) {
2288 checker->CheckClassMethodName(
2289 name_token, PropertyKind::kAccessorProperty, false, false,
2290 *is_static, CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2291 // Make sure the name expression is a string since we need a Name for
2292 // Runtime_DefineAccessorPropertyUnchecked and since we can determine
2293 // this statically we can skip the extra runtime check.
2294 name_expression =
2295 factory()->NewStringLiteral(name, name_expression->position());
2296 }
2297
2298 FunctionKind kind = is_get ? FunctionKind::kGetterFunction
2299 : FunctionKind::kSetterFunction;
2300
2301 FunctionLiteralT value = impl()->ParseFunctionLiteral(
2302 name, scanner()->location(), kSkipFunctionNameCheck, kind,
2303 FLAG_harmony_function_tostring ? function_token_position
2304 : kNoSourcePosition,
2305 FunctionLiteral::kAccessorOrMethod, language_mode(),
2306 CHECK_OK_CUSTOM(EmptyClassLiteralProperty));
2307
2308 if (!*is_computed_name) {
2309 impl()->AddAccessorPrefixToFunctionName(is_get, value, name);
2310 }
2311
2312 *property_kind =
2313 is_get ? ClassLiteralProperty::GETTER : ClassLiteralProperty::SETTER;
2314 return factory()->NewClassLiteralProperty(name_expression, value,
2315 *property_kind, *is_static,
2316 *is_computed_name);
2317 }
2318 case PropertyKind::kSpreadProperty:
2319 UNREACHABLE();
2320 }
2321 UNREACHABLE();
2322 return impl()->EmptyClassLiteralProperty();
2323 }
2324
2325 template <typename Impl>
2326 typename ParserBase<Impl>::FunctionLiteralT
ParseClassFieldForInitializer(bool has_initializer,bool * ok)2327 ParserBase<Impl>::ParseClassFieldForInitializer(bool has_initializer,
2328 bool* ok) {
2329 // Makes a concise method which evaluates and returns the initialized value
2330 // (or undefined if absent).
2331 FunctionKind kind = FunctionKind::kConciseMethod;
2332 DeclarationScope* initializer_scope = NewFunctionScope(kind);
2333 initializer_scope->set_start_position(scanner()->location().end_pos);
2334 FunctionState initializer_state(&function_state_, &scope_, initializer_scope);
2335 DCHECK_EQ(initializer_scope, scope());
2336 scope()->SetLanguageMode(STRICT);
2337 ExpressionClassifier expression_classifier(this);
2338 ExpressionT value;
2339 if (has_initializer) {
2340 value = this->ParseAssignmentExpression(
2341 true, CHECK_OK_CUSTOM(EmptyFunctionLiteral));
2342 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(EmptyFunctionLiteral));
2343 } else {
2344 value = factory()->NewUndefinedLiteral(kNoSourcePosition);
2345 }
2346 initializer_scope->set_end_position(scanner()->location().end_pos);
2347 typename Types::StatementList body = impl()->NewStatementList(1);
2348 body->Add(factory()->NewReturnStatement(value, kNoSourcePosition), zone());
2349 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
2350 impl()->EmptyIdentifierString(), initializer_scope, body,
2351 initializer_state.expected_property_count(), 0, 0,
2352 FunctionLiteral::kNoDuplicateParameters,
2353 FunctionLiteral::kAnonymousExpression, default_eager_compile_hint_,
2354 initializer_scope->start_position(), true, GetNextFunctionLiteralId());
2355 return function_literal;
2356 }
2357
2358 template <typename Impl>
2359 typename ParserBase<Impl>::ObjectLiteralPropertyT
ParseObjectPropertyDefinition(ObjectLiteralChecker * checker,bool * is_computed_name,bool * is_rest_property,bool * ok)2360 ParserBase<Impl>::ParseObjectPropertyDefinition(ObjectLiteralChecker* checker,
2361 bool* is_computed_name,
2362 bool* is_rest_property,
2363 bool* ok) {
2364 bool is_get = false;
2365 bool is_set = false;
2366 bool is_generator = false;
2367 bool is_async = false;
2368 PropertyKind kind = PropertyKind::kNotSet;
2369
2370 IdentifierT name = impl()->EmptyIdentifier();
2371 Token::Value name_token = peek();
2372 int next_beg_pos = scanner()->peek_location().beg_pos;
2373 int next_end_pos = scanner()->peek_location().end_pos;
2374
2375 ExpressionT name_expression = ParsePropertyName(
2376 &name, &kind, &is_generator, &is_get, &is_set, &is_async,
2377 is_computed_name, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2378
2379 switch (kind) {
2380 case PropertyKind::kSpreadProperty:
2381 DCHECK(allow_harmony_object_rest_spread());
2382 DCHECK(!is_get && !is_set && !is_generator && !is_async &&
2383 !*is_computed_name);
2384 DCHECK(name_token == Token::ELLIPSIS);
2385
2386 *is_computed_name = true;
2387 *is_rest_property = true;
2388
2389 return factory()->NewObjectLiteralProperty(
2390 impl()->GetLiteralTheHole(kNoSourcePosition), name_expression,
2391 ObjectLiteralProperty::SPREAD, true);
2392
2393 case PropertyKind::kValueProperty: {
2394 DCHECK(!is_get && !is_set && !is_generator && !is_async);
2395
2396 if (!*is_computed_name) {
2397 checker->CheckDuplicateProto(name_token);
2398 }
2399 Consume(Token::COLON);
2400 int beg_pos = peek_position();
2401 ExpressionT value = ParseAssignmentExpression(
2402 true, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2403 CheckDestructuringElement(value, beg_pos, scanner()->location().end_pos);
2404
2405 ObjectLiteralPropertyT result = factory()->NewObjectLiteralProperty(
2406 name_expression, value, *is_computed_name);
2407
2408 if (!*is_computed_name) {
2409 impl()->SetFunctionNameFromPropertyName(result, name);
2410 }
2411
2412 return result;
2413 }
2414
2415 case PropertyKind::kShorthandProperty: {
2416 // PropertyDefinition
2417 // IdentifierReference
2418 // CoverInitializedName
2419 //
2420 // CoverInitializedName
2421 // IdentifierReference Initializer?
2422 DCHECK(!is_get && !is_set && !is_generator && !is_async);
2423
2424 if (!Token::IsIdentifier(name_token, language_mode(),
2425 this->is_generator(),
2426 parsing_module_ || is_async_function())) {
2427 ReportUnexpectedToken(Next());
2428 *ok = false;
2429 return impl()->EmptyObjectLiteralProperty();
2430 }
2431
2432 DCHECK(!*is_computed_name);
2433
2434 if (classifier()->duplicate_finder() != nullptr &&
2435 scanner()->FindSymbol(classifier()->duplicate_finder())) {
2436 classifier()->RecordDuplicateFormalParameterError(
2437 scanner()->location());
2438 }
2439
2440 if (impl()->IsEvalOrArguments(name) && is_strict(language_mode())) {
2441 classifier()->RecordBindingPatternError(
2442 scanner()->location(), MessageTemplate::kStrictEvalArguments);
2443 }
2444
2445 if (name_token == Token::LET) {
2446 classifier()->RecordLetPatternError(
2447 scanner()->location(), MessageTemplate::kLetInLexicalBinding);
2448 }
2449 if (name_token == Token::AWAIT) {
2450 DCHECK(!is_async_function());
2451 classifier()->RecordAsyncArrowFormalParametersError(
2452 Scanner::Location(next_beg_pos, next_end_pos),
2453 MessageTemplate::kAwaitBindingIdentifier);
2454 }
2455 ExpressionT lhs = impl()->ExpressionFromIdentifier(name, next_beg_pos);
2456 CheckDestructuringElement(lhs, next_beg_pos, next_end_pos);
2457
2458 ExpressionT value;
2459 if (peek() == Token::ASSIGN) {
2460 Consume(Token::ASSIGN);
2461 ExpressionClassifier rhs_classifier(this);
2462 ExpressionT rhs = ParseAssignmentExpression(
2463 true, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2464 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2465 impl()->AccumulateFormalParameterContainmentErrors();
2466 value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs,
2467 kNoSourcePosition);
2468 classifier()->RecordExpressionError(
2469 Scanner::Location(next_beg_pos, scanner()->location().end_pos),
2470 MessageTemplate::kInvalidCoverInitializedName);
2471
2472 impl()->SetFunctionNameFromIdentifierRef(rhs, lhs);
2473 } else {
2474 value = lhs;
2475 }
2476
2477 return factory()->NewObjectLiteralProperty(
2478 name_expression, value, ObjectLiteralProperty::COMPUTED, false);
2479 }
2480
2481 case PropertyKind::kMethodProperty: {
2482 DCHECK(!is_get && !is_set);
2483
2484 // MethodDefinition
2485 // PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'
2486 // '*' PropertyName '(' StrictFormalParameters ')' '{' FunctionBody '}'
2487
2488 classifier()->RecordPatternError(
2489 Scanner::Location(next_beg_pos, scanner()->location().end_pos),
2490 MessageTemplate::kInvalidDestructuringTarget);
2491
2492 FunctionKind kind = is_generator
2493 ? FunctionKind::kConciseGeneratorMethod
2494 : is_async ? FunctionKind::kAsyncConciseMethod
2495 : FunctionKind::kConciseMethod;
2496
2497 ExpressionT value = impl()->ParseFunctionLiteral(
2498 name, scanner()->location(), kSkipFunctionNameCheck, kind,
2499 FLAG_harmony_function_tostring ? next_beg_pos : kNoSourcePosition,
2500 FunctionLiteral::kAccessorOrMethod, language_mode(),
2501 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2502
2503 return factory()->NewObjectLiteralProperty(
2504 name_expression, value, ObjectLiteralProperty::COMPUTED,
2505 *is_computed_name);
2506 }
2507
2508 case PropertyKind::kAccessorProperty: {
2509 DCHECK((is_get || is_set) && !(is_set && is_get) && !is_generator &&
2510 !is_async);
2511
2512 classifier()->RecordPatternError(
2513 Scanner::Location(next_beg_pos, scanner()->location().end_pos),
2514 MessageTemplate::kInvalidDestructuringTarget);
2515
2516 if (!*is_computed_name) {
2517 // Make sure the name expression is a string since we need a Name for
2518 // Runtime_DefineAccessorPropertyUnchecked and since we can determine
2519 // this statically we can skip the extra runtime check.
2520 name_expression =
2521 factory()->NewStringLiteral(name, name_expression->position());
2522 }
2523
2524 FunctionKind kind = is_get ? FunctionKind::kGetterFunction
2525 : FunctionKind::kSetterFunction;
2526
2527 FunctionLiteralT value = impl()->ParseFunctionLiteral(
2528 name, scanner()->location(), kSkipFunctionNameCheck, kind,
2529 FLAG_harmony_function_tostring ? next_beg_pos : kNoSourcePosition,
2530 FunctionLiteral::kAccessorOrMethod, language_mode(),
2531 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
2532
2533 if (!*is_computed_name) {
2534 impl()->AddAccessorPrefixToFunctionName(is_get, value, name);
2535 }
2536
2537 return factory()->NewObjectLiteralProperty(
2538 name_expression, value, is_get ? ObjectLiteralProperty::GETTER
2539 : ObjectLiteralProperty::SETTER,
2540 *is_computed_name);
2541 }
2542
2543 case PropertyKind::kClassField:
2544 case PropertyKind::kNotSet:
2545 ReportUnexpectedToken(Next());
2546 *ok = false;
2547 return impl()->EmptyObjectLiteralProperty();
2548 }
2549 UNREACHABLE();
2550 return impl()->EmptyObjectLiteralProperty();
2551 }
2552
2553 template <typename Impl>
ParseObjectLiteral(bool * ok)2554 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral(
2555 bool* ok) {
2556 // ObjectLiteral ::
2557 // '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'
2558
2559 int pos = peek_position();
2560 typename Types::ObjectPropertyList properties =
2561 impl()->NewObjectPropertyList(4);
2562 int number_of_boilerplate_properties = 0;
2563
2564 bool has_computed_names = false;
2565 bool has_rest_property = false;
2566 ObjectLiteralChecker checker(this);
2567
2568 Expect(Token::LBRACE, CHECK_OK);
2569
2570 while (peek() != Token::RBRACE) {
2571 FuncNameInferrer::State fni_state(fni_);
2572
2573 bool is_computed_name = false;
2574 bool is_rest_property = false;
2575 ObjectLiteralPropertyT property = ParseObjectPropertyDefinition(
2576 &checker, &is_computed_name, &is_rest_property, CHECK_OK);
2577
2578 if (is_computed_name) {
2579 has_computed_names = true;
2580 }
2581
2582 if (is_rest_property) {
2583 has_rest_property = true;
2584 }
2585
2586 if (impl()->IsBoilerplateProperty(property) && !has_computed_names) {
2587 // Count CONSTANT or COMPUTED properties to maintain the enumeration
2588 // order.
2589 number_of_boilerplate_properties++;
2590 }
2591
2592 properties->Add(property, zone());
2593
2594 if (peek() != Token::RBRACE) {
2595 // Need {} because of the CHECK_OK macro.
2596 Expect(Token::COMMA, CHECK_OK);
2597 }
2598
2599 if (fni_ != nullptr) fni_->Infer();
2600 }
2601 Expect(Token::RBRACE, CHECK_OK);
2602
2603 // In pattern rewriter, we rewrite rest property to call out to a
2604 // runtime function passing all the other properties as arguments to
2605 // this runtime function. Here, we make sure that the number of
2606 // properties is less than number of arguments allowed for a runtime
2607 // call.
2608 if (has_rest_property && properties->length() > Code::kMaxArguments) {
2609 this->classifier()->RecordPatternError(Scanner::Location(pos, position()),
2610 MessageTemplate::kTooManyArguments);
2611 }
2612
2613 return factory()->NewObjectLiteral(
2614 properties, number_of_boilerplate_properties, pos, has_rest_property);
2615 }
2616
2617 template <typename Impl>
ParseArguments(Scanner::Location * first_spread_arg_loc,bool maybe_arrow,bool * ok)2618 typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments(
2619 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) {
2620 // Arguments ::
2621 // '(' (AssignmentExpression)*[','] ')'
2622
2623 Scanner::Location spread_arg = Scanner::Location::invalid();
2624 ExpressionListT result = impl()->NewExpressionList(4);
2625 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList));
2626 bool done = (peek() == Token::RPAREN);
2627 while (!done) {
2628 int start_pos = peek_position();
2629 bool is_spread = Check(Token::ELLIPSIS);
2630 int expr_pos = peek_position();
2631
2632 ExpressionT argument =
2633 ParseAssignmentExpression(true, CHECK_OK_CUSTOM(NullExpressionList));
2634 if (!maybe_arrow) {
2635 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullExpressionList));
2636 }
2637 if (is_spread) {
2638 if (!spread_arg.IsValid()) {
2639 spread_arg.beg_pos = start_pos;
2640 spread_arg.end_pos = peek_position();
2641 }
2642 argument = factory()->NewSpread(argument, start_pos, expr_pos);
2643 }
2644 result->Add(argument, zone_);
2645
2646 if (result->length() > Code::kMaxArguments) {
2647 ReportMessage(MessageTemplate::kTooManyArguments);
2648 *ok = false;
2649 return impl()->NullExpressionList();
2650 }
2651 done = (peek() != Token::COMMA);
2652 if (!done) {
2653 Next();
2654 if (allow_harmony_trailing_commas() && peek() == Token::RPAREN) {
2655 // allow trailing comma
2656 done = true;
2657 }
2658 }
2659 }
2660 Scanner::Location location = scanner_->location();
2661 if (Token::RPAREN != Next()) {
2662 impl()->ReportMessageAt(location, MessageTemplate::kUnterminatedArgList);
2663 *ok = false;
2664 return impl()->NullExpressionList();
2665 }
2666 *first_spread_arg_loc = spread_arg;
2667
2668 if (!maybe_arrow || peek() != Token::ARROW) {
2669 if (maybe_arrow) {
2670 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullExpressionList));
2671 }
2672 }
2673
2674 return result;
2675 }
2676
2677 // Precedence = 2
2678 template <typename Impl>
2679 typename ParserBase<Impl>::ExpressionT
ParseAssignmentExpression(bool accept_IN,bool * ok)2680 ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, bool* ok) {
2681 // AssignmentExpression ::
2682 // ConditionalExpression
2683 // ArrowFunction
2684 // YieldExpression
2685 // LeftHandSideExpression AssignmentOperator AssignmentExpression
2686 int lhs_beg_pos = peek_position();
2687
2688 if (peek() == Token::YIELD && is_generator()) {
2689 return ParseYieldExpression(accept_IN, ok);
2690 }
2691
2692 FuncNameInferrer::State fni_state(fni_);
2693 Checkpoint checkpoint(this);
2694 ExpressionClassifier arrow_formals_classifier(
2695 this, classifier()->duplicate_finder());
2696
2697 Scope::Snapshot scope_snapshot(scope());
2698 int rewritable_length =
2699 function_state_->destructuring_assignments_to_rewrite().length();
2700
2701 bool is_async = peek() == Token::ASYNC &&
2702 !scanner()->HasAnyLineTerminatorAfterNext() &&
2703 IsValidArrowFormalParametersStart(PeekAhead());
2704
2705 bool parenthesized_formals = peek() == Token::LPAREN;
2706 if (!is_async && !parenthesized_formals) {
2707 ArrowFormalParametersUnexpectedToken();
2708 }
2709
2710 // Parse a simple, faster sub-grammar (primary expression) if it's evident
2711 // that we have only a trivial expression to parse.
2712 ExpressionT expression;
2713 if (IsTrivialExpression()) {
2714 expression = ParsePrimaryExpression(&is_async, CHECK_OK);
2715 } else {
2716 expression = ParseConditionalExpression(accept_IN, CHECK_OK);
2717 }
2718
2719 if (is_async && impl()->IsIdentifier(expression) && peek_any_identifier() &&
2720 PeekAhead() == Token::ARROW) {
2721 // async Identifier => AsyncConciseBody
2722 IdentifierT name = ParseAndClassifyIdentifier(CHECK_OK);
2723 expression =
2724 impl()->ExpressionFromIdentifier(name, position(), InferName::kNo);
2725 if (fni_) {
2726 // Remove `async` keyword from inferred name stack.
2727 fni_->RemoveAsyncKeywordFromEnd();
2728 }
2729 }
2730
2731 if (peek() == Token::ARROW) {
2732 Scanner::Location arrow_loc = scanner()->peek_location();
2733 ValidateArrowFormalParameters(expression, parenthesized_formals, is_async,
2734 CHECK_OK);
2735 // This reads strangely, but is correct: it checks whether any
2736 // sub-expression of the parameter list failed to be a valid formal
2737 // parameter initializer. Since YieldExpressions are banned anywhere
2738 // in an arrow parameter list, this is correct.
2739 // TODO(adamk): Rename "FormalParameterInitializerError" to refer to
2740 // "YieldExpression", which is its only use.
2741 ValidateFormalParameterInitializer(ok);
2742
2743 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos);
2744 DeclarationScope* scope =
2745 NewFunctionScope(is_async ? FunctionKind::kAsyncArrowFunction
2746 : FunctionKind::kArrowFunction);
2747 // Because the arrow's parameters were parsed in the outer scope, any
2748 // usage flags that might have been triggered there need to be copied
2749 // to the arrow scope.
2750 this->scope()->PropagateUsageFlagsToScope(scope);
2751
2752 scope_snapshot.Reparent(scope);
2753 function_state_->SetDestructuringAssignmentsScope(rewritable_length, scope);
2754
2755 FormalParametersT parameters(scope);
2756 if (!classifier()->is_simple_parameter_list()) {
2757 scope->SetHasNonSimpleParameters();
2758 parameters.is_simple = false;
2759 }
2760
2761 checkpoint.Restore(¶meters.materialized_literals_count);
2762
2763 scope->set_start_position(lhs_beg_pos);
2764 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2765 impl()->DeclareArrowFunctionFormalParameters(¶meters, expression, loc,
2766 &duplicate_loc, CHECK_OK);
2767 if (duplicate_loc.IsValid()) {
2768 classifier()->RecordDuplicateFormalParameterError(duplicate_loc);
2769 }
2770 expression = ParseArrowFunctionLiteral(accept_IN, parameters,
2771 rewritable_length, CHECK_OK);
2772 impl()->Discard();
2773 classifier()->RecordPatternError(arrow_loc,
2774 MessageTemplate::kUnexpectedToken,
2775 Token::String(Token::ARROW));
2776
2777 if (fni_ != nullptr) fni_->Infer();
2778
2779 return expression;
2780 }
2781
2782 // "expression" was not itself an arrow function parameter list, but it might
2783 // form part of one. Propagate speculative formal parameter error locations
2784 // (including those for binding patterns, since formal parameters can
2785 // themselves contain binding patterns).
2786 unsigned productions = ExpressionClassifier::AllProductions &
2787 ~ExpressionClassifier::ArrowFormalParametersProduction;
2788
2789 // Parenthesized identifiers and property references are allowed as part
2790 // of a larger assignment pattern, even though parenthesized patterns
2791 // themselves are not allowed, e.g., "[(x)] = []". Only accumulate
2792 // assignment pattern errors if the parsed expression is more complex.
2793 if (IsValidReferenceExpression(expression)) {
2794 productions &= ~ExpressionClassifier::AssignmentPatternProduction;
2795 }
2796
2797 const bool is_destructuring_assignment =
2798 IsValidPattern(expression) && peek() == Token::ASSIGN;
2799 if (is_destructuring_assignment) {
2800 // This is definitely not an expression so don't accumulate
2801 // expression-related errors.
2802 productions &= ~ExpressionClassifier::ExpressionProduction;
2803 }
2804
2805 if (!Token::IsAssignmentOp(peek())) {
2806 // Parsed conditional expression only (no assignment).
2807 // Pending non-pattern expressions must be merged.
2808 impl()->Accumulate(productions);
2809 return expression;
2810 } else {
2811 // Pending non-pattern expressions must be discarded.
2812 impl()->Accumulate(productions, false);
2813 }
2814
2815 if (is_destructuring_assignment) {
2816 ValidateAssignmentPattern(CHECK_OK);
2817 } else {
2818 expression = CheckAndRewriteReferenceExpression(
2819 expression, lhs_beg_pos, scanner()->location().end_pos,
2820 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK);
2821 }
2822
2823 impl()->MarkExpressionAsAssigned(expression);
2824
2825 Token::Value op = Next(); // Get assignment operator.
2826 if (op != Token::ASSIGN) {
2827 classifier()->RecordPatternError(scanner()->location(),
2828 MessageTemplate::kUnexpectedToken,
2829 Token::String(op));
2830 }
2831 int pos = position();
2832
2833 ExpressionClassifier rhs_classifier(this);
2834
2835 ExpressionT right = ParseAssignmentExpression(accept_IN, CHECK_OK);
2836 impl()->RewriteNonPattern(CHECK_OK);
2837 impl()->AccumulateFormalParameterContainmentErrors();
2838
2839 // TODO(1231235): We try to estimate the set of properties set by
2840 // constructors. We define a new property whenever there is an
2841 // assignment to a property of 'this'. We should probably only add
2842 // properties if we haven't seen them before. Otherwise we'll
2843 // probably overestimate the number of properties.
2844 if (op == Token::ASSIGN && impl()->IsThisProperty(expression)) {
2845 function_state_->AddProperty();
2846 }
2847
2848 impl()->CheckAssigningFunctionLiteralToProperty(expression, right);
2849
2850 if (fni_ != NULL) {
2851 // Check if the right hand side is a call to avoid inferring a
2852 // name if we're dealing with "a = function(){...}();"-like
2853 // expression.
2854 if ((op == Token::INIT || op == Token::ASSIGN) &&
2855 (!right->IsCall() && !right->IsCallNew())) {
2856 fni_->Infer();
2857 } else {
2858 fni_->RemoveLastFunction();
2859 }
2860 }
2861
2862 if (op == Token::ASSIGN) {
2863 impl()->SetFunctionNameFromIdentifierRef(right, expression);
2864 }
2865
2866 if (op == Token::ASSIGN_EXP) {
2867 DCHECK(!is_destructuring_assignment);
2868 return impl()->RewriteAssignExponentiation(expression, right, pos);
2869 }
2870
2871 ExpressionT result = factory()->NewAssignment(op, expression, right, pos);
2872
2873 if (is_destructuring_assignment) {
2874 result = factory()->NewRewritableExpression(result);
2875 impl()->QueueDestructuringAssignmentForRewriting(result);
2876 }
2877
2878 return result;
2879 }
2880
2881 template <typename Impl>
ParseYieldExpression(bool accept_IN,bool * ok)2882 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseYieldExpression(
2883 bool accept_IN, bool* ok) {
2884 // YieldExpression ::
2885 // 'yield' ([no line terminator] '*'? AssignmentExpression)?
2886 int pos = peek_position();
2887 classifier()->RecordPatternError(
2888 scanner()->peek_location(), MessageTemplate::kInvalidDestructuringTarget);
2889 classifier()->RecordFormalParameterInitializerError(
2890 scanner()->peek_location(), MessageTemplate::kYieldInParameter);
2891 Expect(Token::YIELD, CHECK_OK);
2892 ExpressionT generator_object =
2893 factory()->NewVariableProxy(function_state_->generator_object_variable());
2894 // The following initialization is necessary.
2895 ExpressionT expression = impl()->EmptyExpression();
2896 bool delegating = false; // yield*
2897 if (!scanner()->HasAnyLineTerminatorBeforeNext()) {
2898 if (Check(Token::MUL)) delegating = true;
2899 switch (peek()) {
2900 case Token::EOS:
2901 case Token::SEMICOLON:
2902 case Token::RBRACE:
2903 case Token::RBRACK:
2904 case Token::RPAREN:
2905 case Token::COLON:
2906 case Token::COMMA:
2907 // The above set of tokens is the complete set of tokens that can appear
2908 // after an AssignmentExpression, and none of them can start an
2909 // AssignmentExpression. This allows us to avoid looking for an RHS for
2910 // a regular yield, given only one look-ahead token.
2911 if (!delegating) break;
2912 // Delegating yields require an RHS; fall through.
2913 default:
2914 expression = ParseAssignmentExpression(accept_IN, CHECK_OK);
2915 impl()->RewriteNonPattern(CHECK_OK);
2916 break;
2917 }
2918 }
2919
2920 if (delegating) {
2921 return impl()->RewriteYieldStar(generator_object, expression, pos);
2922 }
2923
2924 expression = impl()->BuildIteratorResult(expression, false);
2925 // Hackily disambiguate o from o.next and o [Symbol.iterator]().
2926 // TODO(verwaest): Come up with a better solution.
2927 ExpressionT yield = factory()->NewYield(generator_object, expression, pos,
2928 Yield::kOnExceptionThrow);
2929 return yield;
2930 }
2931
2932 // Precedence = 3
2933 template <typename Impl>
2934 typename ParserBase<Impl>::ExpressionT
ParseConditionalExpression(bool accept_IN,bool * ok)2935 ParserBase<Impl>::ParseConditionalExpression(bool accept_IN,
2936 bool* ok) {
2937 // ConditionalExpression ::
2938 // LogicalOrExpression
2939 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
2940
2941 int pos = peek_position();
2942 // We start using the binary expression parser for prec >= 4 only!
2943 ExpressionT expression = ParseBinaryExpression(4, accept_IN, CHECK_OK);
2944 if (peek() != Token::CONDITIONAL) return expression;
2945 impl()->RewriteNonPattern(CHECK_OK);
2946 BindingPatternUnexpectedToken();
2947 ArrowFormalParametersUnexpectedToken();
2948 Consume(Token::CONDITIONAL);
2949 // In parsing the first assignment expression in conditional
2950 // expressions we always accept the 'in' keyword; see ECMA-262,
2951 // section 11.12, page 58.
2952 ExpressionT left = ParseAssignmentExpression(true, CHECK_OK);
2953 impl()->RewriteNonPattern(CHECK_OK);
2954 Expect(Token::COLON, CHECK_OK);
2955 ExpressionT right = ParseAssignmentExpression(accept_IN, CHECK_OK);
2956 impl()->RewriteNonPattern(CHECK_OK);
2957 return factory()->NewConditional(expression, left, right, pos);
2958 }
2959
2960
2961 // Precedence >= 4
2962 template <typename Impl>
ParseBinaryExpression(int prec,bool accept_IN,bool * ok)2963 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseBinaryExpression(
2964 int prec, bool accept_IN, bool* ok) {
2965 DCHECK(prec >= 4);
2966 ExpressionT x = ParseUnaryExpression(CHECK_OK);
2967 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
2968 // prec1 >= 4
2969 while (Precedence(peek(), accept_IN) == prec1) {
2970 impl()->RewriteNonPattern(CHECK_OK);
2971 BindingPatternUnexpectedToken();
2972 ArrowFormalParametersUnexpectedToken();
2973 Token::Value op = Next();
2974 int pos = position();
2975
2976 const bool is_right_associative = op == Token::EXP;
2977 const int next_prec = is_right_associative ? prec1 : prec1 + 1;
2978 ExpressionT y = ParseBinaryExpression(next_prec, accept_IN, CHECK_OK);
2979 impl()->RewriteNonPattern(CHECK_OK);
2980
2981 if (impl()->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos)) {
2982 continue;
2983 }
2984
2985 // For now we distinguish between comparisons and other binary
2986 // operations. (We could combine the two and get rid of this
2987 // code and AST node eventually.)
2988 if (Token::IsCompareOp(op)) {
2989 // We have a comparison.
2990 Token::Value cmp = op;
2991 switch (op) {
2992 case Token::NE: cmp = Token::EQ; break;
2993 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break;
2994 default: break;
2995 }
2996 x = factory()->NewCompareOperation(cmp, x, y, pos);
2997 if (cmp != op) {
2998 // The comparison was negated - add a NOT.
2999 x = factory()->NewUnaryOperation(Token::NOT, x, pos);
3000 }
3001 } else if (op == Token::EXP) {
3002 x = impl()->RewriteExponentiation(x, y, pos);
3003 } else {
3004 // We have a "normal" binary operation.
3005 x = factory()->NewBinaryOperation(op, x, y, pos);
3006 }
3007 }
3008 }
3009 return x;
3010 }
3011
3012 template <typename Impl>
ParseUnaryExpression(bool * ok)3013 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseUnaryExpression(
3014 bool* ok) {
3015 // UnaryExpression ::
3016 // PostfixExpression
3017 // 'delete' UnaryExpression
3018 // 'void' UnaryExpression
3019 // 'typeof' UnaryExpression
3020 // '++' UnaryExpression
3021 // '--' UnaryExpression
3022 // '+' UnaryExpression
3023 // '-' UnaryExpression
3024 // '~' UnaryExpression
3025 // '!' UnaryExpression
3026 // [+Await] AwaitExpression[?Yield]
3027
3028 Token::Value op = peek();
3029 if (Token::IsUnaryOp(op)) {
3030 BindingPatternUnexpectedToken();
3031 ArrowFormalParametersUnexpectedToken();
3032
3033 op = Next();
3034 int pos = position();
3035
3036 // Assume "! function ..." indicates the function is likely to be called.
3037 if (op == Token::NOT && peek() == Token::FUNCTION) {
3038 function_state_->set_next_function_is_likely_called();
3039 }
3040
3041 ExpressionT expression = ParseUnaryExpression(CHECK_OK);
3042 impl()->RewriteNonPattern(CHECK_OK);
3043
3044 if (op == Token::DELETE && is_strict(language_mode())) {
3045 if (impl()->IsIdentifier(expression)) {
3046 // "delete identifier" is a syntax error in strict mode.
3047 ReportMessage(MessageTemplate::kStrictDelete);
3048 *ok = false;
3049 return impl()->EmptyExpression();
3050 }
3051 }
3052
3053 if (peek() == Token::EXP) {
3054 ReportUnexpectedToken(Next());
3055 *ok = false;
3056 return impl()->EmptyExpression();
3057 }
3058
3059 // Allow the parser's implementation to rewrite the expression.
3060 return impl()->BuildUnaryExpression(expression, op, pos);
3061 } else if (Token::IsCountOp(op)) {
3062 BindingPatternUnexpectedToken();
3063 ArrowFormalParametersUnexpectedToken();
3064 op = Next();
3065 int beg_pos = peek_position();
3066 ExpressionT expression = ParseUnaryExpression(CHECK_OK);
3067 expression = CheckAndRewriteReferenceExpression(
3068 expression, beg_pos, scanner()->location().end_pos,
3069 MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK);
3070 impl()->MarkExpressionAsAssigned(expression);
3071 impl()->RewriteNonPattern(CHECK_OK);
3072
3073 return factory()->NewCountOperation(op,
3074 true /* prefix */,
3075 expression,
3076 position());
3077
3078 } else if (is_async_function() && peek() == Token::AWAIT) {
3079 classifier()->RecordFormalParameterInitializerError(
3080 scanner()->peek_location(),
3081 MessageTemplate::kAwaitExpressionFormalParameter);
3082
3083 int await_pos = peek_position();
3084 Consume(Token::AWAIT);
3085
3086 ExpressionT value = ParseUnaryExpression(CHECK_OK);
3087
3088 return impl()->RewriteAwaitExpression(value, await_pos);
3089 } else {
3090 return ParsePostfixExpression(ok);
3091 }
3092 }
3093
3094 template <typename Impl>
ParsePostfixExpression(bool * ok)3095 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePostfixExpression(
3096 bool* ok) {
3097 // PostfixExpression ::
3098 // LeftHandSideExpression ('++' | '--')?
3099
3100 int lhs_beg_pos = peek_position();
3101 ExpressionT expression = ParseLeftHandSideExpression(CHECK_OK);
3102 if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
3103 Token::IsCountOp(peek())) {
3104 BindingPatternUnexpectedToken();
3105 ArrowFormalParametersUnexpectedToken();
3106
3107 expression = CheckAndRewriteReferenceExpression(
3108 expression, lhs_beg_pos, scanner()->location().end_pos,
3109 MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK);
3110 impl()->MarkExpressionAsAssigned(expression);
3111 impl()->RewriteNonPattern(CHECK_OK);
3112
3113 Token::Value next = Next();
3114 expression =
3115 factory()->NewCountOperation(next,
3116 false /* postfix */,
3117 expression,
3118 position());
3119 }
3120 return expression;
3121 }
3122
3123 template <typename Impl>
3124 typename ParserBase<Impl>::ExpressionT
ParseLeftHandSideExpression(bool * ok)3125 ParserBase<Impl>::ParseLeftHandSideExpression(bool* ok) {
3126 // LeftHandSideExpression ::
3127 // (NewExpression | MemberExpression) ...
3128
3129 bool is_async = false;
3130 ExpressionT result =
3131 ParseMemberWithNewPrefixesExpression(&is_async, CHECK_OK);
3132
3133 while (true) {
3134 switch (peek()) {
3135 case Token::LBRACK: {
3136 impl()->RewriteNonPattern(CHECK_OK);
3137 BindingPatternUnexpectedToken();
3138 ArrowFormalParametersUnexpectedToken();
3139 Consume(Token::LBRACK);
3140 int pos = position();
3141 ExpressionT index = ParseExpressionCoverGrammar(true, CHECK_OK);
3142 impl()->RewriteNonPattern(CHECK_OK);
3143 result = factory()->NewProperty(result, index, pos);
3144 Expect(Token::RBRACK, CHECK_OK);
3145 break;
3146 }
3147
3148 case Token::LPAREN: {
3149 int pos;
3150 impl()->RewriteNonPattern(CHECK_OK);
3151 BindingPatternUnexpectedToken();
3152 if (scanner()->current_token() == Token::IDENTIFIER ||
3153 scanner()->current_token() == Token::SUPER ||
3154 scanner()->current_token() == Token::ASYNC) {
3155 // For call of an identifier we want to report position of
3156 // the identifier as position of the call in the stack trace.
3157 pos = position();
3158 } else {
3159 // For other kinds of calls we record position of the parenthesis as
3160 // position of the call. Note that this is extremely important for
3161 // expressions of the form function(){...}() for which call position
3162 // should not point to the closing brace otherwise it will intersect
3163 // with positions recorded for function literal and confuse debugger.
3164 pos = peek_position();
3165 // Also the trailing parenthesis are a hint that the function will
3166 // be called immediately. If we happen to have parsed a preceding
3167 // function literal eagerly, we can also compile it eagerly.
3168 if (result->IsFunctionLiteral()) {
3169 result->AsFunctionLiteral()->SetShouldEagerCompile();
3170 }
3171 }
3172 Scanner::Location spread_pos;
3173 ExpressionListT args;
3174 if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) {
3175 ExpressionClassifier async_classifier(this);
3176 args = ParseArguments(&spread_pos, true, CHECK_OK);
3177 if (peek() == Token::ARROW) {
3178 if (fni_) {
3179 fni_->RemoveAsyncKeywordFromEnd();
3180 }
3181 ValidateBindingPattern(CHECK_OK);
3182 ValidateFormalParameterInitializer(CHECK_OK);
3183 if (!classifier()->is_valid_async_arrow_formal_parameters()) {
3184 ReportClassifierError(
3185 classifier()->async_arrow_formal_parameters_error());
3186 *ok = false;
3187 return impl()->EmptyExpression();
3188 }
3189 if (args->length()) {
3190 // async ( Arguments ) => ...
3191 return impl()->ExpressionListToExpression(args);
3192 }
3193 // async () => ...
3194 return factory()->NewEmptyParentheses(pos);
3195 } else {
3196 impl()->AccumulateFormalParameterContainmentErrors();
3197 }
3198 } else {
3199 args = ParseArguments(&spread_pos, false, CHECK_OK);
3200 }
3201
3202 ArrowFormalParametersUnexpectedToken();
3203
3204 // Keep track of eval() calls since they disable all local variable
3205 // optimizations.
3206 // The calls that need special treatment are the
3207 // direct eval calls. These calls are all of the form eval(...), with
3208 // no explicit receiver.
3209 // These calls are marked as potentially direct eval calls. Whether
3210 // they are actually direct calls to eval is determined at run time.
3211 Call::PossiblyEval is_possibly_eval =
3212 CheckPossibleEvalCall(result, scope());
3213
3214 bool is_super_call = result->IsSuperCallReference();
3215 if (spread_pos.IsValid()) {
3216 result = impl()->SpreadCall(result, args, pos, is_possibly_eval);
3217 } else {
3218 result = factory()->NewCall(result, args, pos, is_possibly_eval);
3219 }
3220
3221 // Explicit calls to the super constructor using super() perform an
3222 // implicit binding assignment to the 'this' variable.
3223 if (is_super_call) {
3224 ExpressionT this_expr = impl()->ThisExpression(pos);
3225 result =
3226 factory()->NewAssignment(Token::INIT, this_expr, result, pos);
3227 }
3228
3229 if (fni_ != NULL) fni_->RemoveLastFunction();
3230 break;
3231 }
3232
3233 case Token::PERIOD: {
3234 impl()->RewriteNonPattern(CHECK_OK);
3235 BindingPatternUnexpectedToken();
3236 ArrowFormalParametersUnexpectedToken();
3237 Consume(Token::PERIOD);
3238 int pos = position();
3239 IdentifierT name = ParseIdentifierName(CHECK_OK);
3240 result = factory()->NewProperty(
3241 result, factory()->NewStringLiteral(name, pos), pos);
3242 impl()->PushLiteralName(name);
3243 break;
3244 }
3245
3246 case Token::TEMPLATE_SPAN:
3247 case Token::TEMPLATE_TAIL: {
3248 impl()->RewriteNonPattern(CHECK_OK);
3249 BindingPatternUnexpectedToken();
3250 ArrowFormalParametersUnexpectedToken();
3251 result = ParseTemplateLiteral(result, position(), true, CHECK_OK);
3252 break;
3253 }
3254
3255 default:
3256 return result;
3257 }
3258 }
3259 }
3260
3261 template <typename Impl>
3262 typename ParserBase<Impl>::ExpressionT
ParseMemberWithNewPrefixesExpression(bool * is_async,bool * ok)3263 ParserBase<Impl>::ParseMemberWithNewPrefixesExpression(bool* is_async,
3264 bool* ok) {
3265 // NewExpression ::
3266 // ('new')+ MemberExpression
3267 //
3268 // NewTarget ::
3269 // 'new' '.' 'target'
3270
3271 // The grammar for new expressions is pretty warped. We can have several 'new'
3272 // keywords following each other, and then a MemberExpression. When we see '('
3273 // after the MemberExpression, it's associated with the rightmost unassociated
3274 // 'new' to create a NewExpression with arguments. However, a NewExpression
3275 // can also occur without arguments.
3276
3277 // Examples of new expression:
3278 // new foo.bar().baz means (new (foo.bar)()).baz
3279 // new foo()() means (new foo())()
3280 // new new foo()() means (new (new foo())())
3281 // new new foo means new (new foo)
3282 // new new foo() means new (new foo())
3283 // new new foo().bar().baz means (new (new foo()).bar()).baz
3284
3285 if (peek() == Token::NEW) {
3286 BindingPatternUnexpectedToken();
3287 ArrowFormalParametersUnexpectedToken();
3288 Consume(Token::NEW);
3289 int new_pos = position();
3290 ExpressionT result;
3291 if (peek() == Token::SUPER) {
3292 const bool is_new = true;
3293 result = ParseSuperExpression(is_new, CHECK_OK);
3294 } else if (allow_harmony_dynamic_import() && peek() == Token::IMPORT) {
3295 impl()->ReportMessageAt(scanner()->peek_location(),
3296 MessageTemplate::kImportCallNotNewExpression);
3297 *ok = false;
3298 return impl()->EmptyExpression();
3299 } else if (peek() == Token::PERIOD) {
3300 return ParseNewTargetExpression(CHECK_OK);
3301 } else {
3302 result = ParseMemberWithNewPrefixesExpression(is_async, CHECK_OK);
3303 }
3304 impl()->RewriteNonPattern(CHECK_OK);
3305 if (peek() == Token::LPAREN) {
3306 // NewExpression with arguments.
3307 Scanner::Location spread_pos;
3308 ExpressionListT args = ParseArguments(&spread_pos, CHECK_OK);
3309
3310 if (spread_pos.IsValid()) {
3311 result = impl()->SpreadCallNew(result, args, new_pos);
3312 } else {
3313 result = factory()->NewCallNew(result, args, new_pos);
3314 }
3315 // The expression can still continue with . or [ after the arguments.
3316 result = ParseMemberExpressionContinuation(result, is_async, CHECK_OK);
3317 return result;
3318 }
3319 // NewExpression without arguments.
3320 return factory()->NewCallNew(result, impl()->NewExpressionList(0), new_pos);
3321 }
3322 // No 'new' or 'super' keyword.
3323 return ParseMemberExpression(is_async, ok);
3324 }
3325
3326 template <typename Impl>
ParseMemberExpression(bool * is_async,bool * ok)3327 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression(
3328 bool* is_async, bool* ok) {
3329 // MemberExpression ::
3330 // (PrimaryExpression | FunctionLiteral | ClassLiteral)
3331 // ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*
3332 //
3333 // CallExpression ::
3334 // (SuperCall | ImportCall)
3335 // ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)*
3336 //
3337 // The '[' Expression ']' and '.' Identifier parts are parsed by
3338 // ParseMemberExpressionContinuation, and the Arguments part is parsed by the
3339 // caller.
3340
3341 // Parse the initial primary or function expression.
3342 ExpressionT result;
3343 if (peek() == Token::FUNCTION) {
3344 BindingPatternUnexpectedToken();
3345 ArrowFormalParametersUnexpectedToken();
3346
3347 Consume(Token::FUNCTION);
3348 int function_token_position = position();
3349
3350 if (allow_harmony_function_sent() && peek() == Token::PERIOD) {
3351 // function.sent
3352 int pos = position();
3353 ExpectMetaProperty(CStrVector("sent"), "function.sent", pos, CHECK_OK);
3354
3355 if (!is_generator()) {
3356 // TODO(neis): allow escaping into closures?
3357 impl()->ReportMessageAt(scanner()->location(),
3358 MessageTemplate::kUnexpectedFunctionSent);
3359 *ok = false;
3360 return impl()->EmptyExpression();
3361 }
3362
3363 return impl()->FunctionSentExpression(pos);
3364 }
3365
3366 FunctionKind function_kind = Check(Token::MUL)
3367 ? FunctionKind::kGeneratorFunction
3368 : FunctionKind::kNormalFunction;
3369 IdentifierT name = impl()->EmptyIdentifier();
3370 bool is_strict_reserved_name = false;
3371 Scanner::Location function_name_location = Scanner::Location::invalid();
3372 FunctionLiteral::FunctionType function_type =
3373 FunctionLiteral::kAnonymousExpression;
3374 if (impl()->ParsingDynamicFunctionDeclaration()) {
3375 // We don't want dynamic functions to actually declare their name
3376 // "anonymous". We just want that name in the toString().
3377 Consume(Token::IDENTIFIER);
3378 DCHECK(scanner()->UnescapedLiteralMatches("anonymous", 9));
3379 } else if (peek_any_identifier()) {
3380 name = ParseIdentifierOrStrictReservedWord(
3381 function_kind, &is_strict_reserved_name, CHECK_OK);
3382 function_name_location = scanner()->location();
3383 function_type = FunctionLiteral::kNamedExpression;
3384 }
3385 result = impl()->ParseFunctionLiteral(
3386 name, function_name_location,
3387 is_strict_reserved_name ? kFunctionNameIsStrictReserved
3388 : kFunctionNameValidityUnknown,
3389 function_kind, function_token_position, function_type, language_mode(),
3390 CHECK_OK);
3391 } else if (peek() == Token::SUPER) {
3392 const bool is_new = false;
3393 result = ParseSuperExpression(is_new, CHECK_OK);
3394 } else if (allow_harmony_dynamic_import() && peek() == Token::IMPORT) {
3395 result = ParseDynamicImportExpression(CHECK_OK);
3396 } else {
3397 result = ParsePrimaryExpression(is_async, CHECK_OK);
3398 }
3399
3400 result = ParseMemberExpressionContinuation(result, is_async, CHECK_OK);
3401 return result;
3402 }
3403
3404 template <typename Impl>
3405 typename ParserBase<Impl>::ExpressionT
ParseDynamicImportExpression(bool * ok)3406 ParserBase<Impl>::ParseDynamicImportExpression(bool* ok) {
3407 DCHECK(allow_harmony_dynamic_import());
3408 Consume(Token::IMPORT);
3409 int pos = position();
3410 Expect(Token::LPAREN, CHECK_OK);
3411 ExpressionT arg = ParseAssignmentExpression(true, CHECK_OK);
3412 Expect(Token::RPAREN, CHECK_OK);
3413 ZoneList<ExpressionT>* args = new (zone()) ZoneList<ExpressionT>(1, zone());
3414 args->Add(arg, zone());
3415 return factory()->NewCallRuntime(Runtime::kDynamicImportCall, args, pos);
3416 }
3417
3418 template <typename Impl>
ParseSuperExpression(bool is_new,bool * ok)3419 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseSuperExpression(
3420 bool is_new, bool* ok) {
3421 Expect(Token::SUPER, CHECK_OK);
3422 int pos = position();
3423
3424 DeclarationScope* scope = GetReceiverScope();
3425 FunctionKind kind = scope->function_kind();
3426 if (IsConciseMethod(kind) || IsAccessorFunction(kind) ||
3427 IsClassConstructor(kind)) {
3428 if (peek() == Token::PERIOD || peek() == Token::LBRACK) {
3429 scope->RecordSuperPropertyUsage();
3430 return impl()->NewSuperPropertyReference(pos);
3431 }
3432 // new super() is never allowed.
3433 // super() is only allowed in derived constructor
3434 if (!is_new && peek() == Token::LPAREN && IsDerivedConstructor(kind)) {
3435 // TODO(rossberg): This might not be the correct FunctionState for the
3436 // method here.
3437 return impl()->NewSuperCallReference(pos);
3438 }
3439 }
3440
3441 impl()->ReportMessageAt(scanner()->location(),
3442 MessageTemplate::kUnexpectedSuper);
3443 *ok = false;
3444 return impl()->EmptyExpression();
3445 }
3446
3447 template <typename Impl>
ExpectMetaProperty(Vector<const char> property_name,const char * full_name,int pos,bool * ok)3448 void ParserBase<Impl>::ExpectMetaProperty(Vector<const char> property_name,
3449 const char* full_name, int pos,
3450 bool* ok) {
3451 Consume(Token::PERIOD);
3452 ExpectContextualKeyword(property_name, CHECK_OK_CUSTOM(Void));
3453 if (scanner()->literal_contains_escapes()) {
3454 impl()->ReportMessageAt(
3455 Scanner::Location(pos, scanner()->location().end_pos),
3456 MessageTemplate::kInvalidEscapedMetaProperty, full_name);
3457 *ok = false;
3458 }
3459 }
3460
3461 template <typename Impl>
3462 typename ParserBase<Impl>::ExpressionT
ParseNewTargetExpression(bool * ok)3463 ParserBase<Impl>::ParseNewTargetExpression(bool* ok) {
3464 int pos = position();
3465 ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK);
3466
3467 if (!GetReceiverScope()->is_function_scope()) {
3468 impl()->ReportMessageAt(scanner()->location(),
3469 MessageTemplate::kUnexpectedNewTarget);
3470 *ok = false;
3471 return impl()->EmptyExpression();
3472 }
3473
3474 return impl()->NewTargetExpression(pos);
3475 }
3476
3477 template <typename Impl>
3478 typename ParserBase<Impl>::ExpressionT
ParseMemberExpressionContinuation(ExpressionT expression,bool * is_async,bool * ok)3479 ParserBase<Impl>::ParseMemberExpressionContinuation(ExpressionT expression,
3480 bool* is_async, bool* ok) {
3481 // Parses this part of MemberExpression:
3482 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)*
3483 while (true) {
3484 switch (peek()) {
3485 case Token::LBRACK: {
3486 *is_async = false;
3487 impl()->RewriteNonPattern(CHECK_OK);
3488 BindingPatternUnexpectedToken();
3489 ArrowFormalParametersUnexpectedToken();
3490
3491 Consume(Token::LBRACK);
3492 int pos = position();
3493 ExpressionT index = ParseExpressionCoverGrammar(true, CHECK_OK);
3494 impl()->RewriteNonPattern(CHECK_OK);
3495 expression = factory()->NewProperty(expression, index, pos);
3496 impl()->PushPropertyName(index);
3497 Expect(Token::RBRACK, CHECK_OK);
3498 break;
3499 }
3500 case Token::PERIOD: {
3501 *is_async = false;
3502 impl()->RewriteNonPattern(CHECK_OK);
3503 BindingPatternUnexpectedToken();
3504 ArrowFormalParametersUnexpectedToken();
3505
3506 Consume(Token::PERIOD);
3507 int pos = position();
3508 IdentifierT name = ParseIdentifierName(CHECK_OK);
3509 expression = factory()->NewProperty(
3510 expression, factory()->NewStringLiteral(name, pos), pos);
3511 impl()->PushLiteralName(name);
3512 break;
3513 }
3514 case Token::TEMPLATE_SPAN:
3515 case Token::TEMPLATE_TAIL: {
3516 *is_async = false;
3517 impl()->RewriteNonPattern(CHECK_OK);
3518 BindingPatternUnexpectedToken();
3519 ArrowFormalParametersUnexpectedToken();
3520 int pos;
3521 if (scanner()->current_token() == Token::IDENTIFIER) {
3522 pos = position();
3523 } else {
3524 pos = peek_position();
3525 if (expression->IsFunctionLiteral()) {
3526 // If the tag function looks like an IIFE, set_parenthesized() to
3527 // force eager compilation.
3528 expression->AsFunctionLiteral()->SetShouldEagerCompile();
3529 }
3530 }
3531 expression = ParseTemplateLiteral(expression, pos, true, CHECK_OK);
3532 break;
3533 }
3534 case Token::ILLEGAL: {
3535 ReportUnexpectedTokenAt(scanner()->peek_location(), Token::ILLEGAL);
3536 *ok = false;
3537 return impl()->EmptyExpression();
3538 }
3539 default:
3540 return expression;
3541 }
3542 }
3543 DCHECK(false);
3544 return impl()->EmptyExpression();
3545 }
3546
3547 template <typename Impl>
ParseFormalParameter(FormalParametersT * parameters,bool * ok)3548 void ParserBase<Impl>::ParseFormalParameter(FormalParametersT* parameters,
3549 bool* ok) {
3550 // FormalParameter[Yield,GeneratorParameter] :
3551 // BindingElement[?Yield, ?GeneratorParameter]
3552 bool is_rest = parameters->has_rest;
3553
3554 ExpressionT pattern = ParsePrimaryExpression(CHECK_OK_CUSTOM(Void));
3555 ValidateBindingPattern(CHECK_OK_CUSTOM(Void));
3556
3557 if (!impl()->IsIdentifier(pattern)) {
3558 parameters->is_simple = false;
3559 ValidateFormalParameterInitializer(CHECK_OK_CUSTOM(Void));
3560 classifier()->RecordNonSimpleParameter();
3561 }
3562
3563 ExpressionT initializer = impl()->EmptyExpression();
3564 if (!is_rest && Check(Token::ASSIGN)) {
3565 ExpressionClassifier init_classifier(this);
3566 initializer = ParseAssignmentExpression(true, CHECK_OK_CUSTOM(Void));
3567 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(Void));
3568 ValidateFormalParameterInitializer(CHECK_OK_CUSTOM(Void));
3569 parameters->is_simple = false;
3570 impl()->Discard();
3571 classifier()->RecordNonSimpleParameter();
3572
3573 impl()->SetFunctionNameFromIdentifierRef(initializer, pattern);
3574 }
3575
3576 impl()->AddFormalParameter(parameters, pattern, initializer,
3577 scanner()->location().end_pos, is_rest);
3578 }
3579
3580 template <typename Impl>
ParseFormalParameterList(FormalParametersT * parameters,bool * ok)3581 void ParserBase<Impl>::ParseFormalParameterList(FormalParametersT* parameters,
3582 bool* ok) {
3583 // FormalParameters[Yield] :
3584 // [empty]
3585 // FunctionRestParameter[?Yield]
3586 // FormalParameterList[?Yield]
3587 // FormalParameterList[?Yield] ,
3588 // FormalParameterList[?Yield] , FunctionRestParameter[?Yield]
3589 //
3590 // FormalParameterList[Yield] :
3591 // FormalParameter[?Yield]
3592 // FormalParameterList[?Yield] , FormalParameter[?Yield]
3593
3594 DCHECK_EQ(0, parameters->arity);
3595
3596 if (peek() != Token::RPAREN) {
3597 while (true) {
3598 if (parameters->arity > Code::kMaxArguments) {
3599 ReportMessage(MessageTemplate::kTooManyParameters);
3600 *ok = false;
3601 return;
3602 }
3603 parameters->has_rest = Check(Token::ELLIPSIS);
3604 ParseFormalParameter(parameters, CHECK_OK_CUSTOM(Void));
3605
3606 if (parameters->has_rest) {
3607 parameters->is_simple = false;
3608 classifier()->RecordNonSimpleParameter();
3609 if (peek() == Token::COMMA) {
3610 impl()->ReportMessageAt(scanner()->peek_location(),
3611 MessageTemplate::kParamAfterRest);
3612 *ok = false;
3613 return;
3614 }
3615 break;
3616 }
3617 if (!Check(Token::COMMA)) break;
3618 if (allow_harmony_trailing_commas() && peek() == Token::RPAREN) {
3619 // allow the trailing comma
3620 break;
3621 }
3622 }
3623 }
3624
3625 impl()->DeclareFormalParameters(parameters->scope, parameters->params);
3626 }
3627
3628 template <typename Impl>
ParseVariableDeclarations(VariableDeclarationContext var_context,DeclarationParsingResult * parsing_result,ZoneList<const AstRawString * > * names,bool * ok)3629 typename ParserBase<Impl>::BlockT ParserBase<Impl>::ParseVariableDeclarations(
3630 VariableDeclarationContext var_context,
3631 DeclarationParsingResult* parsing_result,
3632 ZoneList<const AstRawString*>* names, bool* ok) {
3633 // VariableDeclarations ::
3634 // ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']
3635 //
3636 // ES6:
3637 // FIXME(marja, nikolaos): Add an up-to-date comment about ES6 variable
3638 // declaration syntax.
3639
3640 DCHECK_NOT_NULL(parsing_result);
3641 parsing_result->descriptor.declaration_kind = DeclarationDescriptor::NORMAL;
3642 parsing_result->descriptor.declaration_pos = peek_position();
3643 parsing_result->descriptor.initialization_pos = peek_position();
3644
3645 BlockT init_block = impl()->NullBlock();
3646 if (var_context != kForStatement) {
3647 init_block = factory()->NewBlock(
3648 nullptr, 1, true, parsing_result->descriptor.declaration_pos);
3649 }
3650
3651 switch (peek()) {
3652 case Token::VAR:
3653 parsing_result->descriptor.mode = VAR;
3654 Consume(Token::VAR);
3655 break;
3656 case Token::CONST:
3657 Consume(Token::CONST);
3658 DCHECK(var_context != kStatement);
3659 parsing_result->descriptor.mode = CONST;
3660 break;
3661 case Token::LET:
3662 Consume(Token::LET);
3663 DCHECK(var_context != kStatement);
3664 parsing_result->descriptor.mode = LET;
3665 break;
3666 default:
3667 UNREACHABLE(); // by current callers
3668 break;
3669 }
3670
3671 parsing_result->descriptor.scope = scope();
3672
3673 int bindings_start = peek_position();
3674 do {
3675 // Parse binding pattern.
3676 FuncNameInferrer::State fni_state(fni_);
3677
3678 ExpressionT pattern = impl()->EmptyExpression();
3679 int decl_pos = peek_position();
3680 {
3681 ExpressionClassifier pattern_classifier(this);
3682 pattern = ParsePrimaryExpression(CHECK_OK_CUSTOM(NullBlock));
3683
3684 ValidateBindingPattern(CHECK_OK_CUSTOM(NullBlock));
3685 if (IsLexicalVariableMode(parsing_result->descriptor.mode)) {
3686 ValidateLetPattern(CHECK_OK_CUSTOM(NullBlock));
3687 }
3688 }
3689
3690 Scanner::Location variable_loc = scanner()->location();
3691 bool single_name = impl()->IsIdentifier(pattern);
3692
3693 if (single_name) {
3694 impl()->PushVariableName(impl()->AsIdentifier(pattern));
3695 }
3696
3697 ExpressionT value = impl()->EmptyExpression();
3698 int initializer_position = kNoSourcePosition;
3699 if (Check(Token::ASSIGN)) {
3700 ExpressionClassifier classifier(this);
3701 value = ParseAssignmentExpression(var_context != kForStatement,
3702 CHECK_OK_CUSTOM(NullBlock));
3703 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullBlock));
3704 variable_loc.end_pos = scanner()->location().end_pos;
3705
3706 if (!parsing_result->first_initializer_loc.IsValid()) {
3707 parsing_result->first_initializer_loc = variable_loc;
3708 }
3709
3710 // Don't infer if it is "a = function(){...}();"-like expression.
3711 if (single_name && fni_ != nullptr) {
3712 if (!value->IsCall() && !value->IsCallNew()) {
3713 fni_->Infer();
3714 } else {
3715 fni_->RemoveLastFunction();
3716 }
3717 }
3718
3719 impl()->SetFunctionNameFromIdentifierRef(value, pattern);
3720
3721 // End position of the initializer is after the assignment expression.
3722 initializer_position = scanner()->location().end_pos;
3723 } else {
3724 if (var_context != kForStatement || !PeekInOrOf()) {
3725 // ES6 'const' and binding patterns require initializers.
3726 if (parsing_result->descriptor.mode == CONST ||
3727 !impl()->IsIdentifier(pattern)) {
3728 impl()->ReportMessageAt(
3729 Scanner::Location(decl_pos, scanner()->location().end_pos),
3730 MessageTemplate::kDeclarationMissingInitializer,
3731 !impl()->IsIdentifier(pattern) ? "destructuring" : "const");
3732 *ok = false;
3733 return impl()->NullBlock();
3734 }
3735 // 'let x' initializes 'x' to undefined.
3736 if (parsing_result->descriptor.mode == LET) {
3737 value = impl()->GetLiteralUndefined(position());
3738 }
3739 }
3740
3741 // End position of the initializer is after the variable.
3742 initializer_position = position();
3743 }
3744
3745 typename DeclarationParsingResult::Declaration decl(
3746 pattern, initializer_position, value);
3747 if (var_context == kForStatement) {
3748 // Save the declaration for further handling in ParseForStatement.
3749 parsing_result->declarations.Add(decl);
3750 } else {
3751 // Immediately declare the variable otherwise. This avoids O(N^2)
3752 // behavior (where N is the number of variables in a single
3753 // declaration) in the PatternRewriter having to do with removing
3754 // and adding VariableProxies to the Scope (see bug 4699).
3755 impl()->DeclareAndInitializeVariables(init_block,
3756 &parsing_result->descriptor, &decl,
3757 names, CHECK_OK_CUSTOM(NullBlock));
3758 }
3759 } while (Check(Token::COMMA));
3760
3761 parsing_result->bindings_loc =
3762 Scanner::Location(bindings_start, scanner()->location().end_pos);
3763
3764 DCHECK(*ok);
3765 return init_block;
3766 }
3767
3768 template <typename Impl>
3769 typename ParserBase<Impl>::StatementT
ParseFunctionDeclaration(bool * ok)3770 ParserBase<Impl>::ParseFunctionDeclaration(bool* ok) {
3771 Consume(Token::FUNCTION);
3772 int pos = position();
3773 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal;
3774 if (Check(Token::MUL)) {
3775 impl()->ReportMessageAt(scanner()->location(),
3776 MessageTemplate::kGeneratorInLegacyContext);
3777 *ok = false;
3778 return impl()->NullStatement();
3779 }
3780 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok);
3781 }
3782
3783 template <typename Impl>
3784 typename ParserBase<Impl>::StatementT
ParseHoistableDeclaration(ZoneList<const AstRawString * > * names,bool default_export,bool * ok)3785 ParserBase<Impl>::ParseHoistableDeclaration(
3786 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
3787 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement));
3788 int pos = position();
3789 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal;
3790 if (Check(Token::MUL)) {
3791 flags |= ParseFunctionFlags::kIsGenerator;
3792 }
3793 return ParseHoistableDeclaration(pos, flags, names, default_export, ok);
3794 }
3795
3796 template <typename Impl>
3797 typename ParserBase<Impl>::StatementT
ParseHoistableDeclaration(int pos,ParseFunctionFlags flags,ZoneList<const AstRawString * > * names,bool default_export,bool * ok)3798 ParserBase<Impl>::ParseHoistableDeclaration(
3799 int pos, ParseFunctionFlags flags, ZoneList<const AstRawString*>* names,
3800 bool default_export, bool* ok) {
3801 // FunctionDeclaration ::
3802 // 'function' Identifier '(' FormalParameters ')' '{' FunctionBody '}'
3803 // 'function' '(' FormalParameters ')' '{' FunctionBody '}'
3804 // GeneratorDeclaration ::
3805 // 'function' '*' Identifier '(' FormalParameters ')' '{' FunctionBody '}'
3806 // 'function' '*' '(' FormalParameters ')' '{' FunctionBody '}'
3807 //
3808 // The anonymous forms are allowed iff [default_export] is true.
3809 //
3810 // 'function' and '*' (if present) have been consumed by the caller.
3811
3812 const bool is_generator = flags & ParseFunctionFlags::kIsGenerator;
3813 const bool is_async = flags & ParseFunctionFlags::kIsAsync;
3814 DCHECK(!is_generator || !is_async);
3815
3816 IdentifierT name;
3817 FunctionNameValidity name_validity;
3818 IdentifierT variable_name;
3819 if (default_export && peek() == Token::LPAREN) {
3820 impl()->GetDefaultStrings(&name, &variable_name);
3821 name_validity = kSkipFunctionNameCheck;
3822 } else {
3823 bool is_strict_reserved;
3824 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved,
3825 CHECK_OK_CUSTOM(NullStatement));
3826 name_validity = is_strict_reserved ? kFunctionNameIsStrictReserved
3827 : kFunctionNameValidityUnknown;
3828 variable_name = name;
3829 }
3830
3831 FuncNameInferrer::State fni_state(fni_);
3832 impl()->PushEnclosingName(name);
3833 FunctionLiteralT function = impl()->ParseFunctionLiteral(
3834 name, scanner()->location(), name_validity,
3835 is_generator ? FunctionKind::kGeneratorFunction
3836 : is_async ? FunctionKind::kAsyncFunction
3837 : FunctionKind::kNormalFunction,
3838 pos, FunctionLiteral::kDeclaration, language_mode(),
3839 CHECK_OK_CUSTOM(NullStatement));
3840
3841 // In ES6, a function behaves as a lexical binding, except in
3842 // a script scope, or the initial scope of eval or another function.
3843 VariableMode mode =
3844 (!scope()->is_declaration_scope() || scope()->is_module_scope()) ? LET
3845 : VAR;
3846 // Async functions don't undergo sloppy mode block scoped hoisting, and don't
3847 // allow duplicates in a block. Both are represented by the
3848 // sloppy_block_function_map. Don't add them to the map for async functions.
3849 // Generators are also supposed to be prohibited; currently doing this behind
3850 // a flag and UseCounting violations to assess web compatibility.
3851 bool is_sloppy_block_function =
3852 is_sloppy(language_mode()) && !scope()->is_declaration_scope() &&
3853 !is_async && !(allow_harmony_restrictive_generators() && is_generator);
3854
3855 return impl()->DeclareFunction(variable_name, function, mode, pos,
3856 is_sloppy_block_function, names, ok);
3857 }
3858
3859 template <typename Impl>
ParseClassDeclaration(ZoneList<const AstRawString * > * names,bool default_export,bool * ok)3860 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseClassDeclaration(
3861 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
3862 // ClassDeclaration ::
3863 // 'class' Identifier ('extends' LeftHandExpression)? '{' ClassBody '}'
3864 // 'class' ('extends' LeftHandExpression)? '{' ClassBody '}'
3865 //
3866 // The anonymous form is allowed iff [default_export] is true.
3867 //
3868 // 'class' is expected to be consumed by the caller.
3869 //
3870 // A ClassDeclaration
3871 //
3872 // class C { ... }
3873 //
3874 // has the same semantics as:
3875 //
3876 // let C = class C { ... };
3877 //
3878 // so rewrite it as such.
3879
3880 int class_token_pos = position();
3881 IdentifierT name = impl()->EmptyIdentifier();
3882 bool is_strict_reserved = false;
3883 IdentifierT variable_name = impl()->EmptyIdentifier();
3884 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) {
3885 impl()->GetDefaultStrings(&name, &variable_name);
3886 } else {
3887 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved,
3888 CHECK_OK_CUSTOM(NullStatement));
3889 variable_name = name;
3890 }
3891
3892 ExpressionClassifier no_classifier(this);
3893 ExpressionT value =
3894 ParseClassLiteral(name, scanner()->location(), is_strict_reserved,
3895 class_token_pos, CHECK_OK_CUSTOM(NullStatement));
3896 int end_pos = position();
3897 return impl()->DeclareClass(variable_name, value, names, class_token_pos,
3898 end_pos, ok);
3899 }
3900
3901 // Language extension which is only enabled for source files loaded
3902 // through the API's extension mechanism. A native function
3903 // declaration is resolved by looking up the function through a
3904 // callback provided by the extension.
3905 template <typename Impl>
ParseNativeDeclaration(bool * ok)3906 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseNativeDeclaration(
3907 bool* ok) {
3908 int pos = peek_position();
3909 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement));
3910 // Allow "eval" or "arguments" for backward compatibility.
3911 IdentifierT name = ParseIdentifier(kAllowRestrictedIdentifiers,
3912 CHECK_OK_CUSTOM(NullStatement));
3913 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullStatement));
3914 if (peek() != Token::RPAREN) {
3915 do {
3916 ParseIdentifier(kAllowRestrictedIdentifiers,
3917 CHECK_OK_CUSTOM(NullStatement));
3918 } while (Check(Token::COMMA));
3919 }
3920 Expect(Token::RPAREN, CHECK_OK_CUSTOM(NullStatement));
3921 Expect(Token::SEMICOLON, CHECK_OK_CUSTOM(NullStatement));
3922 return impl()->DeclareNative(name, pos, ok);
3923 }
3924
3925 template <typename Impl>
3926 typename ParserBase<Impl>::StatementT
ParseAsyncFunctionDeclaration(ZoneList<const AstRawString * > * names,bool default_export,bool * ok)3927 ParserBase<Impl>::ParseAsyncFunctionDeclaration(
3928 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
3929 // AsyncFunctionDeclaration ::
3930 // async [no LineTerminator here] function BindingIdentifier[Await]
3931 // ( FormalParameters[Await] ) { AsyncFunctionBody }
3932 DCHECK_EQ(scanner()->current_token(), Token::ASYNC);
3933 int pos = position();
3934 if (scanner()->HasAnyLineTerminatorBeforeNext()) {
3935 *ok = false;
3936 impl()->ReportUnexpectedToken(scanner()->current_token());
3937 return impl()->NullStatement();
3938 }
3939 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement));
3940 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync;
3941 return ParseHoistableDeclaration(pos, flags, names, default_export, ok);
3942 }
3943
3944 template <typename Impl>
ParseFunctionBody(typename ParserBase<Impl>::StatementListT result,IdentifierT function_name,int pos,const FormalParametersT & parameters,FunctionKind kind,FunctionLiteral::FunctionType function_type,bool * ok)3945 void ParserBase<Impl>::ParseFunctionBody(
3946 typename ParserBase<Impl>::StatementListT result, IdentifierT function_name,
3947 int pos, const FormalParametersT& parameters, FunctionKind kind,
3948 FunctionLiteral::FunctionType function_type, bool* ok) {
3949 static const int kFunctionNameAssignmentIndex = 0;
3950 if (function_type == FunctionLiteral::kNamedExpression) {
3951 DCHECK(!impl()->IsEmptyIdentifier(function_name));
3952 // If we have a named function expression, we add a local variable
3953 // declaration to the body of the function with the name of the
3954 // function and let it refer to the function itself (closure).
3955 // Not having parsed the function body, the language mode may still change,
3956 // so we reserve a spot and create the actual const assignment later.
3957 DCHECK_EQ(kFunctionNameAssignmentIndex, result->length());
3958 result->Add(impl()->NullStatement(), zone());
3959 }
3960
3961 DeclarationScope* function_scope = scope()->AsDeclarationScope();
3962 DeclarationScope* inner_scope = function_scope;
3963 BlockT inner_block = impl()->NullBlock();
3964
3965 StatementListT body = result;
3966 if (!parameters.is_simple) {
3967 inner_scope = NewVarblockScope();
3968 inner_scope->set_start_position(scanner()->location().beg_pos);
3969 inner_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition);
3970 inner_block->set_scope(inner_scope);
3971 body = inner_block->statements();
3972 }
3973
3974 {
3975 BlockState block_state(&scope_, inner_scope);
3976
3977 if (IsGeneratorFunction(kind)) {
3978 impl()->ParseAndRewriteGeneratorFunctionBody(pos, kind, body, ok);
3979 } else if (IsAsyncFunction(kind)) {
3980 const bool accept_IN = true;
3981 ParseAsyncFunctionBody(inner_scope, body, kind, FunctionBodyType::kNormal,
3982 accept_IN, pos, CHECK_OK_VOID);
3983 } else {
3984 ParseStatementList(body, Token::RBRACE, CHECK_OK_VOID);
3985 }
3986
3987 if (IsDerivedConstructor(kind)) {
3988 body->Add(factory()->NewReturnStatement(impl()->ThisExpression(),
3989 kNoSourcePosition),
3990 zone());
3991 }
3992 }
3993
3994 Expect(Token::RBRACE, CHECK_OK_VOID);
3995 scope()->set_end_position(scanner()->location().end_pos);
3996
3997 if (!parameters.is_simple) {
3998 DCHECK_NOT_NULL(inner_scope);
3999 DCHECK_EQ(function_scope, scope());
4000 DCHECK_EQ(function_scope, inner_scope->outer_scope());
4001 impl()->SetLanguageMode(function_scope, inner_scope->language_mode());
4002 BlockT init_block =
4003 impl()->BuildParameterInitializationBlock(parameters, CHECK_OK_VOID);
4004
4005 if (is_sloppy(inner_scope->language_mode())) {
4006 impl()->InsertSloppyBlockFunctionVarBindings(inner_scope);
4007 }
4008
4009 // TODO(littledan): Merge the two rejection blocks into one
4010 if (IsAsyncFunction(kind)) {
4011 init_block = impl()->BuildRejectPromiseOnException(init_block);
4012 }
4013
4014 inner_scope->set_end_position(scanner()->location().end_pos);
4015 if (inner_scope->FinalizeBlockScope() != nullptr) {
4016 impl()->CheckConflictingVarDeclarations(inner_scope, CHECK_OK_VOID);
4017 impl()->InsertShadowingVarBindingInitializers(inner_block);
4018 } else {
4019 inner_block->set_scope(nullptr);
4020 }
4021 inner_scope = nullptr;
4022
4023 result->Add(init_block, zone());
4024 result->Add(inner_block, zone());
4025 } else {
4026 DCHECK_EQ(inner_scope, function_scope);
4027 if (is_sloppy(function_scope->language_mode())) {
4028 impl()->InsertSloppyBlockFunctionVarBindings(function_scope);
4029 }
4030 }
4031
4032 if (!IsArrowFunction(kind)) {
4033 // Declare arguments after parsing the function since lexical 'arguments'
4034 // masks the arguments object. Declare arguments before declaring the
4035 // function var since the arguments object masks 'function arguments'.
4036 function_scope->DeclareArguments(ast_value_factory());
4037 }
4038
4039 impl()->CreateFunctionNameAssignment(function_name, pos, function_type,
4040 function_scope, result,
4041 kFunctionNameAssignmentIndex);
4042 impl()->MarkCollectedTailCallExpressions();
4043 }
4044
4045 template <typename Impl>
CheckArityRestrictions(int param_count,FunctionKind function_kind,bool has_rest,int formals_start_pos,int formals_end_pos,bool * ok)4046 void ParserBase<Impl>::CheckArityRestrictions(int param_count,
4047 FunctionKind function_kind,
4048 bool has_rest,
4049 int formals_start_pos,
4050 int formals_end_pos, bool* ok) {
4051 if (IsGetterFunction(function_kind)) {
4052 if (param_count != 0) {
4053 impl()->ReportMessageAt(
4054 Scanner::Location(formals_start_pos, formals_end_pos),
4055 MessageTemplate::kBadGetterArity);
4056 *ok = false;
4057 }
4058 } else if (IsSetterFunction(function_kind)) {
4059 if (param_count != 1) {
4060 impl()->ReportMessageAt(
4061 Scanner::Location(formals_start_pos, formals_end_pos),
4062 MessageTemplate::kBadSetterArity);
4063 *ok = false;
4064 }
4065 if (has_rest) {
4066 impl()->ReportMessageAt(
4067 Scanner::Location(formals_start_pos, formals_end_pos),
4068 MessageTemplate::kBadSetterRestParameter);
4069 *ok = false;
4070 }
4071 }
4072 }
4073
4074 template <typename Impl>
IsNextLetKeyword()4075 bool ParserBase<Impl>::IsNextLetKeyword() {
4076 DCHECK(peek() == Token::LET);
4077 Token::Value next_next = PeekAhead();
4078 switch (next_next) {
4079 case Token::LBRACE:
4080 case Token::LBRACK:
4081 case Token::IDENTIFIER:
4082 case Token::STATIC:
4083 case Token::LET: // `let let;` is disallowed by static semantics, but the
4084 // token must be first interpreted as a keyword in order
4085 // for those semantics to apply. This ensures that ASI is
4086 // not honored when a LineTerminator separates the
4087 // tokens.
4088 case Token::YIELD:
4089 case Token::AWAIT:
4090 case Token::ASYNC:
4091 return true;
4092 case Token::FUTURE_STRICT_RESERVED_WORD:
4093 return is_sloppy(language_mode());
4094 default:
4095 return false;
4096 }
4097 }
4098
4099 template <typename Impl>
IsTrivialExpression()4100 bool ParserBase<Impl>::IsTrivialExpression() {
4101 Token::Value peek_token = peek();
4102 if (peek_token == Token::SMI || peek_token == Token::NUMBER ||
4103 peek_token == Token::NULL_LITERAL || peek_token == Token::TRUE_LITERAL ||
4104 peek_token == Token::FALSE_LITERAL || peek_token == Token::STRING ||
4105 peek_token == Token::IDENTIFIER || peek_token == Token::THIS) {
4106 // PeekAhead() is expensive & may not always be called, so we only call it
4107 // after checking peek().
4108 Token::Value peek_ahead = PeekAhead();
4109 if (peek_ahead == Token::COMMA || peek_ahead == Token::RPAREN ||
4110 peek_ahead == Token::SEMICOLON || peek_ahead == Token::RBRACK) {
4111 return true;
4112 }
4113 }
4114 return false;
4115 }
4116
4117 template <typename Impl>
4118 typename ParserBase<Impl>::ExpressionT
ParseArrowFunctionLiteral(bool accept_IN,const FormalParametersT & formal_parameters,int rewritable_length,bool * ok)4119 ParserBase<Impl>::ParseArrowFunctionLiteral(
4120 bool accept_IN, const FormalParametersT& formal_parameters,
4121 int rewritable_length, bool* ok) {
4122 const RuntimeCallStats::CounterId counters[2][2] = {
4123 {&RuntimeCallStats::ParseBackgroundArrowFunctionLiteral,
4124 &RuntimeCallStats::ParseArrowFunctionLiteral},
4125 {&RuntimeCallStats::PreParseBackgroundArrowFunctionLiteral,
4126 &RuntimeCallStats::PreParseArrowFunctionLiteral}};
4127 RuntimeCallTimerScope runtime_timer(
4128 runtime_call_stats_,
4129 counters[Impl::IsPreParser()][parsing_on_main_thread_]);
4130
4131 if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) {
4132 // ASI inserts `;` after arrow parameters if a line terminator is found.
4133 // `=> ...` is never a valid expression, so report as syntax error.
4134 // If next token is not `=>`, it's a syntax error anyways.
4135 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW);
4136 *ok = false;
4137 return impl()->EmptyExpression();
4138 }
4139
4140 StatementListT body = impl()->NullStatementList();
4141 int expected_property_count = -1;
4142 int function_literal_id = GetNextFunctionLiteralId();
4143
4144 FunctionKind kind = formal_parameters.scope->function_kind();
4145 FunctionLiteral::EagerCompileHint eager_compile_hint =
4146 default_eager_compile_hint_;
4147 bool can_preparse = impl()->parse_lazily() &&
4148 eager_compile_hint == FunctionLiteral::kShouldLazyCompile;
4149 // TODO(marja): consider lazy-parsing inner arrow functions too. is_this
4150 // handling in Scope::ResolveVariable needs to change.
4151 bool is_lazy_top_level_function =
4152 can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables();
4153 bool should_be_used_once_hint = false;
4154 bool has_braces = true;
4155 {
4156 FunctionState function_state(&function_state_, &scope_,
4157 formal_parameters.scope);
4158
4159 Expect(Token::ARROW, CHECK_OK);
4160
4161 if (peek() == Token::LBRACE) {
4162 // Multiple statement body
4163 DCHECK_EQ(scope(), formal_parameters.scope);
4164 if (is_lazy_top_level_function) {
4165 // FIXME(marja): Arrow function parameters will be parsed even if the
4166 // body is preparsed; move relevant parts of parameter handling to
4167 // simulate consistent parameter handling.
4168 Scanner::BookmarkScope bookmark(scanner());
4169 bookmark.Set();
4170 // For arrow functions, we don't need to retrieve data about function
4171 // parameters.
4172 int dummy_num_parameters = -1;
4173 int dummy_function_length = -1;
4174 bool dummy_has_duplicate_parameters = false;
4175 DCHECK((kind & FunctionKind::kArrowFunction) != 0);
4176 LazyParsingResult result = impl()->SkipFunction(
4177 kind, formal_parameters.scope, &dummy_num_parameters,
4178 &dummy_function_length, &dummy_has_duplicate_parameters,
4179 &expected_property_count, false, true, CHECK_OK);
4180 formal_parameters.scope->ResetAfterPreparsing(
4181 ast_value_factory_, result == kLazyParsingAborted);
4182
4183 if (result == kLazyParsingAborted) {
4184 bookmark.Apply();
4185 // Trigger eager (re-)parsing, just below this block.
4186 is_lazy_top_level_function = false;
4187
4188 // This is probably an initialization function. Inform the compiler it
4189 // should also eager-compile this function, and that we expect it to
4190 // be used once.
4191 eager_compile_hint = FunctionLiteral::kShouldEagerCompile;
4192 should_be_used_once_hint = true;
4193 }
4194 }
4195 if (!is_lazy_top_level_function) {
4196 Consume(Token::LBRACE);
4197 body = impl()->NewStatementList(8);
4198 impl()->ParseFunctionBody(body, impl()->EmptyIdentifier(),
4199 kNoSourcePosition, formal_parameters, kind,
4200 FunctionLiteral::kAnonymousExpression,
4201 CHECK_OK);
4202 expected_property_count = function_state.expected_property_count();
4203 }
4204 } else {
4205 // Single-expression body
4206 has_braces = false;
4207 int pos = position();
4208 DCHECK(ReturnExprContext::kInsideValidBlock ==
4209 function_state_->return_expr_context());
4210 ReturnExprScope allow_tail_calls(
4211 function_state_, ReturnExprContext::kInsideValidReturnStatement);
4212 body = impl()->NewStatementList(1);
4213 impl()->AddParameterInitializationBlock(
4214 formal_parameters, body, kind == kAsyncArrowFunction, CHECK_OK);
4215 ExpressionClassifier classifier(this);
4216 if (kind == kAsyncArrowFunction) {
4217 ParseAsyncFunctionBody(scope(), body, kAsyncArrowFunction,
4218 FunctionBodyType::kSingleExpression, accept_IN,
4219 pos, CHECK_OK);
4220 impl()->RewriteNonPattern(CHECK_OK);
4221 } else {
4222 ExpressionT expression = ParseAssignmentExpression(accept_IN, CHECK_OK);
4223 impl()->RewriteNonPattern(CHECK_OK);
4224 body->Add(BuildReturnStatement(expression, expression->position()),
4225 zone());
4226 if (allow_tailcalls() && !is_sloppy(language_mode())) {
4227 // ES6 14.6.1 Static Semantics: IsInTailPosition
4228 impl()->MarkTailPosition(expression);
4229 }
4230 }
4231 expected_property_count = function_state.expected_property_count();
4232 impl()->MarkCollectedTailCallExpressions();
4233 }
4234
4235 formal_parameters.scope->set_end_position(scanner()->location().end_pos);
4236
4237 // Arrow function formal parameters are parsed as StrictFormalParameterList,
4238 // which is not the same as "parameters of a strict function"; it only means
4239 // that duplicates are not allowed. Of course, the arrow function may
4240 // itself be strict as well.
4241 const bool allow_duplicate_parameters = false;
4242 ValidateFormalParameters(language_mode(), allow_duplicate_parameters,
4243 CHECK_OK);
4244
4245 // Validate strict mode.
4246 if (is_strict(language_mode())) {
4247 CheckStrictOctalLiteral(formal_parameters.scope->start_position(),
4248 scanner()->location().end_pos, CHECK_OK);
4249 }
4250 impl()->CheckConflictingVarDeclarations(formal_parameters.scope, CHECK_OK);
4251
4252 if (is_lazy_top_level_function) {
4253 FunctionState* parent_state = function_state.outer();
4254 DCHECK_NOT_NULL(parent_state);
4255 DCHECK_GE(parent_state->destructuring_assignments_to_rewrite().length(),
4256 rewritable_length);
4257 parent_state->RewindDestructuringAssignments(rewritable_length);
4258 }
4259
4260 impl()->RewriteDestructuringAssignments();
4261 }
4262
4263 if (FLAG_trace_preparse) {
4264 Scope* scope = formal_parameters.scope;
4265 PrintF(" [%s]: %i-%i (arrow function)\n",
4266 is_lazy_top_level_function ? "Preparse no-resolution" : "Full parse",
4267 scope->start_position(), scope->end_position());
4268 }
4269 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
4270 impl()->EmptyIdentifierString(), formal_parameters.scope, body,
4271 expected_property_count, formal_parameters.num_parameters(),
4272 formal_parameters.function_length,
4273 FunctionLiteral::kNoDuplicateParameters,
4274 FunctionLiteral::kAnonymousExpression, eager_compile_hint,
4275 formal_parameters.scope->start_position(), has_braces,
4276 function_literal_id);
4277
4278 function_literal->set_function_token_position(
4279 formal_parameters.scope->start_position());
4280 if (should_be_used_once_hint) {
4281 function_literal->set_should_be_used_once_hint();
4282 }
4283
4284 impl()->AddFunctionForNameInference(function_literal);
4285
4286 return function_literal;
4287 }
4288
4289 template <typename Impl>
ParseClassLiteral(IdentifierT name,Scanner::Location class_name_location,bool name_is_strict_reserved,int class_token_pos,bool * ok)4290 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseClassLiteral(
4291 IdentifierT name, Scanner::Location class_name_location,
4292 bool name_is_strict_reserved, int class_token_pos, bool* ok) {
4293 // All parts of a ClassDeclaration and ClassExpression are strict code.
4294 if (name_is_strict_reserved) {
4295 impl()->ReportMessageAt(class_name_location,
4296 MessageTemplate::kUnexpectedStrictReserved);
4297 *ok = false;
4298 return impl()->EmptyExpression();
4299 }
4300 if (impl()->IsEvalOrArguments(name)) {
4301 impl()->ReportMessageAt(class_name_location,
4302 MessageTemplate::kStrictEvalArguments);
4303 *ok = false;
4304 return impl()->EmptyExpression();
4305 }
4306
4307 BlockState block_state(zone(), &scope_);
4308 RaiseLanguageMode(STRICT);
4309
4310 ClassInfo class_info(this);
4311 impl()->DeclareClassVariable(name, &class_info, class_token_pos, CHECK_OK);
4312
4313 scope()->set_start_position(scanner()->location().end_pos);
4314 if (Check(Token::EXTENDS)) {
4315 ExpressionClassifier extends_classifier(this);
4316 class_info.extends = ParseLeftHandSideExpression(CHECK_OK);
4317 impl()->RewriteNonPattern(CHECK_OK);
4318 impl()->AccumulateFormalParameterContainmentErrors();
4319 }
4320
4321 ClassLiteralChecker checker(this);
4322
4323 Expect(Token::LBRACE, CHECK_OK);
4324
4325 const bool has_extends = !impl()->IsEmptyExpression(class_info.extends);
4326 while (peek() != Token::RBRACE) {
4327 if (Check(Token::SEMICOLON)) continue;
4328 FuncNameInferrer::State fni_state(fni_);
4329 bool is_computed_name = false; // Classes do not care about computed
4330 // property names here.
4331 bool is_static;
4332 ClassLiteralProperty::Kind property_kind;
4333 ExpressionClassifier property_classifier(this);
4334 // If we haven't seen the constructor yet, it potentially is the next
4335 // property.
4336 bool is_constructor = !class_info.has_seen_constructor;
4337 ClassLiteralPropertyT property = ParseClassPropertyDefinition(
4338 &checker, has_extends, &is_computed_name,
4339 &class_info.has_seen_constructor, &property_kind, &is_static,
4340 &class_info.has_name_static_property, CHECK_OK);
4341 if (!class_info.has_static_computed_names && is_static &&
4342 is_computed_name) {
4343 class_info.has_static_computed_names = true;
4344 }
4345 is_constructor &= class_info.has_seen_constructor;
4346 impl()->RewriteNonPattern(CHECK_OK);
4347 impl()->AccumulateFormalParameterContainmentErrors();
4348
4349 impl()->DeclareClassProperty(name, property, property_kind, is_static,
4350 is_constructor, &class_info, CHECK_OK);
4351 impl()->InferFunctionName();
4352 }
4353
4354 Expect(Token::RBRACE, CHECK_OK);
4355 return impl()->RewriteClassLiteral(name, &class_info, class_token_pos, ok);
4356 }
4357
4358 template <typename Impl>
ParseAsyncFunctionBody(Scope * scope,StatementListT body,FunctionKind kind,FunctionBodyType body_type,bool accept_IN,int pos,bool * ok)4359 void ParserBase<Impl>::ParseAsyncFunctionBody(Scope* scope, StatementListT body,
4360 FunctionKind kind,
4361 FunctionBodyType body_type,
4362 bool accept_IN, int pos,
4363 bool* ok) {
4364 impl()->PrepareAsyncFunctionBody(body, kind, pos);
4365
4366 BlockT block = factory()->NewBlock(nullptr, 8, true, kNoSourcePosition);
4367
4368 ExpressionT return_value = impl()->EmptyExpression();
4369 if (body_type == FunctionBodyType::kNormal) {
4370 ParseStatementList(block->statements(), Token::RBRACE,
4371 CHECK_OK_CUSTOM(Void));
4372 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition);
4373 } else {
4374 return_value = ParseAssignmentExpression(accept_IN, CHECK_OK_CUSTOM(Void));
4375 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(Void));
4376 }
4377
4378 impl()->RewriteAsyncFunctionBody(body, block, return_value,
4379 CHECK_OK_CUSTOM(Void));
4380 scope->set_end_position(scanner()->location().end_pos);
4381 }
4382
4383 template <typename Impl>
4384 typename ParserBase<Impl>::ExpressionT
ParseAsyncFunctionLiteral(bool * ok)4385 ParserBase<Impl>::ParseAsyncFunctionLiteral(bool* ok) {
4386 // AsyncFunctionLiteral ::
4387 // async [no LineTerminator here] function ( FormalParameters[Await] )
4388 // { AsyncFunctionBody }
4389 //
4390 // async [no LineTerminator here] function BindingIdentifier[Await]
4391 // ( FormalParameters[Await] ) { AsyncFunctionBody }
4392 DCHECK_EQ(scanner()->current_token(), Token::ASYNC);
4393 int pos = position();
4394 Expect(Token::FUNCTION, CHECK_OK);
4395 bool is_strict_reserved = false;
4396 IdentifierT name = impl()->EmptyIdentifier();
4397 FunctionLiteral::FunctionType type = FunctionLiteral::kAnonymousExpression;
4398
4399 if (impl()->ParsingDynamicFunctionDeclaration()) {
4400 // We don't want dynamic functions to actually declare their name
4401 // "anonymous". We just want that name in the toString().
4402 Consume(Token::IDENTIFIER);
4403 DCHECK(scanner()->UnescapedLiteralMatches("anonymous", 9));
4404 } else if (peek_any_identifier()) {
4405 type = FunctionLiteral::kNamedExpression;
4406 name = ParseIdentifierOrStrictReservedWord(FunctionKind::kAsyncFunction,
4407 &is_strict_reserved, CHECK_OK);
4408 }
4409 return impl()->ParseFunctionLiteral(
4410 name, scanner()->location(),
4411 is_strict_reserved ? kFunctionNameIsStrictReserved
4412 : kFunctionNameValidityUnknown,
4413 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK);
4414 }
4415
4416 template <typename Impl>
ParseTemplateLiteral(ExpressionT tag,int start,bool tagged,bool * ok)4417 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral(
4418 ExpressionT tag, int start, bool tagged, bool* ok) {
4419 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal
4420 // text followed by a substitution expression), finalized by a single
4421 // TEMPLATE_TAIL.
4422 //
4423 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or
4424 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or
4425 // NoSubstitutionTemplate.
4426 //
4427 // When parsing a TemplateLiteral, we must have scanned either an initial
4428 // TEMPLATE_SPAN, or a TEMPLATE_TAIL.
4429 CHECK(peek() == Token::TEMPLATE_SPAN || peek() == Token::TEMPLATE_TAIL);
4430
4431 bool forbid_illegal_escapes = !allow_harmony_template_escapes() || !tagged;
4432
4433 // If we reach a TEMPLATE_TAIL first, we are parsing a NoSubstitutionTemplate.
4434 // In this case we may simply consume the token and build a template with a
4435 // single TEMPLATE_SPAN and no expressions.
4436 if (peek() == Token::TEMPLATE_TAIL) {
4437 Consume(Token::TEMPLATE_TAIL);
4438 int pos = position();
4439 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos);
4440 bool is_valid = CheckTemplateEscapes(forbid_illegal_escapes, CHECK_OK);
4441 impl()->AddTemplateSpan(&ts, is_valid, true);
4442 return impl()->CloseTemplateLiteral(&ts, start, tag);
4443 }
4444
4445 Consume(Token::TEMPLATE_SPAN);
4446 int pos = position();
4447 typename Impl::TemplateLiteralState ts = impl()->OpenTemplateLiteral(pos);
4448 bool is_valid = CheckTemplateEscapes(forbid_illegal_escapes, CHECK_OK);
4449 impl()->AddTemplateSpan(&ts, is_valid, false);
4450 Token::Value next;
4451
4452 // If we open with a TEMPLATE_SPAN, we must scan the subsequent expression,
4453 // and repeat if the following token is a TEMPLATE_SPAN as well (in this
4454 // case, representing a TemplateMiddle).
4455
4456 do {
4457 next = peek();
4458 if (next == Token::EOS) {
4459 impl()->ReportMessageAt(Scanner::Location(start, peek_position()),
4460 MessageTemplate::kUnterminatedTemplate);
4461 *ok = false;
4462 return impl()->EmptyExpression();
4463 } else if (next == Token::ILLEGAL) {
4464 impl()->ReportMessageAt(
4465 Scanner::Location(position() + 1, peek_position()),
4466 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError);
4467 *ok = false;
4468 return impl()->EmptyExpression();
4469 }
4470
4471 int expr_pos = peek_position();
4472 ExpressionT expression = ParseExpressionCoverGrammar(true, CHECK_OK);
4473 impl()->RewriteNonPattern(CHECK_OK);
4474 impl()->AddTemplateExpression(&ts, expression);
4475
4476 if (peek() != Token::RBRACE) {
4477 impl()->ReportMessageAt(Scanner::Location(expr_pos, peek_position()),
4478 MessageTemplate::kUnterminatedTemplateExpr);
4479 *ok = false;
4480 return impl()->EmptyExpression();
4481 }
4482
4483 // If we didn't die parsing that expression, our next token should be a
4484 // TEMPLATE_SPAN or TEMPLATE_TAIL.
4485 next = scanner()->ScanTemplateContinuation();
4486 Next();
4487 pos = position();
4488
4489 if (next == Token::EOS) {
4490 impl()->ReportMessageAt(Scanner::Location(start, pos),
4491 MessageTemplate::kUnterminatedTemplate);
4492 *ok = false;
4493 return impl()->EmptyExpression();
4494 } else if (next == Token::ILLEGAL) {
4495 impl()->ReportMessageAt(
4496 Scanner::Location(position() + 1, peek_position()),
4497 MessageTemplate::kUnexpectedToken, "ILLEGAL", kSyntaxError);
4498 *ok = false;
4499 return impl()->EmptyExpression();
4500 }
4501
4502 bool is_valid = CheckTemplateEscapes(forbid_illegal_escapes, CHECK_OK);
4503 impl()->AddTemplateSpan(&ts, is_valid, next == Token::TEMPLATE_TAIL);
4504 } while (next == Token::TEMPLATE_SPAN);
4505
4506 DCHECK_EQ(next, Token::TEMPLATE_TAIL);
4507 // Once we've reached a TEMPLATE_TAIL, we can close the TemplateLiteral.
4508 return impl()->CloseTemplateLiteral(&ts, start, tag);
4509 }
4510
4511 template <typename Impl>
4512 typename ParserBase<Impl>::ExpressionT
CheckAndRewriteReferenceExpression(ExpressionT expression,int beg_pos,int end_pos,MessageTemplate::Template message,bool * ok)4513 ParserBase<Impl>::CheckAndRewriteReferenceExpression(
4514 ExpressionT expression, int beg_pos, int end_pos,
4515 MessageTemplate::Template message, bool* ok) {
4516 return CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos,
4517 message, kReferenceError, ok);
4518 }
4519
4520 template <typename Impl>
4521 typename ParserBase<Impl>::ExpressionT
CheckAndRewriteReferenceExpression(ExpressionT expression,int beg_pos,int end_pos,MessageTemplate::Template message,ParseErrorType type,bool * ok)4522 ParserBase<Impl>::CheckAndRewriteReferenceExpression(
4523 ExpressionT expression, int beg_pos, int end_pos,
4524 MessageTemplate::Template message, ParseErrorType type, bool* ok) {
4525 if (impl()->IsIdentifier(expression) && is_strict(language_mode()) &&
4526 impl()->IsEvalOrArguments(impl()->AsIdentifier(expression))) {
4527 ReportMessageAt(Scanner::Location(beg_pos, end_pos),
4528 MessageTemplate::kStrictEvalArguments, kSyntaxError);
4529 *ok = false;
4530 return impl()->EmptyExpression();
4531 }
4532 if (expression->IsValidReferenceExpression()) {
4533 return expression;
4534 }
4535 if (expression->IsCall()) {
4536 // If it is a call, make it a runtime error for legacy web compatibility.
4537 // Bug: https://bugs.chromium.org/p/v8/issues/detail?id=4480
4538 // Rewrite `expr' to `expr[throw ReferenceError]'.
4539 impl()->CountUsage(
4540 is_strict(language_mode())
4541 ? v8::Isolate::kAssigmentExpressionLHSIsCallInStrict
4542 : v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy);
4543 ExpressionT error = impl()->NewThrowReferenceError(message, beg_pos);
4544 return factory()->NewProperty(expression, error, beg_pos);
4545 }
4546 ReportMessageAt(Scanner::Location(beg_pos, end_pos), message, type);
4547 *ok = false;
4548 return impl()->EmptyExpression();
4549 }
4550
4551 template <typename Impl>
IsValidReferenceExpression(ExpressionT expression)4552 bool ParserBase<Impl>::IsValidReferenceExpression(ExpressionT expression) {
4553 return IsAssignableIdentifier(expression) || expression->IsProperty();
4554 }
4555
4556 template <typename Impl>
CheckDestructuringElement(ExpressionT expression,int begin,int end)4557 void ParserBase<Impl>::CheckDestructuringElement(ExpressionT expression,
4558 int begin, int end) {
4559 if (!IsValidPattern(expression) && !expression->IsAssignment() &&
4560 !IsValidReferenceExpression(expression)) {
4561 classifier()->RecordAssignmentPatternError(
4562 Scanner::Location(begin, end),
4563 MessageTemplate::kInvalidDestructuringTarget);
4564 }
4565 }
4566
4567 template <typename Impl>
ParseV8Intrinsic(bool * ok)4568 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseV8Intrinsic(
4569 bool* ok) {
4570 // CallRuntime ::
4571 // '%' Identifier Arguments
4572
4573 int pos = peek_position();
4574 Expect(Token::MOD, CHECK_OK);
4575 // Allow "eval" or "arguments" for backward compatibility.
4576 IdentifierT name = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
4577 Scanner::Location spread_pos;
4578 ExpressionClassifier classifier(this);
4579 ExpressionListT args = ParseArguments(&spread_pos, CHECK_OK);
4580
4581 DCHECK(!spread_pos.IsValid());
4582
4583 return impl()->NewV8Intrinsic(name, args, pos, ok);
4584 }
4585
4586 template <typename Impl>
ParseDoExpression(bool * ok)4587 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseDoExpression(
4588 bool* ok) {
4589 // AssignmentExpression ::
4590 // do '{' StatementList '}'
4591
4592 int pos = peek_position();
4593 Expect(Token::DO, CHECK_OK);
4594 BlockT block = ParseBlock(nullptr, CHECK_OK);
4595 return impl()->RewriteDoExpression(block, pos, ok);
4596 }
4597
4598 // Redefinition of CHECK_OK for parsing statements.
4599 #undef CHECK_OK
4600 #define CHECK_OK CHECK_OK_CUSTOM(NullStatement)
4601
4602 template <typename Impl>
4603 typename ParserBase<Impl>::LazyParsingResult
ParseStatementList(StatementListT body,int end_token,bool may_abort,bool * ok)4604 ParserBase<Impl>::ParseStatementList(StatementListT body, int end_token,
4605 bool may_abort, bool* ok) {
4606 // StatementList ::
4607 // (StatementListItem)* <end_token>
4608
4609 // Allocate a target stack to use for this set of source
4610 // elements. This way, all scripts and functions get their own
4611 // target stack thus avoiding illegal breaks and continues across
4612 // functions.
4613 typename Types::TargetScope target_scope(this);
4614 int count_statements = 0;
4615
4616 DCHECK(!impl()->IsNullStatementList(body));
4617 bool directive_prologue = true; // Parsing directive prologue.
4618
4619 while (peek() != end_token) {
4620 if (directive_prologue && peek() != Token::STRING) {
4621 directive_prologue = false;
4622 }
4623
4624 bool starts_with_identifier = peek() == Token::IDENTIFIER;
4625 Scanner::Location token_loc = scanner()->peek_location();
4626 StatementT stat =
4627 ParseStatementListItem(CHECK_OK_CUSTOM(Return, kLazyParsingComplete));
4628
4629 if (impl()->IsNullStatement(stat) || impl()->IsEmptyStatement(stat)) {
4630 directive_prologue = false; // End of directive prologue.
4631 continue;
4632 }
4633
4634 if (directive_prologue) {
4635 // The length of the token is used to distinguish between strings literals
4636 // that evaluate equal to directives but contain either escape sequences
4637 // (e.g., "use \x73trict") or line continuations (e.g., "use \(newline)
4638 // strict").
4639 if (impl()->IsUseStrictDirective(stat) &&
4640 token_loc.end_pos - token_loc.beg_pos == sizeof("use strict") + 1) {
4641 // Directive "use strict" (ES5 14.1).
4642 RaiseLanguageMode(STRICT);
4643 if (!scope()->HasSimpleParameters()) {
4644 // TC39 deemed "use strict" directives to be an error when occurring
4645 // in the body of a function with non-simple parameter list, on
4646 // 29/7/2015. https://goo.gl/ueA7Ln
4647 impl()->ReportMessageAt(
4648 token_loc, MessageTemplate::kIllegalLanguageModeDirective,
4649 "use strict");
4650 *ok = false;
4651 return kLazyParsingComplete;
4652 }
4653 } else if (impl()->IsUseAsmDirective(stat) &&
4654 token_loc.end_pos - token_loc.beg_pos ==
4655 sizeof("use asm") + 1) {
4656 // Directive "use asm".
4657 impl()->SetAsmModule();
4658 } else if (impl()->IsStringLiteral(stat)) {
4659 // Possibly an unknown directive.
4660 // Should not change mode, but will increment usage counters
4661 // as appropriate. Ditto usages below.
4662 RaiseLanguageMode(SLOPPY);
4663 } else {
4664 // End of the directive prologue.
4665 directive_prologue = false;
4666 RaiseLanguageMode(SLOPPY);
4667 }
4668 } else {
4669 RaiseLanguageMode(SLOPPY);
4670 }
4671
4672 // If we're allowed to abort, we will do so when we see a "long and
4673 // trivial" function. Our current definition of "long and trivial" is:
4674 // - over kLazyParseTrialLimit statements
4675 // - all starting with an identifier (i.e., no if, for, while, etc.)
4676 if (may_abort) {
4677 if (!starts_with_identifier) {
4678 may_abort = false;
4679 } else if (++count_statements > kLazyParseTrialLimit) {
4680 return kLazyParsingAborted;
4681 }
4682 }
4683
4684 body->Add(stat, zone());
4685 }
4686 return kLazyParsingComplete;
4687 }
4688
4689 template <typename Impl>
ParseStatementListItem(bool * ok)4690 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStatementListItem(
4691 bool* ok) {
4692 // ECMA 262 6th Edition
4693 // StatementListItem[Yield, Return] :
4694 // Statement[?Yield, ?Return]
4695 // Declaration[?Yield]
4696 //
4697 // Declaration[Yield] :
4698 // HoistableDeclaration[?Yield]
4699 // ClassDeclaration[?Yield]
4700 // LexicalDeclaration[In, ?Yield]
4701 //
4702 // HoistableDeclaration[Yield, Default] :
4703 // FunctionDeclaration[?Yield, ?Default]
4704 // GeneratorDeclaration[?Yield, ?Default]
4705 //
4706 // LexicalDeclaration[In, Yield] :
4707 // LetOrConst BindingList[?In, ?Yield] ;
4708
4709 switch (peek()) {
4710 case Token::FUNCTION:
4711 return ParseHoistableDeclaration(nullptr, false, ok);
4712 case Token::CLASS:
4713 Consume(Token::CLASS);
4714 return ParseClassDeclaration(nullptr, false, ok);
4715 case Token::VAR:
4716 case Token::CONST:
4717 return ParseVariableStatement(kStatementListItem, nullptr, ok);
4718 case Token::LET:
4719 if (IsNextLetKeyword()) {
4720 return ParseVariableStatement(kStatementListItem, nullptr, ok);
4721 }
4722 break;
4723 case Token::ASYNC:
4724 if (PeekAhead() == Token::FUNCTION &&
4725 !scanner()->HasAnyLineTerminatorAfterNext()) {
4726 Consume(Token::ASYNC);
4727 return ParseAsyncFunctionDeclaration(nullptr, false, ok);
4728 }
4729 /* falls through */
4730 default:
4731 break;
4732 }
4733 return ParseStatement(nullptr, kAllowLabelledFunctionStatement, ok);
4734 }
4735
4736 template <typename Impl>
ParseStatement(ZoneList<const AstRawString * > * labels,AllowLabelledFunctionStatement allow_function,bool * ok)4737 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStatement(
4738 ZoneList<const AstRawString*>* labels,
4739 AllowLabelledFunctionStatement allow_function, bool* ok) {
4740 // Statement ::
4741 // Block
4742 // VariableStatement
4743 // EmptyStatement
4744 // ExpressionStatement
4745 // IfStatement
4746 // IterationStatement
4747 // ContinueStatement
4748 // BreakStatement
4749 // ReturnStatement
4750 // WithStatement
4751 // LabelledStatement
4752 // SwitchStatement
4753 // ThrowStatement
4754 // TryStatement
4755 // DebuggerStatement
4756
4757 // Note: Since labels can only be used by 'break' and 'continue'
4758 // statements, which themselves are only valid within blocks,
4759 // iterations or 'switch' statements (i.e., BreakableStatements),
4760 // labels can be simply ignored in all other cases; except for
4761 // trivial labeled break statements 'label: break label' which is
4762 // parsed into an empty statement.
4763 switch (peek()) {
4764 case Token::LBRACE:
4765 return ParseBlock(labels, ok);
4766 case Token::SEMICOLON:
4767 Next();
4768 return factory()->NewEmptyStatement(kNoSourcePosition);
4769 case Token::IF:
4770 return ParseIfStatement(labels, ok);
4771 case Token::DO:
4772 return ParseDoWhileStatement(labels, ok);
4773 case Token::WHILE:
4774 return ParseWhileStatement(labels, ok);
4775 case Token::FOR:
4776 if (V8_UNLIKELY(allow_harmony_async_iteration() && is_async_function() &&
4777 PeekAhead() == Token::AWAIT)) {
4778 return ParseForAwaitStatement(labels, ok);
4779 }
4780 return ParseForStatement(labels, ok);
4781 case Token::CONTINUE:
4782 case Token::BREAK:
4783 case Token::RETURN:
4784 case Token::THROW:
4785 case Token::TRY: {
4786 // These statements must have their labels preserved in an enclosing
4787 // block, as the corresponding AST nodes do not currently store their
4788 // labels.
4789 // TODO(nikolaos, marja): Consider adding the labels to the AST nodes.
4790 if (labels == nullptr) {
4791 return ParseStatementAsUnlabelled(labels, ok);
4792 } else {
4793 BlockT result =
4794 factory()->NewBlock(labels, 1, false, kNoSourcePosition);
4795 typename Types::Target target(this, result);
4796 StatementT statement = ParseStatementAsUnlabelled(labels, CHECK_OK);
4797 result->statements()->Add(statement, zone());
4798 return result;
4799 }
4800 }
4801 case Token::WITH:
4802 return ParseWithStatement(labels, ok);
4803 case Token::SWITCH:
4804 return ParseSwitchStatement(labels, ok);
4805 case Token::FUNCTION:
4806 // FunctionDeclaration only allowed as a StatementListItem, not in
4807 // an arbitrary Statement position. Exceptions such as
4808 // ES#sec-functiondeclarations-in-ifstatement-statement-clauses
4809 // are handled by calling ParseScopedStatement rather than
4810 // ParseStatement directly.
4811 impl()->ReportMessageAt(scanner()->peek_location(),
4812 is_strict(language_mode())
4813 ? MessageTemplate::kStrictFunction
4814 : MessageTemplate::kSloppyFunction);
4815 *ok = false;
4816 return impl()->NullStatement();
4817 case Token::DEBUGGER:
4818 return ParseDebuggerStatement(ok);
4819 case Token::VAR:
4820 return ParseVariableStatement(kStatement, nullptr, ok);
4821 default:
4822 return ParseExpressionOrLabelledStatement(labels, allow_function, ok);
4823 }
4824 }
4825
4826 // This method parses a subset of statements (break, continue, return, throw,
4827 // try) which are to be grouped because they all require their labeles to be
4828 // preserved in an enclosing block.
4829 template <typename Impl>
4830 typename ParserBase<Impl>::StatementT
ParseStatementAsUnlabelled(ZoneList<const AstRawString * > * labels,bool * ok)4831 ParserBase<Impl>::ParseStatementAsUnlabelled(
4832 ZoneList<const AstRawString*>* labels, bool* ok) {
4833 switch (peek()) {
4834 case Token::CONTINUE:
4835 return ParseContinueStatement(ok);
4836 case Token::BREAK:
4837 return ParseBreakStatement(labels, ok);
4838 case Token::RETURN:
4839 return ParseReturnStatement(ok);
4840 case Token::THROW:
4841 return ParseThrowStatement(ok);
4842 case Token::TRY:
4843 return ParseTryStatement(ok);
4844 default:
4845 UNREACHABLE();
4846 return impl()->NullStatement();
4847 }
4848 }
4849
4850 template <typename Impl>
ParseBlock(ZoneList<const AstRawString * > * labels,bool * ok)4851 typename ParserBase<Impl>::BlockT ParserBase<Impl>::ParseBlock(
4852 ZoneList<const AstRawString*>* labels, bool* ok) {
4853 // Block ::
4854 // '{' StatementList '}'
4855
4856 // Construct block expecting 16 statements.
4857 BlockT body = factory()->NewBlock(labels, 16, false, kNoSourcePosition);
4858
4859 // Parse the statements and collect escaping labels.
4860 Expect(Token::LBRACE, CHECK_OK_CUSTOM(NullBlock));
4861 {
4862 BlockState block_state(zone(), &scope_);
4863 scope()->set_start_position(scanner()->location().beg_pos);
4864 typename Types::Target target(this, body);
4865
4866 while (peek() != Token::RBRACE) {
4867 StatementT stat = ParseStatementListItem(CHECK_OK_CUSTOM(NullBlock));
4868 if (!impl()->IsNullStatement(stat) && !impl()->IsEmptyStatement(stat)) {
4869 body->statements()->Add(stat, zone());
4870 }
4871 }
4872
4873 Expect(Token::RBRACE, CHECK_OK_CUSTOM(NullBlock));
4874 scope()->set_end_position(scanner()->location().end_pos);
4875 body->set_scope(scope()->FinalizeBlockScope());
4876 }
4877 return body;
4878 }
4879
4880 template <typename Impl>
ParseScopedStatement(ZoneList<const AstRawString * > * labels,bool * ok)4881 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseScopedStatement(
4882 ZoneList<const AstRawString*>* labels, bool* ok) {
4883 if (is_strict(language_mode()) || peek() != Token::FUNCTION) {
4884 return ParseStatement(labels, ok);
4885 } else {
4886 // Make a block around the statement for a lexical binding
4887 // is introduced by a FunctionDeclaration.
4888 BlockState block_state(zone(), &scope_);
4889 scope()->set_start_position(scanner()->location().beg_pos);
4890 BlockT block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition);
4891 StatementT body = ParseFunctionDeclaration(CHECK_OK);
4892 block->statements()->Add(body, zone());
4893 scope()->set_end_position(scanner()->location().end_pos);
4894 block->set_scope(scope()->FinalizeBlockScope());
4895 return block;
4896 }
4897 }
4898
4899 template <typename Impl>
ParseVariableStatement(VariableDeclarationContext var_context,ZoneList<const AstRawString * > * names,bool * ok)4900 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseVariableStatement(
4901 VariableDeclarationContext var_context,
4902 ZoneList<const AstRawString*>* names, bool* ok) {
4903 // VariableStatement ::
4904 // VariableDeclarations ';'
4905
4906 // The scope of a var declared variable anywhere inside a function
4907 // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can
4908 // transform a source-level var declaration into a (Function) Scope
4909 // declaration, and rewrite the source-level initialization into an assignment
4910 // statement. We use a block to collect multiple assignments.
4911 //
4912 // We mark the block as initializer block because we don't want the
4913 // rewriter to add a '.result' assignment to such a block (to get compliant
4914 // behavior for code such as print(eval('var x = 7')), and for cosmetic
4915 // reasons when pretty-printing. Also, unless an assignment (initialization)
4916 // is inside an initializer block, it is ignored.
4917
4918 DeclarationParsingResult parsing_result;
4919 StatementT result =
4920 ParseVariableDeclarations(var_context, &parsing_result, names, CHECK_OK);
4921 ExpectSemicolon(CHECK_OK);
4922 return result;
4923 }
4924
4925 template <typename Impl>
ParseDebuggerStatement(bool * ok)4926 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseDebuggerStatement(
4927 bool* ok) {
4928 // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
4929 // contexts this is used as a statement which invokes the debugger as i a
4930 // break point is present.
4931 // DebuggerStatement ::
4932 // 'debugger' ';'
4933
4934 int pos = peek_position();
4935 Expect(Token::DEBUGGER, CHECK_OK);
4936 ExpectSemicolon(CHECK_OK);
4937 return factory()->NewDebuggerStatement(pos);
4938 }
4939
4940 template <typename Impl>
4941 typename ParserBase<Impl>::StatementT
ParseExpressionOrLabelledStatement(ZoneList<const AstRawString * > * labels,AllowLabelledFunctionStatement allow_function,bool * ok)4942 ParserBase<Impl>::ParseExpressionOrLabelledStatement(
4943 ZoneList<const AstRawString*>* labels,
4944 AllowLabelledFunctionStatement allow_function, bool* ok) {
4945 // ExpressionStatement | LabelledStatement ::
4946 // Expression ';'
4947 // Identifier ':' Statement
4948 //
4949 // ExpressionStatement[Yield] :
4950 // [lookahead notin {{, function, class, let [}] Expression[In, ?Yield] ;
4951
4952 int pos = peek_position();
4953
4954 switch (peek()) {
4955 case Token::FUNCTION:
4956 case Token::LBRACE:
4957 UNREACHABLE(); // Always handled by the callers.
4958 case Token::CLASS:
4959 ReportUnexpectedToken(Next());
4960 *ok = false;
4961 return impl()->NullStatement();
4962 case Token::LET: {
4963 Token::Value next_next = PeekAhead();
4964 // "let" followed by either "[", "{" or an identifier means a lexical
4965 // declaration, which should not appear here.
4966 if (next_next != Token::LBRACK && next_next != Token::LBRACE &&
4967 next_next != Token::IDENTIFIER) {
4968 break;
4969 }
4970 impl()->ReportMessageAt(scanner()->peek_location(),
4971 MessageTemplate::kUnexpectedLexicalDeclaration);
4972 *ok = false;
4973 return impl()->NullStatement();
4974 }
4975 default:
4976 break;
4977 }
4978
4979 bool starts_with_identifier = peek_any_identifier();
4980 ExpressionT expr = ParseExpression(true, CHECK_OK);
4981 if (peek() == Token::COLON && starts_with_identifier &&
4982 impl()->IsIdentifier(expr)) {
4983 // The whole expression was a single identifier, and not, e.g.,
4984 // something starting with an identifier or a parenthesized identifier.
4985 labels = impl()->DeclareLabel(labels, impl()->AsIdentifierExpression(expr),
4986 CHECK_OK);
4987 Consume(Token::COLON);
4988 // ES#sec-labelled-function-declarations Labelled Function Declarations
4989 if (peek() == Token::FUNCTION && is_sloppy(language_mode()) &&
4990 allow_function == kAllowLabelledFunctionStatement) {
4991 return ParseFunctionDeclaration(ok);
4992 }
4993 return ParseStatement(labels, ok);
4994 }
4995
4996 // If we have an extension, we allow a native function declaration.
4997 // A native function declaration starts with "native function" with
4998 // no line-terminator between the two words.
4999 if (extension_ != nullptr && peek() == Token::FUNCTION &&
5000 !scanner()->HasAnyLineTerminatorBeforeNext() && impl()->IsNative(expr) &&
5001 !scanner()->literal_contains_escapes()) {
5002 return ParseNativeDeclaration(ok);
5003 }
5004
5005 // Parsed expression statement, followed by semicolon.
5006 ExpectSemicolon(CHECK_OK);
5007 return factory()->NewExpressionStatement(expr, pos);
5008 }
5009
5010 template <typename Impl>
ParseIfStatement(ZoneList<const AstRawString * > * labels,bool * ok)5011 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseIfStatement(
5012 ZoneList<const AstRawString*>* labels, bool* ok) {
5013 // IfStatement ::
5014 // 'if' '(' Expression ')' Statement ('else' Statement)?
5015
5016 int pos = peek_position();
5017 Expect(Token::IF, CHECK_OK);
5018 Expect(Token::LPAREN, CHECK_OK);
5019 ExpressionT condition = ParseExpression(true, CHECK_OK);
5020 Expect(Token::RPAREN, CHECK_OK);
5021 StatementT then_statement = ParseScopedStatement(labels, CHECK_OK);
5022 StatementT else_statement = impl()->NullStatement();
5023 if (Check(Token::ELSE)) {
5024 else_statement = ParseScopedStatement(labels, CHECK_OK);
5025 } else {
5026 else_statement = factory()->NewEmptyStatement(kNoSourcePosition);
5027 }
5028 return factory()->NewIfStatement(condition, then_statement, else_statement,
5029 pos);
5030 }
5031
5032 template <typename Impl>
ParseContinueStatement(bool * ok)5033 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseContinueStatement(
5034 bool* ok) {
5035 // ContinueStatement ::
5036 // 'continue' Identifier? ';'
5037
5038 int pos = peek_position();
5039 Expect(Token::CONTINUE, CHECK_OK);
5040 IdentifierT label = impl()->EmptyIdentifier();
5041 Token::Value tok = peek();
5042 if (!scanner()->HasAnyLineTerminatorBeforeNext() && tok != Token::SEMICOLON &&
5043 tok != Token::RBRACE && tok != Token::EOS) {
5044 // ECMA allows "eval" or "arguments" as labels even in strict mode.
5045 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
5046 }
5047 typename Types::IterationStatement target =
5048 impl()->LookupContinueTarget(label, CHECK_OK);
5049 if (impl()->IsNullStatement(target)) {
5050 // Illegal continue statement.
5051 MessageTemplate::Template message = MessageTemplate::kIllegalContinue;
5052 if (!impl()->IsEmptyIdentifier(label)) {
5053 message = MessageTemplate::kUnknownLabel;
5054 }
5055 ReportMessage(message, label);
5056 *ok = false;
5057 return impl()->NullStatement();
5058 }
5059 ExpectSemicolon(CHECK_OK);
5060 return factory()->NewContinueStatement(target, pos);
5061 }
5062
5063 template <typename Impl>
ParseBreakStatement(ZoneList<const AstRawString * > * labels,bool * ok)5064 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseBreakStatement(
5065 ZoneList<const AstRawString*>* labels, bool* ok) {
5066 // BreakStatement ::
5067 // 'break' Identifier? ';'
5068
5069 int pos = peek_position();
5070 Expect(Token::BREAK, CHECK_OK);
5071 IdentifierT label = impl()->EmptyIdentifier();
5072 Token::Value tok = peek();
5073 if (!scanner()->HasAnyLineTerminatorBeforeNext() && tok != Token::SEMICOLON &&
5074 tok != Token::RBRACE && tok != Token::EOS) {
5075 // ECMA allows "eval" or "arguments" as labels even in strict mode.
5076 label = ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
5077 }
5078 // Parse labeled break statements that target themselves into
5079 // empty statements, e.g. 'l1: l2: l3: break l2;'
5080 if (!impl()->IsEmptyIdentifier(label) &&
5081 impl()->ContainsLabel(labels, label)) {
5082 ExpectSemicolon(CHECK_OK);
5083 return factory()->NewEmptyStatement(pos);
5084 }
5085 typename Types::BreakableStatement target =
5086 impl()->LookupBreakTarget(label, CHECK_OK);
5087 if (impl()->IsNullStatement(target)) {
5088 // Illegal break statement.
5089 MessageTemplate::Template message = MessageTemplate::kIllegalBreak;
5090 if (!impl()->IsEmptyIdentifier(label)) {
5091 message = MessageTemplate::kUnknownLabel;
5092 }
5093 ReportMessage(message, label);
5094 *ok = false;
5095 return impl()->NullStatement();
5096 }
5097 ExpectSemicolon(CHECK_OK);
5098 return factory()->NewBreakStatement(target, pos);
5099 }
5100
5101 template <typename Impl>
ParseReturnStatement(bool * ok)5102 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseReturnStatement(
5103 bool* ok) {
5104 // ReturnStatement ::
5105 // 'return' [no line terminator] Expression? ';'
5106
5107 // Consume the return token. It is necessary to do that before
5108 // reporting any errors on it, because of the way errors are
5109 // reported (underlining).
5110 Expect(Token::RETURN, CHECK_OK);
5111 Scanner::Location loc = scanner()->location();
5112
5113 switch (GetDeclarationScope()->scope_type()) {
5114 case SCRIPT_SCOPE:
5115 case EVAL_SCOPE:
5116 case MODULE_SCOPE:
5117 impl()->ReportMessageAt(loc, MessageTemplate::kIllegalReturn);
5118 *ok = false;
5119 return impl()->NullStatement();
5120 default:
5121 break;
5122 }
5123
5124 Token::Value tok = peek();
5125 ExpressionT return_value = impl()->EmptyExpression();
5126 if (scanner()->HasAnyLineTerminatorBeforeNext() || tok == Token::SEMICOLON ||
5127 tok == Token::RBRACE || tok == Token::EOS) {
5128 if (IsDerivedConstructor(function_state_->kind())) {
5129 return_value = impl()->ThisExpression(loc.beg_pos);
5130 } else {
5131 return_value = impl()->GetLiteralUndefined(position());
5132 }
5133 } else {
5134 if (IsDerivedConstructor(function_state_->kind())) {
5135 // Because of the return code rewriting that happens in case of a subclass
5136 // constructor we don't want to accept tail calls, therefore we don't set
5137 // ReturnExprScope to kInsideValidReturnStatement here.
5138 return_value = ParseExpression(true, CHECK_OK);
5139 } else {
5140 ReturnExprScope maybe_allow_tail_calls(
5141 function_state_, ReturnExprContext::kInsideValidReturnStatement);
5142 return_value = ParseExpression(true, CHECK_OK);
5143
5144 if (allow_tailcalls() && !is_sloppy(language_mode()) && !is_resumable()) {
5145 // ES6 14.6.1 Static Semantics: IsInTailPosition
5146 function_state_->AddImplicitTailCallExpression(return_value);
5147 }
5148 }
5149 }
5150 ExpectSemicolon(CHECK_OK);
5151 return_value = impl()->RewriteReturn(return_value, loc.beg_pos);
5152 return BuildReturnStatement(return_value, loc.beg_pos);
5153 }
5154
5155 template <typename Impl>
ParseWithStatement(ZoneList<const AstRawString * > * labels,bool * ok)5156 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseWithStatement(
5157 ZoneList<const AstRawString*>* labels, bool* ok) {
5158 // WithStatement ::
5159 // 'with' '(' Expression ')' Statement
5160
5161 Expect(Token::WITH, CHECK_OK);
5162 int pos = position();
5163
5164 if (is_strict(language_mode())) {
5165 ReportMessage(MessageTemplate::kStrictWith);
5166 *ok = false;
5167 return impl()->NullStatement();
5168 }
5169
5170 Expect(Token::LPAREN, CHECK_OK);
5171 ExpressionT expr = ParseExpression(true, CHECK_OK);
5172 Expect(Token::RPAREN, CHECK_OK);
5173
5174 Scope* with_scope = NewScope(WITH_SCOPE);
5175 StatementT body = impl()->NullStatement();
5176 {
5177 BlockState block_state(&scope_, with_scope);
5178 with_scope->set_start_position(scanner()->peek_location().beg_pos);
5179 body = ParseStatement(labels, CHECK_OK);
5180 with_scope->set_end_position(scanner()->location().end_pos);
5181 }
5182 return factory()->NewWithStatement(with_scope, expr, body, pos);
5183 }
5184
5185 template <typename Impl>
ParseDoWhileStatement(ZoneList<const AstRawString * > * labels,bool * ok)5186 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseDoWhileStatement(
5187 ZoneList<const AstRawString*>* labels, bool* ok) {
5188 // DoStatement ::
5189 // 'do' Statement 'while' '(' Expression ')' ';'
5190
5191 auto loop = factory()->NewDoWhileStatement(labels, peek_position());
5192 typename Types::Target target(this, loop);
5193
5194 Expect(Token::DO, CHECK_OK);
5195 StatementT body = ParseStatement(nullptr, CHECK_OK);
5196 Expect(Token::WHILE, CHECK_OK);
5197 Expect(Token::LPAREN, CHECK_OK);
5198
5199 ExpressionT cond = ParseExpression(true, CHECK_OK);
5200 Expect(Token::RPAREN, CHECK_OK);
5201
5202 // Allow do-statements to be terminated with and without
5203 // semi-colons. This allows code such as 'do;while(0)return' to
5204 // parse, which would not be the case if we had used the
5205 // ExpectSemicolon() functionality here.
5206 Check(Token::SEMICOLON);
5207
5208 loop->Initialize(cond, body);
5209 return loop;
5210 }
5211
5212 template <typename Impl>
ParseWhileStatement(ZoneList<const AstRawString * > * labels,bool * ok)5213 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseWhileStatement(
5214 ZoneList<const AstRawString*>* labels, bool* ok) {
5215 // WhileStatement ::
5216 // 'while' '(' Expression ')' Statement
5217
5218 auto loop = factory()->NewWhileStatement(labels, peek_position());
5219 typename Types::Target target(this, loop);
5220
5221 Expect(Token::WHILE, CHECK_OK);
5222 Expect(Token::LPAREN, CHECK_OK);
5223 ExpressionT cond = ParseExpression(true, CHECK_OK);
5224 Expect(Token::RPAREN, CHECK_OK);
5225 StatementT body = ParseStatement(nullptr, CHECK_OK);
5226
5227 loop->Initialize(cond, body);
5228 return loop;
5229 }
5230
5231 template <typename Impl>
ParseThrowStatement(bool * ok)5232 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseThrowStatement(
5233 bool* ok) {
5234 // ThrowStatement ::
5235 // 'throw' Expression ';'
5236
5237 Expect(Token::THROW, CHECK_OK);
5238 int pos = position();
5239 if (scanner()->HasAnyLineTerminatorBeforeNext()) {
5240 ReportMessage(MessageTemplate::kNewlineAfterThrow);
5241 *ok = false;
5242 return impl()->NullStatement();
5243 }
5244 ExpressionT exception = ParseExpression(true, CHECK_OK);
5245 ExpectSemicolon(CHECK_OK);
5246
5247 return impl()->NewThrowStatement(exception, pos);
5248 }
5249
5250 template <typename Impl>
ParseSwitchStatement(ZoneList<const AstRawString * > * labels,bool * ok)5251 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseSwitchStatement(
5252 ZoneList<const AstRawString*>* labels, bool* ok) {
5253 // SwitchStatement ::
5254 // 'switch' '(' Expression ')' '{' CaseClause* '}'
5255 // CaseClause ::
5256 // 'case' Expression ':' StatementList
5257 // 'default' ':' StatementList
5258
5259 int switch_pos = peek_position();
5260
5261 Expect(Token::SWITCH, CHECK_OK);
5262 Expect(Token::LPAREN, CHECK_OK);
5263 ExpressionT tag = ParseExpression(true, CHECK_OK);
5264 Expect(Token::RPAREN, CHECK_OK);
5265
5266 auto switch_statement = factory()->NewSwitchStatement(labels, switch_pos);
5267
5268 {
5269 BlockState cases_block_state(zone(), &scope_);
5270 scope()->set_start_position(switch_pos);
5271 scope()->SetNonlinear();
5272 typename Types::Target target(this, switch_statement);
5273
5274 bool default_seen = false;
5275 auto cases = impl()->NewCaseClauseList(4);
5276 Expect(Token::LBRACE, CHECK_OK);
5277 while (peek() != Token::RBRACE) {
5278 // An empty label indicates the default case.
5279 ExpressionT label = impl()->EmptyExpression();
5280 if (Check(Token::CASE)) {
5281 label = ParseExpression(true, CHECK_OK);
5282 } else {
5283 Expect(Token::DEFAULT, CHECK_OK);
5284 if (default_seen) {
5285 ReportMessage(MessageTemplate::kMultipleDefaultsInSwitch);
5286 *ok = false;
5287 return impl()->NullStatement();
5288 }
5289 default_seen = true;
5290 }
5291 Expect(Token::COLON, CHECK_OK);
5292 int clause_pos = position();
5293 StatementListT statements = impl()->NewStatementList(5);
5294 while (peek() != Token::CASE && peek() != Token::DEFAULT &&
5295 peek() != Token::RBRACE) {
5296 StatementT stat = ParseStatementListItem(CHECK_OK);
5297 statements->Add(stat, zone());
5298 }
5299 auto clause = factory()->NewCaseClause(label, statements, clause_pos);
5300 cases->Add(clause, zone());
5301 }
5302 Expect(Token::RBRACE, CHECK_OK);
5303
5304 scope()->set_end_position(scanner()->location().end_pos);
5305 return impl()->RewriteSwitchStatement(tag, switch_statement, cases,
5306 scope()->FinalizeBlockScope());
5307 }
5308 }
5309
5310 template <typename Impl>
ParseTryStatement(bool * ok)5311 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseTryStatement(
5312 bool* ok) {
5313 // TryStatement ::
5314 // 'try' Block Catch
5315 // 'try' Block Finally
5316 // 'try' Block Catch Finally
5317 //
5318 // Catch ::
5319 // 'catch' '(' Identifier ')' Block
5320 //
5321 // Finally ::
5322 // 'finally' Block
5323
5324 Expect(Token::TRY, CHECK_OK);
5325 int pos = position();
5326
5327 BlockT try_block = impl()->NullBlock();
5328 {
5329 ReturnExprScope no_tail_calls(function_state_,
5330 ReturnExprContext::kInsideTryBlock);
5331 try_block = ParseBlock(nullptr, CHECK_OK);
5332 }
5333
5334 CatchInfo catch_info(this);
5335
5336 if (peek() != Token::CATCH && peek() != Token::FINALLY) {
5337 ReportMessage(MessageTemplate::kNoCatchOrFinally);
5338 *ok = false;
5339 return impl()->NullStatement();
5340 }
5341
5342 BlockT catch_block = impl()->NullBlock();
5343 if (Check(Token::CATCH)) {
5344 Expect(Token::LPAREN, CHECK_OK);
5345 catch_info.scope = NewScope(CATCH_SCOPE);
5346 catch_info.scope->set_start_position(scanner()->location().beg_pos);
5347
5348 {
5349 CollectExpressionsInTailPositionToListScope
5350 collect_tail_call_expressions_scope(
5351 function_state_, &catch_info.tail_call_expressions);
5352 BlockState catch_block_state(&scope_, catch_info.scope);
5353
5354 catch_block = factory()->NewBlock(nullptr, 16, false, kNoSourcePosition);
5355
5356 // Create a block scope to hold any lexical declarations created
5357 // as part of destructuring the catch parameter.
5358 {
5359 BlockState catch_variable_block_state(zone(), &scope_);
5360 scope()->set_start_position(scanner()->location().beg_pos);
5361 typename Types::Target target(this, catch_block);
5362
5363 // This does not simply call ParsePrimaryExpression to avoid
5364 // ExpressionFromIdentifier from being called in the first
5365 // branch, which would introduce an unresolved symbol and mess
5366 // with arrow function names.
5367 if (peek_any_identifier()) {
5368 catch_info.name =
5369 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK);
5370 } else {
5371 ExpressionClassifier pattern_classifier(this);
5372 catch_info.pattern = ParsePrimaryExpression(CHECK_OK);
5373 ValidateBindingPattern(CHECK_OK);
5374 }
5375
5376 Expect(Token::RPAREN, CHECK_OK);
5377 impl()->RewriteCatchPattern(&catch_info, CHECK_OK);
5378 if (!impl()->IsNullStatement(catch_info.init_block)) {
5379 catch_block->statements()->Add(catch_info.init_block, zone());
5380 }
5381
5382 catch_info.inner_block = ParseBlock(nullptr, CHECK_OK);
5383 catch_block->statements()->Add(catch_info.inner_block, zone());
5384 impl()->ValidateCatchBlock(catch_info, CHECK_OK);
5385 scope()->set_end_position(scanner()->location().end_pos);
5386 catch_block->set_scope(scope()->FinalizeBlockScope());
5387 }
5388 }
5389
5390 catch_info.scope->set_end_position(scanner()->location().end_pos);
5391 }
5392
5393 BlockT finally_block = impl()->NullBlock();
5394 DCHECK(peek() == Token::FINALLY || !impl()->IsNullStatement(catch_block));
5395 if (Check(Token::FINALLY)) {
5396 finally_block = ParseBlock(nullptr, CHECK_OK);
5397 }
5398
5399 return impl()->RewriteTryStatement(try_block, catch_block, finally_block,
5400 catch_info, pos);
5401 }
5402
5403 template <typename Impl>
ParseForStatement(ZoneList<const AstRawString * > * labels,bool * ok)5404 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForStatement(
5405 ZoneList<const AstRawString*>* labels, bool* ok) {
5406 int stmt_pos = peek_position();
5407 ForInfo for_info(this);
5408 bool bound_names_are_lexical = false;
5409
5410 // Create an in-between scope for let-bound iteration variables.
5411 BlockState for_state(zone(), &scope_);
5412 Expect(Token::FOR, CHECK_OK);
5413 Expect(Token::LPAREN, CHECK_OK);
5414 scope()->set_start_position(scanner()->location().beg_pos);
5415 scope()->set_is_hidden();
5416
5417 StatementT init = impl()->NullStatement();
5418
5419 if (peek() == Token::VAR || peek() == Token::CONST ||
5420 (peek() == Token::LET && IsNextLetKeyword())) {
5421 // The initializer contains declarations.
5422 ParseVariableDeclarations(kForStatement, &for_info.parsing_result, nullptr,
5423 CHECK_OK);
5424 bound_names_are_lexical =
5425 IsLexicalVariableMode(for_info.parsing_result.descriptor.mode);
5426 for_info.position = scanner()->location().beg_pos;
5427
5428 if (CheckInOrOf(&for_info.mode)) {
5429 return ParseForEachStatementWithDeclarations(stmt_pos, &for_info, labels,
5430 ok);
5431 }
5432
5433 // One or more declaration not followed by in/of.
5434 init = impl()->BuildInitializationBlock(
5435 &for_info.parsing_result,
5436 bound_names_are_lexical ? &for_info.bound_names : nullptr, CHECK_OK);
5437 } else if (peek() != Token::SEMICOLON) {
5438 // The initializer does not contain declarations.
5439 int lhs_beg_pos = peek_position();
5440 ExpressionClassifier classifier(this);
5441 ExpressionT expression = ParseExpressionCoverGrammar(false, CHECK_OK);
5442 int lhs_end_pos = scanner()->location().end_pos;
5443
5444 bool is_for_each = CheckInOrOf(&for_info.mode);
5445 bool is_destructuring = is_for_each && (expression->IsArrayLiteral() ||
5446 expression->IsObjectLiteral());
5447
5448 if (is_destructuring) {
5449 ValidateAssignmentPattern(CHECK_OK);
5450 } else {
5451 impl()->RewriteNonPattern(CHECK_OK);
5452 }
5453
5454 if (is_for_each) {
5455 return ParseForEachStatementWithoutDeclarations(stmt_pos, expression,
5456 lhs_beg_pos, lhs_end_pos,
5457 &for_info, labels, ok);
5458 }
5459 // Initializer is just an expression.
5460 init = factory()->NewExpressionStatement(expression, lhs_beg_pos);
5461 }
5462
5463 // Standard 'for' loop, we have parsed the initializer at this point.
5464 return ParseStandardForLoop(stmt_pos, init, bound_names_are_lexical,
5465 &for_info, &for_state, labels, ok);
5466 }
5467
5468 template <typename Impl>
5469 typename ParserBase<Impl>::StatementT
ParseForEachStatementWithDeclarations(int stmt_pos,ForInfo * for_info,ZoneList<const AstRawString * > * labels,bool * ok)5470 ParserBase<Impl>::ParseForEachStatementWithDeclarations(
5471 int stmt_pos, ForInfo* for_info, ZoneList<const AstRawString*>* labels,
5472 bool* ok) {
5473 // Just one declaration followed by in/of.
5474 if (for_info->parsing_result.declarations.length() != 1) {
5475 impl()->ReportMessageAt(for_info->parsing_result.bindings_loc,
5476 MessageTemplate::kForInOfLoopMultiBindings,
5477 ForEachStatement::VisitModeString(for_info->mode));
5478 *ok = false;
5479 return impl()->NullStatement();
5480 }
5481 if (for_info->parsing_result.first_initializer_loc.IsValid() &&
5482 (is_strict(language_mode()) ||
5483 for_info->mode == ForEachStatement::ITERATE ||
5484 IsLexicalVariableMode(for_info->parsing_result.descriptor.mode) ||
5485 !impl()->IsIdentifier(
5486 for_info->parsing_result.declarations[0].pattern))) {
5487 impl()->ReportMessageAt(for_info->parsing_result.first_initializer_loc,
5488 MessageTemplate::kForInOfLoopInitializer,
5489 ForEachStatement::VisitModeString(for_info->mode));
5490 *ok = false;
5491 return impl()->NullStatement();
5492 }
5493
5494 BlockT init_block = impl()->RewriteForVarInLegacy(*for_info);
5495
5496 auto loop = factory()->NewForEachStatement(for_info->mode, labels, stmt_pos);
5497 typename Types::Target target(this, loop);
5498
5499 int each_keyword_pos = scanner()->location().beg_pos;
5500
5501 ExpressionT enumerable = impl()->EmptyExpression();
5502 if (for_info->mode == ForEachStatement::ITERATE) {
5503 ExpressionClassifier classifier(this);
5504 enumerable = ParseAssignmentExpression(true, CHECK_OK);
5505 impl()->RewriteNonPattern(CHECK_OK);
5506 } else {
5507 enumerable = ParseExpression(true, CHECK_OK);
5508 }
5509
5510 Expect(Token::RPAREN, CHECK_OK);
5511
5512 StatementT final_loop = impl()->NullStatement();
5513 {
5514 ReturnExprScope no_tail_calls(function_state_,
5515 ReturnExprContext::kInsideForInOfBody);
5516 BlockState block_state(zone(), &scope_);
5517 scope()->set_start_position(scanner()->location().beg_pos);
5518
5519 StatementT body = ParseStatement(nullptr, CHECK_OK);
5520
5521 BlockT body_block = impl()->NullBlock();
5522 ExpressionT each_variable = impl()->EmptyExpression();
5523 impl()->DesugarBindingInForEachStatement(for_info, &body_block,
5524 &each_variable, CHECK_OK);
5525 body_block->statements()->Add(body, zone());
5526 final_loop = impl()->InitializeForEachStatement(
5527 loop, each_variable, enumerable, body_block, each_keyword_pos);
5528
5529 scope()->set_end_position(scanner()->location().end_pos);
5530 body_block->set_scope(scope()->FinalizeBlockScope());
5531 }
5532
5533 init_block = impl()->CreateForEachStatementTDZ(init_block, *for_info, ok);
5534
5535 scope()->set_end_position(scanner()->location().end_pos);
5536 Scope* for_scope = scope()->FinalizeBlockScope();
5537 // Parsed for-in loop w/ variable declarations.
5538 if (!impl()->IsNullStatement(init_block)) {
5539 init_block->statements()->Add(final_loop, zone());
5540 init_block->set_scope(for_scope);
5541 return init_block;
5542 }
5543
5544 DCHECK_NULL(for_scope);
5545 return final_loop;
5546 }
5547
5548 template <typename Impl>
5549 typename ParserBase<Impl>::StatementT
ParseForEachStatementWithoutDeclarations(int stmt_pos,ExpressionT expression,int lhs_beg_pos,int lhs_end_pos,ForInfo * for_info,ZoneList<const AstRawString * > * labels,bool * ok)5550 ParserBase<Impl>::ParseForEachStatementWithoutDeclarations(
5551 int stmt_pos, ExpressionT expression, int lhs_beg_pos, int lhs_end_pos,
5552 ForInfo* for_info, ZoneList<const AstRawString*>* labels, bool* ok) {
5553 // Initializer is reference followed by in/of.
5554 if (!expression->IsArrayLiteral() && !expression->IsObjectLiteral()) {
5555 expression = impl()->CheckAndRewriteReferenceExpression(
5556 expression, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor,
5557 kSyntaxError, CHECK_OK);
5558 }
5559
5560 auto loop = factory()->NewForEachStatement(for_info->mode, labels, stmt_pos);
5561 typename Types::Target target(this, loop);
5562
5563 int each_keyword_pos = scanner()->location().beg_pos;
5564
5565 ExpressionT enumerable = impl()->EmptyExpression();
5566 if (for_info->mode == ForEachStatement::ITERATE) {
5567 ExpressionClassifier classifier(this);
5568 enumerable = ParseAssignmentExpression(true, CHECK_OK);
5569 impl()->RewriteNonPattern(CHECK_OK);
5570 } else {
5571 enumerable = ParseExpression(true, CHECK_OK);
5572 }
5573
5574 Expect(Token::RPAREN, CHECK_OK);
5575 Scope* for_scope = scope();
5576
5577 {
5578 ReturnExprScope no_tail_calls(function_state_,
5579 ReturnExprContext::kInsideForInOfBody);
5580 BlockState block_state(zone(), &scope_);
5581 scope()->set_start_position(scanner()->location().beg_pos);
5582
5583 StatementT body = ParseStatement(nullptr, CHECK_OK);
5584 scope()->set_end_position(scanner()->location().end_pos);
5585 StatementT final_loop = impl()->InitializeForEachStatement(
5586 loop, expression, enumerable, body, each_keyword_pos);
5587
5588 for_scope = for_scope->FinalizeBlockScope();
5589 USE(for_scope);
5590 DCHECK_NULL(for_scope);
5591 Scope* block_scope = scope()->FinalizeBlockScope();
5592 USE(block_scope);
5593 DCHECK_NULL(block_scope);
5594 return final_loop;
5595 }
5596 }
5597
5598 template <typename Impl>
ParseStandardForLoop(int stmt_pos,StatementT init,bool bound_names_are_lexical,ForInfo * for_info,BlockState * for_state,ZoneList<const AstRawString * > * labels,bool * ok)5599 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStandardForLoop(
5600 int stmt_pos, StatementT init, bool bound_names_are_lexical,
5601 ForInfo* for_info, BlockState* for_state,
5602 ZoneList<const AstRawString*>* labels, bool* ok) {
5603 auto loop = factory()->NewForStatement(labels, stmt_pos);
5604 typename Types::Target target(this, loop);
5605
5606 Expect(Token::SEMICOLON, CHECK_OK);
5607
5608 ExpressionT cond = impl()->EmptyExpression();
5609 StatementT next = impl()->NullStatement();
5610 StatementT body = impl()->NullStatement();
5611
5612 // If there are let bindings, then condition and the next statement of the
5613 // for loop must be parsed in a new scope.
5614 Scope* inner_scope = scope();
5615 if (bound_names_are_lexical && for_info->bound_names.length() > 0) {
5616 inner_scope = NewScopeWithParent(inner_scope, BLOCK_SCOPE);
5617 inner_scope->set_start_position(scanner()->location().beg_pos);
5618 }
5619 {
5620 BlockState block_state(&scope_, inner_scope);
5621
5622 if (peek() != Token::SEMICOLON) {
5623 cond = ParseExpression(true, CHECK_OK);
5624 }
5625 Expect(Token::SEMICOLON, CHECK_OK);
5626
5627 if (peek() != Token::RPAREN) {
5628 ExpressionT exp = ParseExpression(true, CHECK_OK);
5629 next = factory()->NewExpressionStatement(exp, exp->position());
5630 }
5631 Expect(Token::RPAREN, CHECK_OK);
5632
5633 body = ParseStatement(nullptr, CHECK_OK);
5634 }
5635
5636 if (bound_names_are_lexical && for_info->bound_names.length() > 0) {
5637 auto result = impl()->DesugarLexicalBindingsInForStatement(
5638 loop, init, cond, next, body, inner_scope, *for_info, CHECK_OK);
5639 scope()->set_end_position(scanner()->location().end_pos);
5640 inner_scope->set_end_position(scanner()->location().end_pos);
5641 return result;
5642 }
5643
5644 scope()->set_end_position(scanner()->location().end_pos);
5645 Scope* for_scope = scope()->FinalizeBlockScope();
5646 if (for_scope != nullptr) {
5647 // Rewrite a for statement of the form
5648 // for (const x = i; c; n) b
5649 //
5650 // into
5651 //
5652 // {
5653 // const x = i;
5654 // for (; c; n) b
5655 // }
5656 //
5657 // or, desugar
5658 // for (; c; n) b
5659 // into
5660 // {
5661 // for (; c; n) b
5662 // }
5663 // just in case b introduces a lexical binding some other way, e.g., if b
5664 // is a FunctionDeclaration.
5665 BlockT block = factory()->NewBlock(nullptr, 2, false, kNoSourcePosition);
5666 if (!impl()->IsNullStatement(init)) {
5667 block->statements()->Add(init, zone());
5668 }
5669 block->statements()->Add(loop, zone());
5670 block->set_scope(for_scope);
5671 loop->Initialize(init, cond, next, body);
5672 return block;
5673 }
5674
5675 loop->Initialize(init, cond, next, body);
5676 return loop;
5677 }
5678
5679 template <typename Impl>
MarkLoopVariableAsAssigned(Scope * scope,Variable * var)5680 void ParserBase<Impl>::MarkLoopVariableAsAssigned(Scope* scope, Variable* var) {
5681 if (!IsLexicalVariableMode(var->mode()) && !scope->is_function_scope()) {
5682 var->set_maybe_assigned();
5683 }
5684 }
5685
5686 template <typename Impl>
ParseForAwaitStatement(ZoneList<const AstRawString * > * labels,bool * ok)5687 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForAwaitStatement(
5688 ZoneList<const AstRawString*>* labels, bool* ok) {
5689 // for await '(' ForDeclaration of AssignmentExpression ')'
5690 DCHECK(is_async_function());
5691 DCHECK(allow_harmony_async_iteration());
5692
5693 int stmt_pos = peek_position();
5694
5695 ForInfo for_info(this);
5696 for_info.mode = ForEachStatement::ITERATE;
5697
5698 // Create an in-between scope for let-bound iteration variables.
5699 BlockState for_state(zone(), &scope_);
5700 Expect(Token::FOR, CHECK_OK);
5701 Expect(Token::AWAIT, CHECK_OK);
5702 Expect(Token::LPAREN, CHECK_OK);
5703 scope()->set_start_position(scanner()->location().beg_pos);
5704 scope()->set_is_hidden();
5705
5706 auto loop = factory()->NewForOfStatement(labels, stmt_pos);
5707 typename Types::Target target(this, loop);
5708
5709 ExpressionT each_variable = impl()->EmptyExpression();
5710
5711 bool has_declarations = false;
5712
5713 if (peek() == Token::VAR || peek() == Token::CONST ||
5714 (peek() == Token::LET && IsNextLetKeyword())) {
5715 // The initializer contains declarations
5716 // 'for' 'await' '(' ForDeclaration 'of' AssignmentExpression ')'
5717 // Statement
5718 // 'for' 'await' '(' 'var' ForBinding 'of' AssignmentExpression ')'
5719 // Statement
5720 has_declarations = true;
5721 ParseVariableDeclarations(kForStatement, &for_info.parsing_result, nullptr,
5722 CHECK_OK);
5723 for_info.position = scanner()->location().beg_pos;
5724
5725 // Only a single declaration is allowed in for-await-of loops
5726 if (for_info.parsing_result.declarations.length() != 1) {
5727 impl()->ReportMessageAt(for_info.parsing_result.bindings_loc,
5728 MessageTemplate::kForInOfLoopMultiBindings,
5729 "for-await-of");
5730 *ok = false;
5731 return impl()->NullStatement();
5732 }
5733
5734 // for-await-of's declarations do not permit initializers.
5735 if (for_info.parsing_result.first_initializer_loc.IsValid()) {
5736 impl()->ReportMessageAt(for_info.parsing_result.first_initializer_loc,
5737 MessageTemplate::kForInOfLoopInitializer,
5738 "for-await-of");
5739 *ok = false;
5740 return impl()->NullStatement();
5741 }
5742 } else {
5743 // The initializer does not contain declarations.
5744 // 'for' 'await' '(' LeftHandSideExpression 'of' AssignmentExpression ')'
5745 // Statement
5746 int lhs_beg_pos = peek_position();
5747 ExpressionClassifier classifier(this);
5748 ExpressionT lhs = each_variable = ParseLeftHandSideExpression(CHECK_OK);
5749 int lhs_end_pos = scanner()->location().end_pos;
5750
5751 if (lhs->IsArrayLiteral() || lhs->IsObjectLiteral()) {
5752 ValidateAssignmentPattern(CHECK_OK);
5753 } else {
5754 impl()->RewriteNonPattern(CHECK_OK);
5755 each_variable = impl()->CheckAndRewriteReferenceExpression(
5756 lhs, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor,
5757 kSyntaxError, CHECK_OK);
5758 }
5759 }
5760
5761 ExpectContextualKeyword(CStrVector("of"), CHECK_OK);
5762 int each_keyword_pos = scanner()->location().beg_pos;
5763
5764 const bool kAllowIn = true;
5765 ExpressionT iterable = impl()->EmptyExpression();
5766
5767 {
5768 ExpressionClassifier classifier(this);
5769 iterable = ParseAssignmentExpression(kAllowIn, CHECK_OK);
5770 impl()->RewriteNonPattern(CHECK_OK);
5771 }
5772
5773 Expect(Token::RPAREN, CHECK_OK);
5774
5775 StatementT final_loop = impl()->NullStatement();
5776 Scope* for_scope = scope();
5777 {
5778 ReturnExprScope no_tail_calls(function_state_,
5779 ReturnExprContext::kInsideForInOfBody);
5780 BlockState block_state(zone(), &scope_);
5781 scope()->set_start_position(scanner()->location().beg_pos);
5782
5783 StatementT body = ParseStatement(nullptr, CHECK_OK);
5784 scope()->set_end_position(scanner()->location().end_pos);
5785
5786 if (has_declarations) {
5787 BlockT body_block = impl()->NullBlock();
5788 impl()->DesugarBindingInForEachStatement(&for_info, &body_block,
5789 &each_variable, CHECK_OK);
5790 body_block->statements()->Add(body, zone());
5791 body_block->set_scope(scope()->FinalizeBlockScope());
5792
5793 const bool finalize = true;
5794 final_loop = impl()->InitializeForOfStatement(
5795 loop, each_variable, iterable, body_block, finalize,
5796 IteratorType::kAsync, each_keyword_pos);
5797 } else {
5798 const bool finalize = true;
5799 final_loop = impl()->InitializeForOfStatement(
5800 loop, each_variable, iterable, body, finalize, IteratorType::kAsync,
5801 each_keyword_pos);
5802
5803 for_scope = for_scope->FinalizeBlockScope();
5804 DCHECK_NULL(for_scope);
5805 USE(for_scope);
5806 Scope* block_scope = scope()->FinalizeBlockScope();
5807 DCHECK_NULL(block_scope);
5808 USE(block_scope);
5809 return final_loop;
5810 }
5811 }
5812
5813 DCHECK(has_declarations);
5814 BlockT init_block =
5815 impl()->CreateForEachStatementTDZ(impl()->NullBlock(), for_info, ok);
5816
5817 for_scope->set_end_position(scanner()->location().end_pos);
5818 for_scope = for_scope->FinalizeBlockScope();
5819 // Parsed for-in loop w/ variable declarations.
5820 if (!impl()->IsNullStatement(init_block)) {
5821 init_block->statements()->Add(final_loop, zone());
5822 init_block->set_scope(for_scope);
5823 return init_block;
5824 }
5825 DCHECK_NULL(for_scope);
5826 return final_loop;
5827 }
5828
5829 template <typename Impl>
CheckDuplicateProto(Token::Value property)5830 void ParserBase<Impl>::ObjectLiteralChecker::CheckDuplicateProto(
5831 Token::Value property) {
5832 if (property == Token::SMI || property == Token::NUMBER) return;
5833
5834 if (IsProto()) {
5835 if (has_seen_proto_) {
5836 this->parser()->classifier()->RecordExpressionError(
5837 this->scanner()->location(), MessageTemplate::kDuplicateProto);
5838 return;
5839 }
5840 has_seen_proto_ = true;
5841 }
5842 }
5843
5844 template <typename Impl>
CheckClassMethodName(Token::Value property,PropertyKind type,bool is_generator,bool is_async,bool is_static,bool * ok)5845 void ParserBase<Impl>::ClassLiteralChecker::CheckClassMethodName(
5846 Token::Value property, PropertyKind type, bool is_generator, bool is_async,
5847 bool is_static, bool* ok) {
5848 DCHECK(type == PropertyKind::kMethodProperty ||
5849 type == PropertyKind::kAccessorProperty);
5850
5851 if (property == Token::SMI || property == Token::NUMBER) return;
5852
5853 if (is_static) {
5854 if (IsPrototype()) {
5855 this->parser()->ReportMessage(MessageTemplate::kStaticPrototype);
5856 *ok = false;
5857 return;
5858 }
5859 } else if (IsConstructor()) {
5860 if (is_generator || is_async || type == PropertyKind::kAccessorProperty) {
5861 MessageTemplate::Template msg =
5862 is_generator ? MessageTemplate::kConstructorIsGenerator
5863 : is_async ? MessageTemplate::kConstructorIsAsync
5864 : MessageTemplate::kConstructorIsAccessor;
5865 this->parser()->ReportMessage(msg);
5866 *ok = false;
5867 return;
5868 }
5869 if (has_seen_constructor_) {
5870 this->parser()->ReportMessage(MessageTemplate::kDuplicateConstructor);
5871 *ok = false;
5872 return;
5873 }
5874 has_seen_constructor_ = true;
5875 return;
5876 }
5877 }
5878
5879 #undef CHECK_OK
5880 #undef CHECK_OK_CUSTOM
5881 #undef CHECK_OK_VOID
5882
5883 } // namespace internal
5884 } // namespace v8
5885
5886 #endif // V8_PARSING_PARSER_BASE_H
5887