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#include "src/parsing/parser.h"
6
7#include <memory>
8
9#include "src/api.h"
10#include "src/ast/ast-expression-rewriter.h"
11#include "src/ast/ast-function-literal-id-reindexer.h"
12#include "src/ast/ast-traversal-visitor.h"
13#include "src/ast/ast.h"
14#include "src/bailout-reason.h"
15#include "src/base/platform/platform.h"
16#include "src/char-predicates-inl.h"
17#include "src/messages.h"
18#include "src/objects-inl.h"
19#include "src/parsing/duplicate-finder.h"
20#include "src/parsing/parameter-initializer-rewriter.h"
21#include "src/parsing/parse-info.h"
22#include "src/parsing/rewriter.h"
23#include "src/parsing/scanner-character-streams.h"
24#include "src/runtime/runtime.h"
25#include "src/string-stream.h"
26#include "src/tracing/trace-event.h"
27
28namespace v8 {
29namespace internal {
30
31ScriptData::ScriptData(const byte* data, int length)
32    : owns_data_(false), rejected_(false), data_(data), length_(length) {
33  if (!IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment)) {
34    byte* copy = NewArray<byte>(length);
35    DCHECK(IsAligned(reinterpret_cast<intptr_t>(copy), kPointerAlignment));
36    CopyBytes(copy, data, length);
37    data_ = copy;
38    AcquireDataOwnership();
39  }
40}
41
42FunctionEntry ParseData::GetFunctionEntry(int start) {
43  // The current pre-data entry must be a FunctionEntry with the given
44  // start position.
45  if ((function_index_ + FunctionEntry::kSize <= Length()) &&
46      (static_cast<int>(Data()[function_index_]) == start)) {
47    int index = function_index_;
48    function_index_ += FunctionEntry::kSize;
49    Vector<unsigned> subvector(&(Data()[index]), FunctionEntry::kSize);
50    return FunctionEntry(subvector);
51  }
52  return FunctionEntry();
53}
54
55
56int ParseData::FunctionCount() {
57  int functions_size = FunctionsSize();
58  if (functions_size < 0) return 0;
59  if (functions_size % FunctionEntry::kSize != 0) return 0;
60  return functions_size / FunctionEntry::kSize;
61}
62
63
64bool ParseData::IsSane() {
65  if (!IsAligned(script_data_->length(), sizeof(unsigned))) return false;
66  // Check that the header data is valid and doesn't specify
67  // point to positions outside the store.
68  int data_length = Length();
69  if (data_length < PreparseDataConstants::kHeaderSize) return false;
70  if (Magic() != PreparseDataConstants::kMagicNumber) return false;
71  if (Version() != PreparseDataConstants::kCurrentVersion) return false;
72  // Check that the space allocated for function entries is sane.
73  int functions_size = FunctionsSize();
74  if (functions_size < 0) return false;
75  if (functions_size % FunctionEntry::kSize != 0) return false;
76  // Check that the total size has room for header and function entries.
77  int minimum_size =
78      PreparseDataConstants::kHeaderSize + functions_size;
79  if (data_length < minimum_size) return false;
80  return true;
81}
82
83
84void ParseData::Initialize() {
85  // Prepares state for use.
86  int data_length = Length();
87  if (data_length >= PreparseDataConstants::kHeaderSize) {
88    function_index_ = PreparseDataConstants::kHeaderSize;
89  }
90}
91
92
93unsigned ParseData::Magic() {
94  return Data()[PreparseDataConstants::kMagicOffset];
95}
96
97
98unsigned ParseData::Version() {
99  return Data()[PreparseDataConstants::kVersionOffset];
100}
101
102
103int ParseData::FunctionsSize() {
104  return static_cast<int>(Data()[PreparseDataConstants::kFunctionsSizeOffset]);
105}
106
107// Helper for putting parts of the parse results into a temporary zone when
108// parsing inner function bodies.
109class DiscardableZoneScope {
110 public:
111  DiscardableZoneScope(Parser* parser, Zone* temp_zone, bool use_temp_zone)
112      : ast_node_factory_scope_(parser->factory(), temp_zone, use_temp_zone),
113        fni_(parser->ast_value_factory_, temp_zone),
114        parser_(parser),
115        prev_fni_(parser->fni_),
116        prev_zone_(parser->zone_),
117        prev_allow_lazy_(parser->allow_lazy_),
118        prev_temp_zoned_(parser->temp_zoned_) {
119    if (use_temp_zone) {
120      DCHECK(!parser_->temp_zoned_);
121      parser_->allow_lazy_ = false;
122      parser_->temp_zoned_ = true;
123      parser_->fni_ = &fni_;
124      parser_->zone_ = temp_zone;
125      if (parser_->reusable_preparser_ != nullptr) {
126        parser_->reusable_preparser_->zone_ = temp_zone;
127        parser_->reusable_preparser_->factory()->set_zone(temp_zone);
128      }
129    }
130  }
131  void Reset() {
132    parser_->fni_ = prev_fni_;
133    parser_->zone_ = prev_zone_;
134    parser_->allow_lazy_ = prev_allow_lazy_;
135    parser_->temp_zoned_ = prev_temp_zoned_;
136    if (parser_->reusable_preparser_ != nullptr) {
137      parser_->reusable_preparser_->zone_ = prev_zone_;
138      parser_->reusable_preparser_->factory()->set_zone(prev_zone_);
139    }
140    ast_node_factory_scope_.Reset();
141  }
142  ~DiscardableZoneScope() { Reset(); }
143
144 private:
145  AstNodeFactory::BodyScope ast_node_factory_scope_;
146  FuncNameInferrer fni_;
147  Parser* parser_;
148  FuncNameInferrer* prev_fni_;
149  Zone* prev_zone_;
150  bool prev_allow_lazy_;
151  bool prev_temp_zoned_;
152
153  DISALLOW_COPY_AND_ASSIGN(DiscardableZoneScope);
154};
155
156void Parser::SetCachedData(ParseInfo* info) {
157  DCHECK_NULL(cached_parse_data_);
158  if (consume_cached_parse_data()) {
159    if (allow_lazy_) {
160      cached_parse_data_ = ParseData::FromCachedData(*info->cached_data());
161      if (cached_parse_data_ != nullptr) return;
162    }
163    compile_options_ = ScriptCompiler::kNoCompileOptions;
164  }
165}
166
167FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name,
168                                            bool call_super, int pos,
169                                            int end_pos) {
170  int expected_property_count = -1;
171  const int parameter_count = 0;
172  if (name == nullptr) name = ast_value_factory()->empty_string();
173
174  FunctionKind kind = call_super ? FunctionKind::kDefaultDerivedConstructor
175                                 : FunctionKind::kDefaultBaseConstructor;
176  DeclarationScope* function_scope = NewFunctionScope(kind);
177  SetLanguageMode(function_scope, STRICT);
178  // Set start and end position to the same value
179  function_scope->set_start_position(pos);
180  function_scope->set_end_position(pos);
181  ZoneList<Statement*>* body = NULL;
182
183  {
184    FunctionState function_state(&function_state_, &scope_, function_scope);
185
186    body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone());
187    if (call_super) {
188      // Create a SuperCallReference and handle in BytecodeGenerator.
189      auto constructor_args_name = ast_value_factory()->empty_string();
190      bool is_duplicate;
191      bool is_rest = true;
192      bool is_optional = false;
193      Variable* constructor_args = function_scope->DeclareParameter(
194          constructor_args_name, TEMPORARY, is_optional, is_rest, &is_duplicate,
195          ast_value_factory());
196
197      ZoneList<Expression*>* args =
198          new (zone()) ZoneList<Expression*>(1, zone());
199      Spread* spread_args = factory()->NewSpread(
200          factory()->NewVariableProxy(constructor_args), pos, pos);
201
202      args->Add(spread_args, zone());
203      Expression* super_call_ref = NewSuperCallReference(pos);
204      Expression* call = factory()->NewCall(super_call_ref, args, pos);
205      body->Add(factory()->NewReturnStatement(call, pos), zone());
206    }
207
208    expected_property_count = function_state.expected_property_count();
209  }
210
211  FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
212      name, function_scope, body, expected_property_count, parameter_count,
213      parameter_count, FunctionLiteral::kNoDuplicateParameters,
214      FunctionLiteral::kAnonymousExpression, default_eager_compile_hint(), pos,
215      true, GetNextFunctionLiteralId());
216
217  return function_literal;
218}
219
220// ----------------------------------------------------------------------------
221// The CHECK_OK macro is a convenient macro to enforce error
222// handling for functions that may fail (by returning !*ok).
223//
224// CAUTION: This macro appends extra statements after a call,
225// thus it must never be used where only a single statement
226// is correct (e.g. an if statement branch w/o braces)!
227
228#define CHECK_OK_VALUE(x) ok); \
229  if (!*ok) return x;          \
230  ((void)0
231#define DUMMY )  // to make indentation work
232#undef DUMMY
233
234#define CHECK_OK CHECK_OK_VALUE(nullptr)
235#define CHECK_OK_VOID CHECK_OK_VALUE(this->Void())
236
237#define CHECK_FAILED /**/); \
238  if (failed_) return nullptr;  \
239  ((void)0
240#define DUMMY )  // to make indentation work
241#undef DUMMY
242
243// ----------------------------------------------------------------------------
244// Implementation of Parser
245
246bool Parser::ShortcutNumericLiteralBinaryExpression(Expression** x,
247                                                    Expression* y,
248                                                    Token::Value op, int pos) {
249  if ((*x)->AsLiteral() && (*x)->AsLiteral()->raw_value()->IsNumber() &&
250      y->AsLiteral() && y->AsLiteral()->raw_value()->IsNumber()) {
251    double x_val = (*x)->AsLiteral()->raw_value()->AsNumber();
252    double y_val = y->AsLiteral()->raw_value()->AsNumber();
253    bool x_has_dot = (*x)->AsLiteral()->raw_value()->ContainsDot();
254    bool y_has_dot = y->AsLiteral()->raw_value()->ContainsDot();
255    bool has_dot = x_has_dot || y_has_dot;
256    switch (op) {
257      case Token::ADD:
258        *x = factory()->NewNumberLiteral(x_val + y_val, pos, has_dot);
259        return true;
260      case Token::SUB:
261        *x = factory()->NewNumberLiteral(x_val - y_val, pos, has_dot);
262        return true;
263      case Token::MUL:
264        *x = factory()->NewNumberLiteral(x_val * y_val, pos, has_dot);
265        return true;
266      case Token::DIV:
267        *x = factory()->NewNumberLiteral(x_val / y_val, pos, has_dot);
268        return true;
269      case Token::BIT_OR: {
270        int value = DoubleToInt32(x_val) | DoubleToInt32(y_val);
271        *x = factory()->NewNumberLiteral(value, pos, has_dot);
272        return true;
273      }
274      case Token::BIT_AND: {
275        int value = DoubleToInt32(x_val) & DoubleToInt32(y_val);
276        *x = factory()->NewNumberLiteral(value, pos, has_dot);
277        return true;
278      }
279      case Token::BIT_XOR: {
280        int value = DoubleToInt32(x_val) ^ DoubleToInt32(y_val);
281        *x = factory()->NewNumberLiteral(value, pos, has_dot);
282        return true;
283      }
284      case Token::SHL: {
285        int value = DoubleToInt32(x_val) << (DoubleToInt32(y_val) & 0x1f);
286        *x = factory()->NewNumberLiteral(value, pos, has_dot);
287        return true;
288      }
289      case Token::SHR: {
290        uint32_t shift = DoubleToInt32(y_val) & 0x1f;
291        uint32_t value = DoubleToUint32(x_val) >> shift;
292        *x = factory()->NewNumberLiteral(value, pos, has_dot);
293        return true;
294      }
295      case Token::SAR: {
296        uint32_t shift = DoubleToInt32(y_val) & 0x1f;
297        int value = ArithmeticShiftRight(DoubleToInt32(x_val), shift);
298        *x = factory()->NewNumberLiteral(value, pos, has_dot);
299        return true;
300      }
301      case Token::EXP: {
302        double value = Pow(x_val, y_val);
303        int int_value = static_cast<int>(value);
304        *x = factory()->NewNumberLiteral(
305            int_value == value && value != -0.0 ? int_value : value, pos,
306            has_dot);
307        return true;
308      }
309      default:
310        break;
311    }
312  }
313  return false;
314}
315
316Expression* Parser::BuildUnaryExpression(Expression* expression,
317                                         Token::Value op, int pos) {
318  DCHECK(expression != NULL);
319  if (expression->IsLiteral()) {
320    const AstValue* literal = expression->AsLiteral()->raw_value();
321    if (op == Token::NOT) {
322      // Convert the literal to a boolean condition and negate it.
323      bool condition = literal->BooleanValue();
324      return factory()->NewBooleanLiteral(!condition, pos);
325    } else if (literal->IsNumber()) {
326      // Compute some expressions involving only number literals.
327      double value = literal->AsNumber();
328      bool has_dot = literal->ContainsDot();
329      switch (op) {
330        case Token::ADD:
331          return expression;
332        case Token::SUB:
333          return factory()->NewNumberLiteral(-value, pos, has_dot);
334        case Token::BIT_NOT:
335          return factory()->NewNumberLiteral(~DoubleToInt32(value), pos,
336                                             has_dot);
337        default:
338          break;
339      }
340    }
341  }
342  // Desugar '+foo' => 'foo*1'
343  if (op == Token::ADD) {
344    return factory()->NewBinaryOperation(
345        Token::MUL, expression, factory()->NewNumberLiteral(1, pos, true), pos);
346  }
347  // The same idea for '-foo' => 'foo*(-1)'.
348  if (op == Token::SUB) {
349    return factory()->NewBinaryOperation(
350        Token::MUL, expression, factory()->NewNumberLiteral(-1, pos), pos);
351  }
352  // ...and one more time for '~foo' => 'foo^(~0)'.
353  if (op == Token::BIT_NOT) {
354    return factory()->NewBinaryOperation(
355        Token::BIT_XOR, expression, factory()->NewNumberLiteral(~0, pos), pos);
356  }
357  return factory()->NewUnaryOperation(op, expression, pos);
358}
359
360Expression* Parser::BuildIteratorResult(Expression* value, bool done) {
361  int pos = kNoSourcePosition;
362
363  if (value == nullptr) value = factory()->NewUndefinedLiteral(pos);
364
365  auto args = new (zone()) ZoneList<Expression*>(2, zone());
366  args->Add(value, zone());
367  args->Add(factory()->NewBooleanLiteral(done, pos), zone());
368
369  return factory()->NewCallRuntime(Runtime::kInlineCreateIterResultObject, args,
370                                   pos);
371}
372
373Expression* Parser::NewThrowError(Runtime::FunctionId id,
374                                  MessageTemplate::Template message,
375                                  const AstRawString* arg, int pos) {
376  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
377  args->Add(factory()->NewSmiLiteral(message, pos), zone());
378  args->Add(factory()->NewStringLiteral(arg, pos), zone());
379  CallRuntime* call_constructor = factory()->NewCallRuntime(id, args, pos);
380  return factory()->NewThrow(call_constructor, pos);
381}
382
383Expression* Parser::NewSuperPropertyReference(int pos) {
384  // this_function[home_object_symbol]
385  VariableProxy* this_function_proxy =
386      NewUnresolved(ast_value_factory()->this_function_string(), pos);
387  Expression* home_object_symbol_literal = factory()->NewSymbolLiteral(
388      AstSymbol::kHomeObjectSymbol, kNoSourcePosition);
389  Expression* home_object = factory()->NewProperty(
390      this_function_proxy, home_object_symbol_literal, pos);
391  return factory()->NewSuperPropertyReference(
392      ThisExpression(pos)->AsVariableProxy(), home_object, pos);
393}
394
395Expression* Parser::NewSuperCallReference(int pos) {
396  VariableProxy* new_target_proxy =
397      NewUnresolved(ast_value_factory()->new_target_string(), pos);
398  VariableProxy* this_function_proxy =
399      NewUnresolved(ast_value_factory()->this_function_string(), pos);
400  return factory()->NewSuperCallReference(
401      ThisExpression(pos)->AsVariableProxy(), new_target_proxy,
402      this_function_proxy, pos);
403}
404
405Expression* Parser::NewTargetExpression(int pos) {
406  auto proxy = NewUnresolved(ast_value_factory()->new_target_string(), pos);
407  proxy->set_is_new_target();
408  return proxy;
409}
410
411Expression* Parser::FunctionSentExpression(int pos) {
412  // We desugar function.sent into %_GeneratorGetInputOrDebugPos(generator).
413  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone());
414  VariableProxy* generator =
415      factory()->NewVariableProxy(function_state_->generator_object_variable());
416  args->Add(generator, zone());
417  return factory()->NewCallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos,
418                                   args, pos);
419}
420
421Literal* Parser::ExpressionFromLiteral(Token::Value token, int pos) {
422  switch (token) {
423    case Token::NULL_LITERAL:
424      return factory()->NewNullLiteral(pos);
425    case Token::TRUE_LITERAL:
426      return factory()->NewBooleanLiteral(true, pos);
427    case Token::FALSE_LITERAL:
428      return factory()->NewBooleanLiteral(false, pos);
429    case Token::SMI: {
430      uint32_t value = scanner()->smi_value();
431      return factory()->NewSmiLiteral(value, pos);
432    }
433    case Token::NUMBER: {
434      bool has_dot = scanner()->ContainsDot();
435      double value = scanner()->DoubleValue();
436      return factory()->NewNumberLiteral(value, pos, has_dot);
437    }
438    default:
439      DCHECK(false);
440  }
441  return NULL;
442}
443
444void Parser::MarkTailPosition(Expression* expression) {
445  expression->MarkTail();
446}
447
448Expression* Parser::NewV8Intrinsic(const AstRawString* name,
449                                   ZoneList<Expression*>* args, int pos,
450                                   bool* ok) {
451  if (extension_ != nullptr) {
452    // The extension structures are only accessible while parsing the
453    // very first time, not when reparsing because of lazy compilation.
454    GetClosureScope()->ForceEagerCompilation();
455  }
456
457  DCHECK(name->is_one_byte());
458  const Runtime::Function* function =
459      Runtime::FunctionForName(name->raw_data(), name->length());
460
461  if (function != nullptr) {
462    // Check for possible name clash.
463    DCHECK_EQ(Context::kNotFound,
464              Context::IntrinsicIndexForName(name->raw_data(), name->length()));
465    // Check for built-in IS_VAR macro.
466    if (function->function_id == Runtime::kIS_VAR) {
467      DCHECK_EQ(Runtime::RUNTIME, function->intrinsic_type);
468      // %IS_VAR(x) evaluates to x if x is a variable,
469      // leads to a parse error otherwise.  Could be implemented as an
470      // inline function %_IS_VAR(x) to eliminate this special case.
471      if (args->length() == 1 && args->at(0)->AsVariableProxy() != nullptr) {
472        return args->at(0);
473      } else {
474        ReportMessage(MessageTemplate::kNotIsvar);
475        *ok = false;
476        return nullptr;
477      }
478    }
479
480    // Check that the expected number of arguments are being passed.
481    if (function->nargs != -1 && function->nargs != args->length()) {
482      ReportMessage(MessageTemplate::kRuntimeWrongNumArgs);
483      *ok = false;
484      return nullptr;
485    }
486
487    return factory()->NewCallRuntime(function, args, pos);
488  }
489
490  int context_index =
491      Context::IntrinsicIndexForName(name->raw_data(), name->length());
492
493  // Check that the function is defined.
494  if (context_index == Context::kNotFound) {
495    ReportMessage(MessageTemplate::kNotDefined, name);
496    *ok = false;
497    return nullptr;
498  }
499
500  return factory()->NewCallRuntime(context_index, args, pos);
501}
502
503Parser::Parser(ParseInfo* info)
504    : ParserBase<Parser>(info->zone(), &scanner_, info->stack_limit(),
505                         info->extension(), info->ast_value_factory(),
506                         info->isolate()->counters()->runtime_call_stats(),
507                         true),
508      scanner_(info->unicode_cache()),
509      reusable_preparser_(nullptr),
510      original_scope_(nullptr),
511      mode_(PARSE_EAGERLY),  // Lazy mode must be set explicitly.
512      target_stack_(nullptr),
513      compile_options_(info->compile_options()),
514      cached_parse_data_(nullptr),
515      total_preparse_skipped_(0),
516      temp_zoned_(false),
517      log_(nullptr),
518      preparsed_scope_data_(info->preparsed_scope_data()),
519      parameters_end_pos_(info->parameters_end_pos()) {
520  // Even though we were passed ParseInfo, we should not store it in
521  // Parser - this makes sure that Isolate is not accidentally accessed via
522  // ParseInfo during background parsing.
523  DCHECK(!info->script().is_null() || info->source_stream() != nullptr ||
524         info->character_stream() != nullptr);
525  // Determine if functions can be lazily compiled. This is necessary to
526  // allow some of our builtin JS files to be lazily compiled. These
527  // builtins cannot be handled lazily by the parser, since we have to know
528  // if a function uses the special natives syntax, which is something the
529  // parser records.
530  // If the debugger requests compilation for break points, we cannot be
531  // aggressive about lazy compilation, because it might trigger compilation
532  // of functions without an outer context when setting a breakpoint through
533  // Debug::FindSharedFunctionInfoInScript
534  bool can_compile_lazily = FLAG_lazy && !info->is_debug();
535
536  // Consider compiling eagerly when targeting the code cache.
537  can_compile_lazily &= !(FLAG_serialize_eager && info->will_serialize());
538
539  set_default_eager_compile_hint(can_compile_lazily
540                                     ? FunctionLiteral::kShouldLazyCompile
541                                     : FunctionLiteral::kShouldEagerCompile);
542  allow_lazy_ = FLAG_lazy && info->allow_lazy_parsing() && !info->is_native() &&
543                info->extension() == nullptr && can_compile_lazily;
544  set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
545  set_allow_tailcalls(FLAG_harmony_tailcalls && !info->is_native() &&
546                      info->isolate()->is_tail_call_elimination_enabled());
547  set_allow_harmony_do_expressions(FLAG_harmony_do_expressions);
548  set_allow_harmony_function_sent(FLAG_harmony_function_sent);
549  set_allow_harmony_restrictive_generators(FLAG_harmony_restrictive_generators);
550  set_allow_harmony_trailing_commas(FLAG_harmony_trailing_commas);
551  set_allow_harmony_class_fields(FLAG_harmony_class_fields);
552  set_allow_harmony_object_rest_spread(FLAG_harmony_object_rest_spread);
553  set_allow_harmony_dynamic_import(FLAG_harmony_dynamic_import);
554  set_allow_harmony_async_iteration(FLAG_harmony_async_iteration);
555  set_allow_harmony_template_escapes(FLAG_harmony_template_escapes);
556  for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
557       ++feature) {
558    use_counts_[feature] = 0;
559  }
560  if (info->ast_value_factory() == NULL) {
561    // info takes ownership of AstValueFactory.
562    info->set_ast_value_factory(new AstValueFactory(
563        zone(), info->isolate()->ast_string_constants(), info->hash_seed()));
564    info->set_ast_value_factory_owned();
565    ast_value_factory_ = info->ast_value_factory();
566    ast_node_factory_.set_ast_value_factory(ast_value_factory_);
567  }
568}
569
570void Parser::DeserializeScopeChain(
571    ParseInfo* info, MaybeHandle<ScopeInfo> maybe_outer_scope_info) {
572  DCHECK(ThreadId::Current().Equals(info->isolate()->thread_id()));
573  // TODO(wingo): Add an outer SCRIPT_SCOPE corresponding to the native
574  // context, which will have the "this" binding for script scopes.
575  DeclarationScope* script_scope = NewScriptScope();
576  info->set_script_scope(script_scope);
577  Scope* scope = script_scope;
578  Handle<ScopeInfo> outer_scope_info;
579  if (maybe_outer_scope_info.ToHandle(&outer_scope_info)) {
580    scope = Scope::DeserializeScopeChain(
581        info->isolate(), zone(), *outer_scope_info, script_scope,
582        ast_value_factory(), Scope::DeserializationMode::kScopesOnly);
583    DCHECK(!info->is_module() || scope->is_module_scope());
584  }
585  original_scope_ = scope;
586}
587
588FunctionLiteral* Parser::ParseProgram(Isolate* isolate, ParseInfo* info) {
589  // TODO(bmeurer): We temporarily need to pass allow_nesting = true here,
590  // see comment for HistogramTimerScope class.
591
592  // It's OK to use the Isolate & counters here, since this function is only
593  // called in the main thread.
594  DCHECK(parsing_on_main_thread_);
595  RuntimeCallTimerScope runtime_timer(
596      runtime_call_stats_, info->is_eval() ? &RuntimeCallStats::ParseEval
597                                           : &RuntimeCallStats::ParseProgram);
598  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.ParseProgram");
599  Handle<String> source(String::cast(info->script()->source()));
600  isolate->counters()->total_parse_size()->Increment(source->length());
601  base::ElapsedTimer timer;
602  if (FLAG_trace_parse) {
603    timer.Start();
604  }
605  fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
606
607  // Initialize parser state.
608  ParserLogger logger;
609
610  if (produce_cached_parse_data()) {
611    if (allow_lazy_) {
612      log_ = &logger;
613    } else {
614      compile_options_ = ScriptCompiler::kNoCompileOptions;
615    }
616  } else if (consume_cached_parse_data()) {
617    cached_parse_data_->Initialize();
618  }
619
620  DeserializeScopeChain(info, info->maybe_outer_scope_info());
621
622  source = String::Flatten(source);
623  FunctionLiteral* result;
624
625  {
626    std::unique_ptr<Utf16CharacterStream> stream(ScannerStream::For(source));
627    scanner_.Initialize(stream.get());
628    result = DoParseProgram(info);
629  }
630  if (result != NULL) {
631    DCHECK_EQ(scanner_.peek_location().beg_pos, source->length());
632  }
633  HandleSourceURLComments(isolate, info->script());
634
635  if (FLAG_trace_parse && result != nullptr) {
636    double ms = timer.Elapsed().InMillisecondsF();
637    if (info->is_eval()) {
638      PrintF("[parsing eval");
639    } else if (info->script()->name()->IsString()) {
640      String* name = String::cast(info->script()->name());
641      std::unique_ptr<char[]> name_chars = name->ToCString();
642      PrintF("[parsing script: %s", name_chars.get());
643    } else {
644      PrintF("[parsing script");
645    }
646    PrintF(" - took %0.3f ms]\n", ms);
647  }
648  if (produce_cached_parse_data() && result != nullptr) {
649    *info->cached_data() = logger.GetScriptData();
650  }
651  log_ = nullptr;
652  return result;
653}
654
655
656FunctionLiteral* Parser::DoParseProgram(ParseInfo* info) {
657  // Note that this function can be called from the main thread or from a
658  // background thread. We should not access anything Isolate / heap dependent
659  // via ParseInfo, and also not pass it forward.
660  DCHECK_NULL(scope_);
661  DCHECK_NULL(target_stack_);
662
663  ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY);
664  ResetFunctionLiteralId();
665  DCHECK(info->function_literal_id() == FunctionLiteral::kIdTypeTopLevel ||
666         info->function_literal_id() == FunctionLiteral::kIdTypeInvalid);
667
668  FunctionLiteral* result = NULL;
669  {
670    Scope* outer = original_scope_;
671    DCHECK_NOT_NULL(outer);
672    parsing_module_ = info->is_module();
673    if (info->is_eval()) {
674      outer = NewEvalScope(outer);
675    } else if (parsing_module_) {
676      DCHECK_EQ(outer, info->script_scope());
677      outer = NewModuleScope(info->script_scope());
678    }
679
680    DeclarationScope* scope = outer->AsDeclarationScope();
681
682    scope->set_start_position(0);
683
684    FunctionState function_state(&function_state_, &scope_, scope);
685
686    ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
687    bool ok = true;
688    int beg_pos = scanner()->location().beg_pos;
689    if (parsing_module_) {
690      // Declare the special module parameter.
691      auto name = ast_value_factory()->empty_string();
692      bool is_duplicate;
693      bool is_rest = false;
694      bool is_optional = false;
695      auto var = scope->DeclareParameter(name, VAR, is_optional, is_rest,
696                                         &is_duplicate, ast_value_factory());
697      DCHECK(!is_duplicate);
698      var->AllocateTo(VariableLocation::PARAMETER, 0);
699
700      PrepareGeneratorVariables();
701      Expression* initial_yield =
702          BuildInitialYield(kNoSourcePosition, kGeneratorFunction);
703      body->Add(
704          factory()->NewExpressionStatement(initial_yield, kNoSourcePosition),
705          zone());
706
707      ParseModuleItemList(body, &ok);
708      ok = ok &&
709           module()->Validate(this->scope()->AsModuleScope(),
710                              &pending_error_handler_, zone());
711    } else {
712      // Don't count the mode in the use counters--give the program a chance
713      // to enable script-wide strict mode below.
714      this->scope()->SetLanguageMode(info->language_mode());
715      ParseStatementList(body, Token::EOS, &ok);
716    }
717
718    // The parser will peek but not consume EOS.  Our scope logically goes all
719    // the way to the EOS, though.
720    scope->set_end_position(scanner()->peek_location().beg_pos);
721
722    if (ok && is_strict(language_mode())) {
723      CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok);
724    }
725    if (ok && is_sloppy(language_mode())) {
726      // TODO(littledan): Function bindings on the global object that modify
727      // pre-existing bindings should be made writable, enumerable and
728      // nonconfigurable if possible, whereas this code will leave attributes
729      // unchanged if the property already exists.
730      InsertSloppyBlockFunctionVarBindings(scope);
731    }
732    if (ok) {
733      CheckConflictingVarDeclarations(scope, &ok);
734    }
735
736    if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) {
737      if (body->length() != 1 ||
738          !body->at(0)->IsExpressionStatement() ||
739          !body->at(0)->AsExpressionStatement()->
740              expression()->IsFunctionLiteral()) {
741        ReportMessage(MessageTemplate::kSingleFunctionLiteral);
742        ok = false;
743      }
744    }
745
746    if (ok) {
747      RewriteDestructuringAssignments();
748      int parameter_count = parsing_module_ ? 1 : 0;
749      result = factory()->NewScriptOrEvalFunctionLiteral(
750          scope, body, function_state.expected_property_count(),
751          parameter_count);
752    }
753  }
754
755  info->set_max_function_literal_id(GetLastFunctionLiteralId());
756
757  // Make sure the target stack is empty.
758  DCHECK(target_stack_ == NULL);
759
760  return result;
761}
762
763FunctionLiteral* Parser::ParseFunction(Isolate* isolate, ParseInfo* info) {
764  // It's OK to use the Isolate & counters here, since this function is only
765  // called in the main thread.
766  DCHECK(parsing_on_main_thread_);
767  RuntimeCallTimerScope runtime_timer(runtime_call_stats_,
768                                      &RuntimeCallStats::ParseFunction);
769  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.ParseFunction");
770  Handle<String> source(String::cast(info->script()->source()));
771  isolate->counters()->total_parse_size()->Increment(source->length());
772  base::ElapsedTimer timer;
773  if (FLAG_trace_parse) {
774    timer.Start();
775  }
776  Handle<SharedFunctionInfo> shared_info = info->shared_info();
777  DeserializeScopeChain(info, info->maybe_outer_scope_info());
778  if (info->asm_function_scope()) {
779    original_scope_ = info->asm_function_scope();
780    factory()->set_zone(info->zone());
781  } else {
782    DCHECK_EQ(factory()->zone(), info->zone());
783  }
784
785  // Initialize parser state.
786  source = String::Flatten(source);
787  FunctionLiteral* result;
788  {
789    std::unique_ptr<Utf16CharacterStream> stream(ScannerStream::For(
790        source, shared_info->start_position(), shared_info->end_position()));
791    Handle<String> name(String::cast(shared_info->name()));
792    result = DoParseFunction(info, ast_value_factory()->GetString(name),
793                             stream.get());
794    if (result != nullptr) {
795      Handle<String> inferred_name(shared_info->inferred_name());
796      result->set_inferred_name(inferred_name);
797    }
798  }
799
800  if (FLAG_trace_parse && result != NULL) {
801    double ms = timer.Elapsed().InMillisecondsF();
802    // We need to make sure that the debug-name is available.
803    ast_value_factory()->Internalize(isolate);
804    std::unique_ptr<char[]> name_chars = result->debug_name()->ToCString();
805    PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms);
806  }
807  return result;
808}
809
810static FunctionLiteral::FunctionType ComputeFunctionType(ParseInfo* info) {
811  if (info->is_declaration()) {
812    return FunctionLiteral::kDeclaration;
813  } else if (info->is_named_expression()) {
814    return FunctionLiteral::kNamedExpression;
815  } else if (IsConciseMethod(info->function_kind()) ||
816             IsAccessorFunction(info->function_kind())) {
817    return FunctionLiteral::kAccessorOrMethod;
818  }
819  return FunctionLiteral::kAnonymousExpression;
820}
821
822FunctionLiteral* Parser::DoParseFunction(ParseInfo* info,
823                                         const AstRawString* raw_name,
824                                         Utf16CharacterStream* source) {
825  scanner_.Initialize(source);
826  DCHECK_NULL(scope_);
827  DCHECK_NULL(target_stack_);
828
829  DCHECK(ast_value_factory());
830  fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
831  fni_->PushEnclosingName(raw_name);
832
833  ResetFunctionLiteralId();
834  DCHECK_LT(0, info->function_literal_id());
835  SkipFunctionLiterals(info->function_literal_id() - 1);
836
837  ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
838
839  // Place holder for the result.
840  FunctionLiteral* result = nullptr;
841
842  {
843    // Parse the function literal.
844    Scope* outer = original_scope_;
845    DeclarationScope* outer_function = outer->GetClosureScope();
846    DCHECK(outer);
847    FunctionState function_state(&function_state_, &scope_, outer_function);
848    BlockState block_state(&scope_, outer);
849    DCHECK(is_sloppy(outer->language_mode()) ||
850           is_strict(info->language_mode()));
851    FunctionLiteral::FunctionType function_type = ComputeFunctionType(info);
852    FunctionKind kind = info->function_kind();
853    bool ok = true;
854
855    if (IsArrowFunction(kind)) {
856      if (IsAsyncFunction(kind)) {
857        DCHECK(!scanner()->HasAnyLineTerminatorAfterNext());
858        if (!Check(Token::ASYNC)) {
859          CHECK(stack_overflow());
860          return nullptr;
861        }
862        if (!(peek_any_identifier() || peek() == Token::LPAREN)) {
863          CHECK(stack_overflow());
864          return nullptr;
865        }
866      }
867
868      // TODO(adamk): We should construct this scope from the ScopeInfo.
869      DeclarationScope* scope = NewFunctionScope(kind);
870
871      // These two bits only need to be explicitly set because we're
872      // not passing the ScopeInfo to the Scope constructor.
873      // TODO(adamk): Remove these calls once the above NewScope call
874      // passes the ScopeInfo.
875      if (info->calls_eval()) {
876        scope->RecordEvalCall();
877      }
878      SetLanguageMode(scope, info->language_mode());
879
880      scope->set_start_position(info->start_position());
881      ExpressionClassifier formals_classifier(this);
882      ParserFormalParameters formals(scope);
883      int rewritable_length =
884          function_state.destructuring_assignments_to_rewrite().length();
885      Checkpoint checkpoint(this);
886      {
887        // Parsing patterns as variable reference expression creates
888        // NewUnresolved references in current scope. Entrer arrow function
889        // scope for formal parameter parsing.
890        BlockState block_state(&scope_, scope);
891        if (Check(Token::LPAREN)) {
892          // '(' StrictFormalParameters ')'
893          ParseFormalParameterList(&formals, &ok);
894          if (ok) ok = Check(Token::RPAREN);
895        } else {
896          // BindingIdentifier
897          ParseFormalParameter(&formals, &ok);
898          if (ok) DeclareFormalParameters(formals.scope, formals.params);
899        }
900      }
901
902      if (ok) {
903        checkpoint.Restore(&formals.materialized_literals_count);
904        if (GetLastFunctionLiteralId() != info->function_literal_id() - 1) {
905          // If there were FunctionLiterals in the parameters, we need to
906          // renumber them to shift down so the next function literal id for
907          // the arrow function is the one requested.
908          AstFunctionLiteralIdReindexer reindexer(
909              stack_limit_,
910              (info->function_literal_id() - 1) - GetLastFunctionLiteralId());
911          for (auto p : formals.params) {
912            if (p->pattern != nullptr) reindexer.Reindex(p->pattern);
913            if (p->initializer != nullptr) reindexer.Reindex(p->initializer);
914          }
915          ResetFunctionLiteralId();
916          SkipFunctionLiterals(info->function_literal_id() - 1);
917        }
918
919        // Pass `accept_IN=true` to ParseArrowFunctionLiteral --- This should
920        // not be observable, or else the preparser would have failed.
921        Expression* expression =
922            ParseArrowFunctionLiteral(true, formals, rewritable_length, &ok);
923        if (ok) {
924          // Scanning must end at the same position that was recorded
925          // previously. If not, parsing has been interrupted due to a stack
926          // overflow, at which point the partially parsed arrow function
927          // concise body happens to be a valid expression. This is a problem
928          // only for arrow functions with single expression bodies, since there
929          // is no end token such as "}" for normal functions.
930          if (scanner()->location().end_pos == info->end_position()) {
931            // The pre-parser saw an arrow function here, so the full parser
932            // must produce a FunctionLiteral.
933            DCHECK(expression->IsFunctionLiteral());
934            result = expression->AsFunctionLiteral();
935            // Rewrite destructuring assignments in the parameters. (The ones
936            // inside the function body are rewritten by
937            // ParseArrowFunctionLiteral.)
938            RewriteDestructuringAssignments();
939          } else {
940            ok = false;
941          }
942        }
943      }
944    } else if (IsDefaultConstructor(kind)) {
945      DCHECK_EQ(scope(), outer);
946      result = DefaultConstructor(raw_name, IsDerivedConstructor(kind),
947                                  info->start_position(), info->end_position());
948    } else {
949      result = ParseFunctionLiteral(
950          raw_name, Scanner::Location::invalid(), kSkipFunctionNameCheck, kind,
951          kNoSourcePosition, function_type, info->language_mode(), &ok);
952    }
953    // Make sure the results agree.
954    DCHECK(ok == (result != nullptr));
955  }
956
957  // Make sure the target stack is empty.
958  DCHECK_NULL(target_stack_);
959  DCHECK_IMPLIES(result,
960                 info->function_literal_id() == result->function_literal_id());
961  return result;
962}
963
964Statement* Parser::ParseModuleItem(bool* ok) {
965  // ecma262/#prod-ModuleItem
966  // ModuleItem :
967  //    ImportDeclaration
968  //    ExportDeclaration
969  //    StatementListItem
970
971  Token::Value next = peek();
972
973  if (next == Token::EXPORT) {
974    return ParseExportDeclaration(ok);
975  }
976
977  // We must be careful not to parse a dynamic import expression as an import
978  // declaration.
979  if (next == Token::IMPORT &&
980      (!allow_harmony_dynamic_import() || PeekAhead() != Token::LPAREN)) {
981    ParseImportDeclaration(CHECK_OK);
982    return factory()->NewEmptyStatement(kNoSourcePosition);
983  }
984
985  return ParseStatementListItem(ok);
986}
987
988
989void Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) {
990  // ecma262/#prod-Module
991  // Module :
992  //    ModuleBody?
993  //
994  // ecma262/#prod-ModuleItemList
995  // ModuleBody :
996  //    ModuleItem*
997
998  DCHECK(scope()->is_module_scope());
999  while (peek() != Token::EOS) {
1000    Statement* stat = ParseModuleItem(CHECK_OK_VOID);
1001    if (stat && !stat->IsEmpty()) {
1002      body->Add(stat, zone());
1003    }
1004  }
1005}
1006
1007
1008const AstRawString* Parser::ParseModuleSpecifier(bool* ok) {
1009  // ModuleSpecifier :
1010  //    StringLiteral
1011
1012  Expect(Token::STRING, CHECK_OK);
1013  return GetSymbol();
1014}
1015
1016
1017void Parser::ParseExportClause(ZoneList<const AstRawString*>* export_names,
1018                               ZoneList<Scanner::Location>* export_locations,
1019                               ZoneList<const AstRawString*>* local_names,
1020                               Scanner::Location* reserved_loc, bool* ok) {
1021  // ExportClause :
1022  //   '{' '}'
1023  //   '{' ExportsList '}'
1024  //   '{' ExportsList ',' '}'
1025  //
1026  // ExportsList :
1027  //   ExportSpecifier
1028  //   ExportsList ',' ExportSpecifier
1029  //
1030  // ExportSpecifier :
1031  //   IdentifierName
1032  //   IdentifierName 'as' IdentifierName
1033
1034  Expect(Token::LBRACE, CHECK_OK_VOID);
1035
1036  Token::Value name_tok;
1037  while ((name_tok = peek()) != Token::RBRACE) {
1038    // Keep track of the first reserved word encountered in case our
1039    // caller needs to report an error.
1040    if (!reserved_loc->IsValid() &&
1041        !Token::IsIdentifier(name_tok, STRICT, false, parsing_module_)) {
1042      *reserved_loc = scanner()->location();
1043    }
1044    const AstRawString* local_name = ParseIdentifierName(CHECK_OK_VOID);
1045    const AstRawString* export_name = NULL;
1046    Scanner::Location location = scanner()->location();
1047    if (CheckContextualKeyword(CStrVector("as"))) {
1048      export_name = ParseIdentifierName(CHECK_OK_VOID);
1049      // Set the location to the whole "a as b" string, so that it makes sense
1050      // both for errors due to "a" and for errors due to "b".
1051      location.end_pos = scanner()->location().end_pos;
1052    }
1053    if (export_name == NULL) {
1054      export_name = local_name;
1055    }
1056    export_names->Add(export_name, zone());
1057    local_names->Add(local_name, zone());
1058    export_locations->Add(location, zone());
1059    if (peek() == Token::RBRACE) break;
1060    Expect(Token::COMMA, CHECK_OK_VOID);
1061  }
1062
1063  Expect(Token::RBRACE, CHECK_OK_VOID);
1064}
1065
1066
1067ZoneList<const Parser::NamedImport*>* Parser::ParseNamedImports(
1068    int pos, bool* ok) {
1069  // NamedImports :
1070  //   '{' '}'
1071  //   '{' ImportsList '}'
1072  //   '{' ImportsList ',' '}'
1073  //
1074  // ImportsList :
1075  //   ImportSpecifier
1076  //   ImportsList ',' ImportSpecifier
1077  //
1078  // ImportSpecifier :
1079  //   BindingIdentifier
1080  //   IdentifierName 'as' BindingIdentifier
1081
1082  Expect(Token::LBRACE, CHECK_OK);
1083
1084  auto result = new (zone()) ZoneList<const NamedImport*>(1, zone());
1085  while (peek() != Token::RBRACE) {
1086    const AstRawString* import_name = ParseIdentifierName(CHECK_OK);
1087    const AstRawString* local_name = import_name;
1088    Scanner::Location location = scanner()->location();
1089    // In the presence of 'as', the left-side of the 'as' can
1090    // be any IdentifierName. But without 'as', it must be a valid
1091    // BindingIdentifier.
1092    if (CheckContextualKeyword(CStrVector("as"))) {
1093      local_name = ParseIdentifierName(CHECK_OK);
1094    }
1095    if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false,
1096                             parsing_module_)) {
1097      *ok = false;
1098      ReportMessage(MessageTemplate::kUnexpectedReserved);
1099      return nullptr;
1100    } else if (IsEvalOrArguments(local_name)) {
1101      *ok = false;
1102      ReportMessage(MessageTemplate::kStrictEvalArguments);
1103      return nullptr;
1104    }
1105
1106    DeclareVariable(local_name, CONST, kNeedsInitialization, position(),
1107                    CHECK_OK);
1108
1109    NamedImport* import =
1110        new (zone()) NamedImport(import_name, local_name, location);
1111    result->Add(import, zone());
1112
1113    if (peek() == Token::RBRACE) break;
1114    Expect(Token::COMMA, CHECK_OK);
1115  }
1116
1117  Expect(Token::RBRACE, CHECK_OK);
1118  return result;
1119}
1120
1121
1122void Parser::ParseImportDeclaration(bool* ok) {
1123  // ImportDeclaration :
1124  //   'import' ImportClause 'from' ModuleSpecifier ';'
1125  //   'import' ModuleSpecifier ';'
1126  //
1127  // ImportClause :
1128  //   ImportedDefaultBinding
1129  //   NameSpaceImport
1130  //   NamedImports
1131  //   ImportedDefaultBinding ',' NameSpaceImport
1132  //   ImportedDefaultBinding ',' NamedImports
1133  //
1134  // NameSpaceImport :
1135  //   '*' 'as' ImportedBinding
1136
1137  int pos = peek_position();
1138  Expect(Token::IMPORT, CHECK_OK_VOID);
1139
1140  Token::Value tok = peek();
1141
1142  // 'import' ModuleSpecifier ';'
1143  if (tok == Token::STRING) {
1144    const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK_VOID);
1145    ExpectSemicolon(CHECK_OK_VOID);
1146    module()->AddEmptyImport(module_specifier);
1147    return;
1148  }
1149
1150  // Parse ImportedDefaultBinding if present.
1151  const AstRawString* import_default_binding = nullptr;
1152  Scanner::Location import_default_binding_loc;
1153  if (tok != Token::MUL && tok != Token::LBRACE) {
1154    import_default_binding =
1155        ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK_VOID);
1156    import_default_binding_loc = scanner()->location();
1157    DeclareVariable(import_default_binding, CONST, kNeedsInitialization, pos,
1158                    CHECK_OK_VOID);
1159  }
1160
1161  // Parse NameSpaceImport or NamedImports if present.
1162  const AstRawString* module_namespace_binding = nullptr;
1163  Scanner::Location module_namespace_binding_loc;
1164  const ZoneList<const NamedImport*>* named_imports = nullptr;
1165  if (import_default_binding == nullptr || Check(Token::COMMA)) {
1166    switch (peek()) {
1167      case Token::MUL: {
1168        Consume(Token::MUL);
1169        ExpectContextualKeyword(CStrVector("as"), CHECK_OK_VOID);
1170        module_namespace_binding =
1171            ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK_VOID);
1172        module_namespace_binding_loc = scanner()->location();
1173        DeclareVariable(module_namespace_binding, CONST, kCreatedInitialized,
1174                        pos, CHECK_OK_VOID);
1175        break;
1176      }
1177
1178      case Token::LBRACE:
1179        named_imports = ParseNamedImports(pos, CHECK_OK_VOID);
1180        break;
1181
1182      default:
1183        *ok = false;
1184        ReportUnexpectedToken(scanner()->current_token());
1185        return;
1186    }
1187  }
1188
1189  ExpectContextualKeyword(CStrVector("from"), CHECK_OK_VOID);
1190  const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK_VOID);
1191  ExpectSemicolon(CHECK_OK_VOID);
1192
1193  // Now that we have all the information, we can make the appropriate
1194  // declarations.
1195
1196  // TODO(neis): Would prefer to call DeclareVariable for each case below rather
1197  // than above and in ParseNamedImports, but then a possible error message
1198  // would point to the wrong location.  Maybe have a DeclareAt version of
1199  // Declare that takes a location?
1200
1201  if (module_namespace_binding != nullptr) {
1202    module()->AddStarImport(module_namespace_binding, module_specifier,
1203                            module_namespace_binding_loc, zone());
1204  }
1205
1206  if (import_default_binding != nullptr) {
1207    module()->AddImport(ast_value_factory()->default_string(),
1208                        import_default_binding, module_specifier,
1209                        import_default_binding_loc, zone());
1210  }
1211
1212  if (named_imports != nullptr) {
1213    if (named_imports->length() == 0) {
1214      module()->AddEmptyImport(module_specifier);
1215    } else {
1216      for (int i = 0; i < named_imports->length(); ++i) {
1217        const NamedImport* import = named_imports->at(i);
1218        module()->AddImport(import->import_name, import->local_name,
1219                            module_specifier, import->location, zone());
1220      }
1221    }
1222  }
1223}
1224
1225
1226Statement* Parser::ParseExportDefault(bool* ok) {
1227  //  Supports the following productions, starting after the 'default' token:
1228  //    'export' 'default' HoistableDeclaration
1229  //    'export' 'default' ClassDeclaration
1230  //    'export' 'default' AssignmentExpression[In] ';'
1231
1232  Expect(Token::DEFAULT, CHECK_OK);
1233  Scanner::Location default_loc = scanner()->location();
1234
1235  ZoneList<const AstRawString*> local_names(1, zone());
1236  Statement* result = nullptr;
1237  switch (peek()) {
1238    case Token::FUNCTION:
1239      result = ParseHoistableDeclaration(&local_names, true, CHECK_OK);
1240      break;
1241
1242    case Token::CLASS:
1243      Consume(Token::CLASS);
1244      result = ParseClassDeclaration(&local_names, true, CHECK_OK);
1245      break;
1246
1247    case Token::ASYNC:
1248      if (PeekAhead() == Token::FUNCTION &&
1249          !scanner()->HasAnyLineTerminatorAfterNext()) {
1250        Consume(Token::ASYNC);
1251        result = ParseAsyncFunctionDeclaration(&local_names, true, CHECK_OK);
1252        break;
1253      }
1254    /* falls through */
1255
1256    default: {
1257      int pos = position();
1258      ExpressionClassifier classifier(this);
1259      Expression* value = ParseAssignmentExpression(true, CHECK_OK);
1260      RewriteNonPattern(CHECK_OK);
1261      SetFunctionName(value, ast_value_factory()->default_string());
1262
1263      const AstRawString* local_name =
1264          ast_value_factory()->star_default_star_string();
1265      local_names.Add(local_name, zone());
1266
1267      // It's fine to declare this as CONST because the user has no way of
1268      // writing to it.
1269      Declaration* decl = DeclareVariable(local_name, CONST, pos, CHECK_OK);
1270      decl->proxy()->var()->set_initializer_position(position());
1271
1272      Assignment* assignment = factory()->NewAssignment(
1273          Token::INIT, decl->proxy(), value, kNoSourcePosition);
1274      result = factory()->NewExpressionStatement(assignment, kNoSourcePosition);
1275
1276      ExpectSemicolon(CHECK_OK);
1277      break;
1278    }
1279  }
1280
1281  DCHECK_EQ(local_names.length(), 1);
1282  module()->AddExport(local_names.first(),
1283                      ast_value_factory()->default_string(), default_loc,
1284                      zone());
1285
1286  DCHECK_NOT_NULL(result);
1287  return result;
1288}
1289
1290Statement* Parser::ParseExportDeclaration(bool* ok) {
1291  // ExportDeclaration:
1292  //    'export' '*' 'from' ModuleSpecifier ';'
1293  //    'export' ExportClause ('from' ModuleSpecifier)? ';'
1294  //    'export' VariableStatement
1295  //    'export' Declaration
1296  //    'export' 'default' ... (handled in ParseExportDefault)
1297
1298  Expect(Token::EXPORT, CHECK_OK);
1299  int pos = position();
1300
1301  Statement* result = nullptr;
1302  ZoneList<const AstRawString*> names(1, zone());
1303  Scanner::Location loc = scanner()->peek_location();
1304  switch (peek()) {
1305    case Token::DEFAULT:
1306      return ParseExportDefault(ok);
1307
1308    case Token::MUL: {
1309      Consume(Token::MUL);
1310      loc = scanner()->location();
1311      ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
1312      const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK);
1313      ExpectSemicolon(CHECK_OK);
1314      module()->AddStarExport(module_specifier, loc, zone());
1315      return factory()->NewEmptyStatement(pos);
1316    }
1317
1318    case Token::LBRACE: {
1319      // There are two cases here:
1320      //
1321      // 'export' ExportClause ';'
1322      // and
1323      // 'export' ExportClause FromClause ';'
1324      //
1325      // In the first case, the exported identifiers in ExportClause must
1326      // not be reserved words, while in the latter they may be. We
1327      // pass in a location that gets filled with the first reserved word
1328      // encountered, and then throw a SyntaxError if we are in the
1329      // non-FromClause case.
1330      Scanner::Location reserved_loc = Scanner::Location::invalid();
1331      ZoneList<const AstRawString*> export_names(1, zone());
1332      ZoneList<Scanner::Location> export_locations(1, zone());
1333      ZoneList<const AstRawString*> original_names(1, zone());
1334      ParseExportClause(&export_names, &export_locations, &original_names,
1335                        &reserved_loc, CHECK_OK);
1336      const AstRawString* module_specifier = nullptr;
1337      if (CheckContextualKeyword(CStrVector("from"))) {
1338        module_specifier = ParseModuleSpecifier(CHECK_OK);
1339      } else if (reserved_loc.IsValid()) {
1340        // No FromClause, so reserved words are invalid in ExportClause.
1341        *ok = false;
1342        ReportMessageAt(reserved_loc, MessageTemplate::kUnexpectedReserved);
1343        return nullptr;
1344      }
1345      ExpectSemicolon(CHECK_OK);
1346      const int length = export_names.length();
1347      DCHECK_EQ(length, original_names.length());
1348      DCHECK_EQ(length, export_locations.length());
1349      if (module_specifier == nullptr) {
1350        for (int i = 0; i < length; ++i) {
1351          module()->AddExport(original_names[i], export_names[i],
1352                              export_locations[i], zone());
1353        }
1354      } else if (length == 0) {
1355        module()->AddEmptyImport(module_specifier);
1356      } else {
1357        for (int i = 0; i < length; ++i) {
1358          module()->AddExport(original_names[i], export_names[i],
1359                              module_specifier, export_locations[i], zone());
1360        }
1361      }
1362      return factory()->NewEmptyStatement(pos);
1363    }
1364
1365    case Token::FUNCTION:
1366      result = ParseHoistableDeclaration(&names, false, CHECK_OK);
1367      break;
1368
1369    case Token::CLASS:
1370      Consume(Token::CLASS);
1371      result = ParseClassDeclaration(&names, false, CHECK_OK);
1372      break;
1373
1374    case Token::VAR:
1375    case Token::LET:
1376    case Token::CONST:
1377      result = ParseVariableStatement(kStatementListItem, &names, CHECK_OK);
1378      break;
1379
1380    case Token::ASYNC:
1381      // TODO(neis): Why don't we have the same check here as in
1382      // ParseStatementListItem?
1383      Consume(Token::ASYNC);
1384      result = ParseAsyncFunctionDeclaration(&names, false, CHECK_OK);
1385      break;
1386
1387    default:
1388      *ok = false;
1389      ReportUnexpectedToken(scanner()->current_token());
1390      return nullptr;
1391  }
1392  loc.end_pos = scanner()->location().end_pos;
1393
1394  ModuleDescriptor* descriptor = module();
1395  for (int i = 0; i < names.length(); ++i) {
1396    descriptor->AddExport(names[i], names[i], loc, zone());
1397  }
1398
1399  DCHECK_NOT_NULL(result);
1400  return result;
1401}
1402
1403VariableProxy* Parser::NewUnresolved(const AstRawString* name, int begin_pos,
1404                                     VariableKind kind) {
1405  return scope()->NewUnresolved(factory(), name, begin_pos, kind);
1406}
1407
1408VariableProxy* Parser::NewUnresolved(const AstRawString* name) {
1409  return scope()->NewUnresolved(factory(), name, scanner()->location().beg_pos);
1410}
1411
1412Declaration* Parser::DeclareVariable(const AstRawString* name,
1413                                     VariableMode mode, int pos, bool* ok) {
1414  return DeclareVariable(name, mode, Variable::DefaultInitializationFlag(mode),
1415                         pos, ok);
1416}
1417
1418Declaration* Parser::DeclareVariable(const AstRawString* name,
1419                                     VariableMode mode, InitializationFlag init,
1420                                     int pos, bool* ok) {
1421  DCHECK_NOT_NULL(name);
1422  VariableProxy* proxy = factory()->NewVariableProxy(
1423      name, NORMAL_VARIABLE, scanner()->location().beg_pos);
1424  Declaration* declaration =
1425      factory()->NewVariableDeclaration(proxy, this->scope(), pos);
1426  Declare(declaration, DeclarationDescriptor::NORMAL, mode, init, ok, nullptr,
1427          scanner()->location().end_pos);
1428  if (!*ok) return nullptr;
1429  return declaration;
1430}
1431
1432Variable* Parser::Declare(Declaration* declaration,
1433                          DeclarationDescriptor::Kind declaration_kind,
1434                          VariableMode mode, InitializationFlag init, bool* ok,
1435                          Scope* scope, int var_end_pos) {
1436  if (scope == nullptr) {
1437    scope = this->scope();
1438  }
1439  bool sloppy_mode_block_scope_function_redefinition = false;
1440  Variable* variable = scope->DeclareVariable(
1441      declaration, mode, init, allow_harmony_restrictive_generators(),
1442      &sloppy_mode_block_scope_function_redefinition, ok);
1443  if (!*ok) {
1444    // If we only have the start position of a proxy, we can't highlight the
1445    // whole variable name.  Pretend its length is 1 so that we highlight at
1446    // least the first character.
1447    Scanner::Location loc(declaration->proxy()->position(),
1448                          var_end_pos != kNoSourcePosition
1449                              ? var_end_pos
1450                              : declaration->proxy()->position() + 1);
1451    if (declaration_kind == DeclarationDescriptor::NORMAL) {
1452      ReportMessageAt(loc, MessageTemplate::kVarRedeclaration,
1453                      declaration->proxy()->raw_name());
1454    } else {
1455      ReportMessageAt(loc, MessageTemplate::kParamDupe);
1456    }
1457    return nullptr;
1458  }
1459  if (sloppy_mode_block_scope_function_redefinition) {
1460    ++use_counts_[v8::Isolate::kSloppyModeBlockScopedFunctionRedefinition];
1461  }
1462  return variable;
1463}
1464
1465Block* Parser::BuildInitializationBlock(
1466    DeclarationParsingResult* parsing_result,
1467    ZoneList<const AstRawString*>* names, bool* ok) {
1468  Block* result = factory()->NewBlock(
1469      NULL, 1, true, parsing_result->descriptor.declaration_pos);
1470  for (auto declaration : parsing_result->declarations) {
1471    PatternRewriter::DeclareAndInitializeVariables(
1472        this, result, &(parsing_result->descriptor), &declaration, names,
1473        CHECK_OK);
1474  }
1475  return result;
1476}
1477
1478void Parser::DeclareAndInitializeVariables(
1479    Block* block, const DeclarationDescriptor* declaration_descriptor,
1480    const DeclarationParsingResult::Declaration* declaration,
1481    ZoneList<const AstRawString*>* names, bool* ok) {
1482  DCHECK_NOT_NULL(block);
1483  PatternRewriter::DeclareAndInitializeVariables(
1484      this, block, declaration_descriptor, declaration, names, ok);
1485}
1486
1487Statement* Parser::DeclareFunction(const AstRawString* variable_name,
1488                                   FunctionLiteral* function, VariableMode mode,
1489                                   int pos, bool is_sloppy_block_function,
1490                                   ZoneList<const AstRawString*>* names,
1491                                   bool* ok) {
1492  VariableProxy* proxy =
1493      factory()->NewVariableProxy(variable_name, NORMAL_VARIABLE);
1494
1495  Declaration* declaration =
1496      factory()->NewFunctionDeclaration(proxy, function, scope(), pos);
1497  Declare(declaration, DeclarationDescriptor::NORMAL, mode, kCreatedInitialized,
1498          CHECK_OK);
1499  if (names) names->Add(variable_name, zone());
1500  if (is_sloppy_block_function) {
1501    SloppyBlockFunctionStatement* statement =
1502        factory()->NewSloppyBlockFunctionStatement();
1503    GetDeclarationScope()->DeclareSloppyBlockFunction(variable_name, scope(),
1504                                                      statement);
1505    return statement;
1506  }
1507  return factory()->NewEmptyStatement(kNoSourcePosition);
1508}
1509
1510Statement* Parser::DeclareClass(const AstRawString* variable_name,
1511                                Expression* value,
1512                                ZoneList<const AstRawString*>* names,
1513                                int class_token_pos, int end_pos, bool* ok) {
1514  Declaration* decl =
1515      DeclareVariable(variable_name, LET, class_token_pos, CHECK_OK);
1516  decl->proxy()->var()->set_initializer_position(end_pos);
1517  Assignment* assignment = factory()->NewAssignment(Token::INIT, decl->proxy(),
1518                                                    value, class_token_pos);
1519  Statement* assignment_statement =
1520      factory()->NewExpressionStatement(assignment, kNoSourcePosition);
1521  if (names) names->Add(variable_name, zone());
1522  return assignment_statement;
1523}
1524
1525Statement* Parser::DeclareNative(const AstRawString* name, int pos, bool* ok) {
1526  // Make sure that the function containing the native declaration
1527  // isn't lazily compiled. The extension structures are only
1528  // accessible while parsing the first time not when reparsing
1529  // because of lazy compilation.
1530  GetClosureScope()->ForceEagerCompilation();
1531
1532  // TODO(1240846): It's weird that native function declarations are
1533  // introduced dynamically when we meet their declarations, whereas
1534  // other functions are set up when entering the surrounding scope.
1535  Declaration* decl = DeclareVariable(name, VAR, pos, CHECK_OK);
1536  NativeFunctionLiteral* lit =
1537      factory()->NewNativeFunctionLiteral(name, extension_, kNoSourcePosition);
1538  return factory()->NewExpressionStatement(
1539      factory()->NewAssignment(Token::INIT, decl->proxy(), lit,
1540                               kNoSourcePosition),
1541      pos);
1542}
1543
1544ZoneList<const AstRawString*>* Parser::DeclareLabel(
1545    ZoneList<const AstRawString*>* labels, VariableProxy* var, bool* ok) {
1546  DCHECK(IsIdentifier(var));
1547  const AstRawString* label = var->raw_name();
1548  // TODO(1240780): We don't check for redeclaration of labels
1549  // during preparsing since keeping track of the set of active
1550  // labels requires nontrivial changes to the way scopes are
1551  // structured.  However, these are probably changes we want to
1552  // make later anyway so we should go back and fix this then.
1553  if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) {
1554    ReportMessage(MessageTemplate::kLabelRedeclaration, label);
1555    *ok = false;
1556    return nullptr;
1557  }
1558  if (labels == nullptr) {
1559    labels = new (zone()) ZoneList<const AstRawString*>(1, zone());
1560  }
1561  labels->Add(label, zone());
1562  // Remove the "ghost" variable that turned out to be a label
1563  // from the top scope. This way, we don't try to resolve it
1564  // during the scope processing.
1565  scope()->RemoveUnresolved(var);
1566  return labels;
1567}
1568
1569bool Parser::ContainsLabel(ZoneList<const AstRawString*>* labels,
1570                           const AstRawString* label) {
1571  DCHECK_NOT_NULL(label);
1572  if (labels != nullptr) {
1573    for (int i = labels->length(); i-- > 0;) {
1574      if (labels->at(i) == label) return true;
1575    }
1576  }
1577  return false;
1578}
1579
1580Expression* Parser::RewriteReturn(Expression* return_value, int pos) {
1581  if (IsDerivedConstructor(function_state_->kind())) {
1582    // For subclass constructors we need to return this in case of undefined
1583    // return a Smi (transformed into an exception in the ConstructStub)
1584    // for a non object.
1585    //
1586    //   return expr;
1587    //
1588    // Is rewritten as:
1589    //
1590    //   return (temp = expr) === undefined ? this :
1591    //       %_IsJSReceiver(temp) ? temp : 1;
1592
1593    // temp = expr
1594    Variable* temp = NewTemporary(ast_value_factory()->empty_string());
1595    Assignment* assign = factory()->NewAssignment(
1596        Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos);
1597
1598    // %_IsJSReceiver(temp)
1599    ZoneList<Expression*>* is_spec_object_args =
1600        new (zone()) ZoneList<Expression*>(1, zone());
1601    is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone());
1602    Expression* is_spec_object_call = factory()->NewCallRuntime(
1603        Runtime::kInlineIsJSReceiver, is_spec_object_args, pos);
1604
1605    // %_IsJSReceiver(temp) ? temp : 1;
1606    Expression* is_object_conditional = factory()->NewConditional(
1607        is_spec_object_call, factory()->NewVariableProxy(temp),
1608        factory()->NewSmiLiteral(1, pos), pos);
1609
1610    // temp === undefined
1611    Expression* is_undefined = factory()->NewCompareOperation(
1612        Token::EQ_STRICT, assign,
1613        factory()->NewUndefinedLiteral(kNoSourcePosition), pos);
1614
1615    // is_undefined ? this : is_object_conditional
1616    return_value = factory()->NewConditional(is_undefined, ThisExpression(pos),
1617                                             is_object_conditional, pos);
1618  }
1619  if (is_generator()) {
1620    return_value = BuildIteratorResult(return_value, true);
1621  }
1622  return return_value;
1623}
1624
1625Expression* Parser::RewriteDoExpression(Block* body, int pos, bool* ok) {
1626  Variable* result = NewTemporary(ast_value_factory()->dot_result_string());
1627  DoExpression* expr = factory()->NewDoExpression(body, result, pos);
1628  if (!Rewriter::Rewrite(this, GetClosureScope(), expr, ast_value_factory())) {
1629    *ok = false;
1630    return nullptr;
1631  }
1632  return expr;
1633}
1634
1635Statement* Parser::RewriteSwitchStatement(Expression* tag,
1636                                          SwitchStatement* switch_statement,
1637                                          ZoneList<CaseClause*>* cases,
1638                                          Scope* scope) {
1639  // In order to get the CaseClauses to execute in their own lexical scope,
1640  // but without requiring downstream code to have special scope handling
1641  // code for switch statements, desugar into blocks as follows:
1642  // {  // To group the statements--harmless to evaluate Expression in scope
1643  //   .tag_variable = Expression;
1644  //   {  // To give CaseClauses a scope
1645  //     switch (.tag_variable) { CaseClause* }
1646  //   }
1647  // }
1648
1649  Block* switch_block = factory()->NewBlock(NULL, 2, false, kNoSourcePosition);
1650
1651  Variable* tag_variable =
1652      NewTemporary(ast_value_factory()->dot_switch_tag_string());
1653  Assignment* tag_assign = factory()->NewAssignment(
1654      Token::ASSIGN, factory()->NewVariableProxy(tag_variable), tag,
1655      tag->position());
1656  Statement* tag_statement =
1657      factory()->NewExpressionStatement(tag_assign, kNoSourcePosition);
1658  switch_block->statements()->Add(tag_statement, zone());
1659
1660  // make statement: undefined;
1661  // This is needed so the tag isn't returned as the value, in case the switch
1662  // statements don't have a value.
1663  switch_block->statements()->Add(
1664      factory()->NewExpressionStatement(
1665          factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition),
1666      zone());
1667
1668  Expression* tag_read = factory()->NewVariableProxy(tag_variable);
1669  switch_statement->Initialize(tag_read, cases);
1670  Block* cases_block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition);
1671  cases_block->statements()->Add(switch_statement, zone());
1672  cases_block->set_scope(scope);
1673  DCHECK_IMPLIES(scope != nullptr,
1674                 switch_statement->position() >= scope->start_position());
1675  DCHECK_IMPLIES(scope != nullptr,
1676                 switch_statement->position() < scope->end_position());
1677  switch_block->statements()->Add(cases_block, zone());
1678  return switch_block;
1679}
1680
1681void Parser::RewriteCatchPattern(CatchInfo* catch_info, bool* ok) {
1682  if (catch_info->name == nullptr) {
1683    DCHECK_NOT_NULL(catch_info->pattern);
1684    catch_info->name = ast_value_factory()->dot_catch_string();
1685  }
1686  catch_info->variable = catch_info->scope->DeclareLocal(catch_info->name, VAR);
1687  if (catch_info->pattern != nullptr) {
1688    DeclarationDescriptor descriptor;
1689    descriptor.declaration_kind = DeclarationDescriptor::NORMAL;
1690    descriptor.scope = scope();
1691    descriptor.mode = LET;
1692    descriptor.declaration_pos = catch_info->pattern->position();
1693    descriptor.initialization_pos = catch_info->pattern->position();
1694
1695    // Initializer position for variables declared by the pattern.
1696    const int initializer_position = position();
1697
1698    DeclarationParsingResult::Declaration decl(
1699        catch_info->pattern, initializer_position,
1700        factory()->NewVariableProxy(catch_info->variable));
1701
1702    catch_info->init_block =
1703        factory()->NewBlock(nullptr, 8, true, kNoSourcePosition);
1704    PatternRewriter::DeclareAndInitializeVariables(
1705        this, catch_info->init_block, &descriptor, &decl,
1706        &catch_info->bound_names, ok);
1707  } else {
1708    catch_info->bound_names.Add(catch_info->name, zone());
1709  }
1710}
1711
1712void Parser::ValidateCatchBlock(const CatchInfo& catch_info, bool* ok) {
1713  // Check for `catch(e) { let e; }` and similar errors.
1714  Scope* inner_block_scope = catch_info.inner_block->scope();
1715  if (inner_block_scope != nullptr) {
1716    Declaration* decl = inner_block_scope->CheckLexDeclarationsConflictingWith(
1717        catch_info.bound_names);
1718    if (decl != nullptr) {
1719      const AstRawString* name = decl->proxy()->raw_name();
1720      int position = decl->proxy()->position();
1721      Scanner::Location location =
1722          position == kNoSourcePosition
1723              ? Scanner::Location::invalid()
1724              : Scanner::Location(position, position + 1);
1725      ReportMessageAt(location, MessageTemplate::kVarRedeclaration, name);
1726      *ok = false;
1727    }
1728  }
1729}
1730
1731Statement* Parser::RewriteTryStatement(Block* try_block, Block* catch_block,
1732                                       Block* finally_block,
1733                                       const CatchInfo& catch_info, int pos) {
1734  // Simplify the AST nodes by converting:
1735  //   'try B0 catch B1 finally B2'
1736  // to:
1737  //   'try { try B0 catch B1 } finally B2'
1738
1739  if (catch_block != nullptr && finally_block != nullptr) {
1740    // If we have both, create an inner try/catch.
1741    DCHECK_NOT_NULL(catch_info.scope);
1742    DCHECK_NOT_NULL(catch_info.variable);
1743    TryCatchStatement* statement;
1744    statement = factory()->NewTryCatchStatement(try_block, catch_info.scope,
1745                                                catch_info.variable,
1746                                                catch_block, kNoSourcePosition);
1747
1748    try_block = factory()->NewBlock(nullptr, 1, false, kNoSourcePosition);
1749    try_block->statements()->Add(statement, zone());
1750    catch_block = nullptr;  // Clear to indicate it's been handled.
1751  }
1752
1753  if (catch_block != nullptr) {
1754    // For a try-catch construct append return expressions from the catch block
1755    // to the list of return expressions.
1756    function_state_->tail_call_expressions().Append(
1757        catch_info.tail_call_expressions);
1758
1759    DCHECK_NULL(finally_block);
1760    DCHECK_NOT_NULL(catch_info.scope);
1761    DCHECK_NOT_NULL(catch_info.variable);
1762    return factory()->NewTryCatchStatement(
1763        try_block, catch_info.scope, catch_info.variable, catch_block, pos);
1764  } else {
1765    DCHECK_NOT_NULL(finally_block);
1766    return factory()->NewTryFinallyStatement(try_block, finally_block, pos);
1767  }
1768}
1769
1770void Parser::ParseAndRewriteGeneratorFunctionBody(int pos, FunctionKind kind,
1771                                                  ZoneList<Statement*>* body,
1772                                                  bool* ok) {
1773  // We produce:
1774  //
1775  // try { InitialYield; ...body...; return {value: undefined, done: true} }
1776  // finally { %_GeneratorClose(generator) }
1777  //
1778  // - InitialYield yields the actual generator object.
1779  // - Any return statement inside the body will have its argument wrapped
1780  //   in a "done" iterator result object.
1781  // - If the generator terminates for whatever reason, we must close it.
1782  //   Hence the finally clause.
1783
1784  Block* try_block = factory()->NewBlock(nullptr, 3, false, kNoSourcePosition);
1785  Expression* initial_yield = BuildInitialYield(pos, kind);
1786  try_block->statements()->Add(
1787      factory()->NewExpressionStatement(initial_yield, kNoSourcePosition),
1788      zone());
1789  ParseStatementList(try_block->statements(), Token::RBRACE, ok);
1790  if (!*ok) return;
1791
1792  Statement* final_return = factory()->NewReturnStatement(
1793      BuildIteratorResult(nullptr, true), kNoSourcePosition);
1794  try_block->statements()->Add(final_return, zone());
1795
1796  Block* finally_block =
1797      factory()->NewBlock(nullptr, 1, false, kNoSourcePosition);
1798  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone());
1799  VariableProxy* call_proxy =
1800      factory()->NewVariableProxy(function_state_->generator_object_variable());
1801  args->Add(call_proxy, zone());
1802  Expression* call = factory()->NewCallRuntime(Runtime::kInlineGeneratorClose,
1803                                               args, kNoSourcePosition);
1804  finally_block->statements()->Add(
1805      factory()->NewExpressionStatement(call, kNoSourcePosition), zone());
1806
1807  body->Add(factory()->NewTryFinallyStatement(try_block, finally_block,
1808                                              kNoSourcePosition),
1809            zone());
1810}
1811
1812void Parser::CreateFunctionNameAssignment(
1813    const AstRawString* function_name, int pos,
1814    FunctionLiteral::FunctionType function_type,
1815    DeclarationScope* function_scope, ZoneList<Statement*>* result, int index) {
1816  if (function_type == FunctionLiteral::kNamedExpression) {
1817    StatementT statement = factory()->NewEmptyStatement(kNoSourcePosition);
1818    if (function_scope->LookupLocal(function_name) == nullptr) {
1819      // Now that we know the language mode, we can create the const assignment
1820      // in the previously reserved spot.
1821      DCHECK_EQ(function_scope, scope());
1822      Variable* fvar = function_scope->DeclareFunctionVar(function_name);
1823      VariableProxy* fproxy = factory()->NewVariableProxy(fvar);
1824      statement = factory()->NewExpressionStatement(
1825          factory()->NewAssignment(Token::INIT, fproxy,
1826                                   factory()->NewThisFunction(pos),
1827                                   kNoSourcePosition),
1828          kNoSourcePosition);
1829    }
1830    result->Set(index, statement);
1831  }
1832}
1833
1834// [if (IteratorType == kNormal)]
1835//     !%_IsJSReceiver(result = iterator.next()) &&
1836//         %ThrowIteratorResultNotAnObject(result)
1837// [else if (IteratorType == kAsync)]
1838//     !%_IsJSReceiver(result = Await(iterator.next())) &&
1839//         %ThrowIteratorResultNotAnObject(result)
1840// [endif]
1841Expression* Parser::BuildIteratorNextResult(Expression* iterator,
1842                                            Variable* result, IteratorType type,
1843                                            int pos) {
1844  Expression* next_literal = factory()->NewStringLiteral(
1845      ast_value_factory()->next_string(), kNoSourcePosition);
1846  Expression* next_property =
1847      factory()->NewProperty(iterator, next_literal, kNoSourcePosition);
1848  ZoneList<Expression*>* next_arguments =
1849      new (zone()) ZoneList<Expression*>(0, zone());
1850  Expression* next_call =
1851      factory()->NewCall(next_property, next_arguments, pos);
1852  if (type == IteratorType::kAsync) {
1853    next_call = RewriteAwaitExpression(next_call, pos);
1854  }
1855  Expression* result_proxy = factory()->NewVariableProxy(result);
1856  Expression* left =
1857      factory()->NewAssignment(Token::ASSIGN, result_proxy, next_call, pos);
1858
1859  // %_IsJSReceiver(...)
1860  ZoneList<Expression*>* is_spec_object_args =
1861      new (zone()) ZoneList<Expression*>(1, zone());
1862  is_spec_object_args->Add(left, zone());
1863  Expression* is_spec_object_call = factory()->NewCallRuntime(
1864      Runtime::kInlineIsJSReceiver, is_spec_object_args, pos);
1865
1866  // %ThrowIteratorResultNotAnObject(result)
1867  Expression* result_proxy_again = factory()->NewVariableProxy(result);
1868  ZoneList<Expression*>* throw_arguments =
1869      new (zone()) ZoneList<Expression*>(1, zone());
1870  throw_arguments->Add(result_proxy_again, zone());
1871  Expression* throw_call = factory()->NewCallRuntime(
1872      Runtime::kThrowIteratorResultNotAnObject, throw_arguments, pos);
1873
1874  return factory()->NewBinaryOperation(
1875      Token::AND,
1876      factory()->NewUnaryOperation(Token::NOT, is_spec_object_call, pos),
1877      throw_call, pos);
1878}
1879
1880Statement* Parser::InitializeForEachStatement(ForEachStatement* stmt,
1881                                              Expression* each,
1882                                              Expression* subject,
1883                                              Statement* body,
1884                                              int each_keyword_pos) {
1885  ForOfStatement* for_of = stmt->AsForOfStatement();
1886  if (for_of != NULL) {
1887    const bool finalize = true;
1888    return InitializeForOfStatement(for_of, each, subject, body, finalize,
1889                                    IteratorType::kNormal, each_keyword_pos);
1890  } else {
1891    if (each->IsArrayLiteral() || each->IsObjectLiteral()) {
1892      Variable* temp = NewTemporary(ast_value_factory()->empty_string());
1893      VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
1894      Expression* assign_each = PatternRewriter::RewriteDestructuringAssignment(
1895          this, factory()->NewAssignment(Token::ASSIGN, each, temp_proxy,
1896                                         kNoSourcePosition),
1897          scope());
1898      auto block = factory()->NewBlock(nullptr, 2, false, kNoSourcePosition);
1899      block->statements()->Add(
1900          factory()->NewExpressionStatement(assign_each, kNoSourcePosition),
1901          zone());
1902      block->statements()->Add(body, zone());
1903      body = block;
1904      each = factory()->NewVariableProxy(temp);
1905    }
1906    MarkExpressionAsAssigned(each);
1907    stmt->AsForInStatement()->Initialize(each, subject, body);
1908  }
1909  return stmt;
1910}
1911
1912// Special case for legacy for
1913//
1914//    for (var x = initializer in enumerable) body
1915//
1916// An initialization block of the form
1917//
1918//    {
1919//      x = initializer;
1920//    }
1921//
1922// is returned in this case.  It has reserved space for two statements,
1923// so that (later on during parsing), the equivalent of
1924//
1925//   for (x in enumerable) body
1926//
1927// is added as a second statement to it.
1928Block* Parser::RewriteForVarInLegacy(const ForInfo& for_info) {
1929  const DeclarationParsingResult::Declaration& decl =
1930      for_info.parsing_result.declarations[0];
1931  if (!IsLexicalVariableMode(for_info.parsing_result.descriptor.mode) &&
1932      decl.pattern->IsVariableProxy() && decl.initializer != nullptr) {
1933    ++use_counts_[v8::Isolate::kForInInitializer];
1934    const AstRawString* name = decl.pattern->AsVariableProxy()->raw_name();
1935    VariableProxy* single_var = NewUnresolved(name);
1936    Block* init_block = factory()->NewBlock(
1937        nullptr, 2, true, for_info.parsing_result.descriptor.declaration_pos);
1938    init_block->statements()->Add(
1939        factory()->NewExpressionStatement(
1940            factory()->NewAssignment(Token::ASSIGN, single_var,
1941                                     decl.initializer, kNoSourcePosition),
1942            kNoSourcePosition),
1943        zone());
1944    return init_block;
1945  }
1946  return nullptr;
1947}
1948
1949// Rewrite a for-in/of statement of the form
1950//
1951//   for (let/const/var x in/of e) b
1952//
1953// into
1954//
1955//   {
1956//     <let x' be a temporary variable>
1957//     for (x' in/of e) {
1958//       let/const/var x;
1959//       x = x';
1960//       b;
1961//     }
1962//     let x;  // for TDZ
1963//   }
1964void Parser::DesugarBindingInForEachStatement(ForInfo* for_info,
1965                                              Block** body_block,
1966                                              Expression** each_variable,
1967                                              bool* ok) {
1968  DCHECK(for_info->parsing_result.declarations.length() == 1);
1969  DeclarationParsingResult::Declaration& decl =
1970      for_info->parsing_result.declarations[0];
1971  Variable* temp = NewTemporary(ast_value_factory()->dot_for_string());
1972  auto each_initialization_block =
1973      factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
1974  {
1975    auto descriptor = for_info->parsing_result.descriptor;
1976    descriptor.declaration_pos = kNoSourcePosition;
1977    descriptor.initialization_pos = kNoSourcePosition;
1978    decl.initializer = factory()->NewVariableProxy(temp);
1979
1980    bool is_for_var_of =
1981        for_info->mode == ForEachStatement::ITERATE &&
1982        for_info->parsing_result.descriptor.mode == VariableMode::VAR;
1983    bool collect_names =
1984        IsLexicalVariableMode(for_info->parsing_result.descriptor.mode) ||
1985        is_for_var_of;
1986
1987    PatternRewriter::DeclareAndInitializeVariables(
1988        this, each_initialization_block, &descriptor, &decl,
1989        collect_names ? &for_info->bound_names : nullptr, CHECK_OK_VOID);
1990
1991    // Annex B.3.5 prohibits the form
1992    // `try {} catch(e) { for (var e of {}); }`
1993    // So if we are parsing a statement like `for (var ... of ...)`
1994    // we need to walk up the scope chain and look for catch scopes
1995    // which have a simple binding, then compare their binding against
1996    // all of the names declared in the init of the for-of we're
1997    // parsing.
1998    if (is_for_var_of) {
1999      Scope* catch_scope = scope();
2000      while (catch_scope != nullptr && !catch_scope->is_declaration_scope()) {
2001        if (catch_scope->is_catch_scope()) {
2002          auto name = catch_scope->catch_variable_name();
2003          // If it's a simple binding and the name is declared in the for loop.
2004          if (name != ast_value_factory()->dot_catch_string() &&
2005              for_info->bound_names.Contains(name)) {
2006            ReportMessageAt(for_info->parsing_result.bindings_loc,
2007                            MessageTemplate::kVarRedeclaration, name);
2008            *ok = false;
2009            return;
2010          }
2011        }
2012        catch_scope = catch_scope->outer_scope();
2013      }
2014    }
2015  }
2016
2017  *body_block = factory()->NewBlock(nullptr, 3, false, kNoSourcePosition);
2018  (*body_block)->statements()->Add(each_initialization_block, zone());
2019  *each_variable = factory()->NewVariableProxy(temp, for_info->position);
2020}
2021
2022// Create a TDZ for any lexically-bound names in for in/of statements.
2023Block* Parser::CreateForEachStatementTDZ(Block* init_block,
2024                                         const ForInfo& for_info, bool* ok) {
2025  if (IsLexicalVariableMode(for_info.parsing_result.descriptor.mode)) {
2026    DCHECK_NULL(init_block);
2027
2028    init_block = factory()->NewBlock(nullptr, 1, false, kNoSourcePosition);
2029
2030    for (int i = 0; i < for_info.bound_names.length(); ++i) {
2031      // TODO(adamk): This needs to be some sort of special
2032      // INTERNAL variable that's invisible to the debugger
2033      // but visible to everything else.
2034      Declaration* tdz_decl = DeclareVariable(for_info.bound_names[i], LET,
2035                                              kNoSourcePosition, CHECK_OK);
2036      tdz_decl->proxy()->var()->set_initializer_position(position());
2037    }
2038  }
2039  return init_block;
2040}
2041
2042Statement* Parser::InitializeForOfStatement(
2043    ForOfStatement* for_of, Expression* each, Expression* iterable,
2044    Statement* body, bool finalize, IteratorType type, int next_result_pos) {
2045  // Create the auxiliary expressions needed for iterating over the iterable,
2046  // and initialize the given ForOfStatement with them.
2047  // If finalize is true, also instrument the loop with code that performs the
2048  // proper ES6 iterator finalization.  In that case, the result is not
2049  // immediately a ForOfStatement.
2050  const int nopos = kNoSourcePosition;
2051  auto avfactory = ast_value_factory();
2052
2053  Variable* iterator = NewTemporary(avfactory->dot_iterator_string());
2054  Variable* result = NewTemporary(avfactory->dot_result_string());
2055  Variable* completion = NewTemporary(avfactory->empty_string());
2056
2057  // iterator = GetIterator(iterable, type)
2058  Expression* assign_iterator;
2059  {
2060    assign_iterator = factory()->NewAssignment(
2061        Token::ASSIGN, factory()->NewVariableProxy(iterator),
2062        factory()->NewGetIterator(iterable, type, iterable->position()),
2063        iterable->position());
2064  }
2065
2066  // [if (IteratorType == kNormal)]
2067  //     !%_IsJSReceiver(result = iterator.next()) &&
2068  //         %ThrowIteratorResultNotAnObject(result)
2069  // [else if (IteratorType == kAsync)]
2070  //     !%_IsJSReceiver(result = Await(iterator.next())) &&
2071  //         %ThrowIteratorResultNotAnObject(result)
2072  // [endif]
2073  Expression* next_result;
2074  {
2075    Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
2076    next_result =
2077        BuildIteratorNextResult(iterator_proxy, result, type, next_result_pos);
2078  }
2079
2080  // result.done
2081  Expression* result_done;
2082  {
2083    Expression* done_literal = factory()->NewStringLiteral(
2084        ast_value_factory()->done_string(), kNoSourcePosition);
2085    Expression* result_proxy = factory()->NewVariableProxy(result);
2086    result_done =
2087        factory()->NewProperty(result_proxy, done_literal, kNoSourcePosition);
2088  }
2089
2090  // result.value
2091  Expression* result_value;
2092  {
2093    Expression* value_literal =
2094        factory()->NewStringLiteral(avfactory->value_string(), nopos);
2095    Expression* result_proxy = factory()->NewVariableProxy(result);
2096    result_value = factory()->NewProperty(result_proxy, value_literal, nopos);
2097  }
2098
2099  // {{completion = kAbruptCompletion;}}
2100  Statement* set_completion_abrupt;
2101  if (finalize) {
2102    Expression* proxy = factory()->NewVariableProxy(completion);
2103    Expression* assignment = factory()->NewAssignment(
2104        Token::ASSIGN, proxy,
2105        factory()->NewSmiLiteral(Parser::kAbruptCompletion, nopos), nopos);
2106
2107    Block* block = factory()->NewBlock(nullptr, 1, true, nopos);
2108    block->statements()->Add(
2109        factory()->NewExpressionStatement(assignment, nopos), zone());
2110    set_completion_abrupt = block;
2111  }
2112
2113  // do { let tmp = #result_value; #set_completion_abrupt; tmp }
2114  // Expression* result_value (gets overwritten)
2115  if (finalize) {
2116    Variable* var_tmp = NewTemporary(avfactory->empty_string());
2117    Expression* tmp = factory()->NewVariableProxy(var_tmp);
2118    Expression* assignment =
2119        factory()->NewAssignment(Token::ASSIGN, tmp, result_value, nopos);
2120
2121    Block* block = factory()->NewBlock(nullptr, 2, false, nopos);
2122    block->statements()->Add(
2123        factory()->NewExpressionStatement(assignment, nopos), zone());
2124    block->statements()->Add(set_completion_abrupt, zone());
2125
2126    result_value = factory()->NewDoExpression(block, var_tmp, nopos);
2127  }
2128
2129  // each = #result_value;
2130  Expression* assign_each;
2131  {
2132    assign_each =
2133        factory()->NewAssignment(Token::ASSIGN, each, result_value, nopos);
2134    if (each->IsArrayLiteral() || each->IsObjectLiteral()) {
2135      assign_each = PatternRewriter::RewriteDestructuringAssignment(
2136          this, assign_each->AsAssignment(), scope());
2137    }
2138  }
2139
2140  // {{completion = kNormalCompletion;}}
2141  Statement* set_completion_normal;
2142  if (finalize) {
2143    Expression* proxy = factory()->NewVariableProxy(completion);
2144    Expression* assignment = factory()->NewAssignment(
2145        Token::ASSIGN, proxy,
2146        factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
2147
2148    Block* block = factory()->NewBlock(nullptr, 1, true, nopos);
2149    block->statements()->Add(
2150        factory()->NewExpressionStatement(assignment, nopos), zone());
2151    set_completion_normal = block;
2152  }
2153
2154  // { #loop-body; #set_completion_normal }
2155  // Statement* body (gets overwritten)
2156  if (finalize) {
2157    Block* block = factory()->NewBlock(nullptr, 2, false, nopos);
2158    block->statements()->Add(body, zone());
2159    block->statements()->Add(set_completion_normal, zone());
2160    body = block;
2161  }
2162
2163  for_of->Initialize(body, iterator, assign_iterator, next_result, result_done,
2164                     assign_each);
2165  return finalize ? FinalizeForOfStatement(for_of, completion, type, nopos)
2166                  : for_of;
2167}
2168
2169Statement* Parser::DesugarLexicalBindingsInForStatement(
2170    ForStatement* loop, Statement* init, Expression* cond, Statement* next,
2171    Statement* body, Scope* inner_scope, const ForInfo& for_info, bool* ok) {
2172  // ES6 13.7.4.8 specifies that on each loop iteration the let variables are
2173  // copied into a new environment.  Moreover, the "next" statement must be
2174  // evaluated not in the environment of the just completed iteration but in
2175  // that of the upcoming one.  We achieve this with the following desugaring.
2176  // Extra care is needed to preserve the completion value of the original loop.
2177  //
2178  // We are given a for statement of the form
2179  //
2180  //  labels: for (let/const x = i; cond; next) body
2181  //
2182  // and rewrite it as follows.  Here we write {{ ... }} for init-blocks, ie.,
2183  // blocks whose ignore_completion_value_ flag is set.
2184  //
2185  //  {
2186  //    let/const x = i;
2187  //    temp_x = x;
2188  //    first = 1;
2189  //    undefined;
2190  //    outer: for (;;) {
2191  //      let/const x = temp_x;
2192  //      {{ if (first == 1) {
2193  //           first = 0;
2194  //         } else {
2195  //           next;
2196  //         }
2197  //         flag = 1;
2198  //         if (!cond) break;
2199  //      }}
2200  //      labels: for (; flag == 1; flag = 0, temp_x = x) {
2201  //        body
2202  //      }
2203  //      {{ if (flag == 1)  // Body used break.
2204  //           break;
2205  //      }}
2206  //    }
2207  //  }
2208
2209  DCHECK(for_info.bound_names.length() > 0);
2210  ZoneList<Variable*> temps(for_info.bound_names.length(), zone());
2211
2212  Block* outer_block = factory()->NewBlock(
2213      nullptr, for_info.bound_names.length() + 4, false, kNoSourcePosition);
2214
2215  // Add statement: let/const x = i.
2216  outer_block->statements()->Add(init, zone());
2217
2218  const AstRawString* temp_name = ast_value_factory()->dot_for_string();
2219
2220  // For each lexical variable x:
2221  //   make statement: temp_x = x.
2222  for (int i = 0; i < for_info.bound_names.length(); i++) {
2223    VariableProxy* proxy = NewUnresolved(for_info.bound_names[i]);
2224    Variable* temp = NewTemporary(temp_name);
2225    VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
2226    Assignment* assignment = factory()->NewAssignment(Token::ASSIGN, temp_proxy,
2227                                                      proxy, kNoSourcePosition);
2228    Statement* assignment_statement =
2229        factory()->NewExpressionStatement(assignment, kNoSourcePosition);
2230    outer_block->statements()->Add(assignment_statement, zone());
2231    temps.Add(temp, zone());
2232  }
2233
2234  Variable* first = NULL;
2235  // Make statement: first = 1.
2236  if (next) {
2237    first = NewTemporary(temp_name);
2238    VariableProxy* first_proxy = factory()->NewVariableProxy(first);
2239    Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition);
2240    Assignment* assignment = factory()->NewAssignment(
2241        Token::ASSIGN, first_proxy, const1, kNoSourcePosition);
2242    Statement* assignment_statement =
2243        factory()->NewExpressionStatement(assignment, kNoSourcePosition);
2244    outer_block->statements()->Add(assignment_statement, zone());
2245  }
2246
2247  // make statement: undefined;
2248  outer_block->statements()->Add(
2249      factory()->NewExpressionStatement(
2250          factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition),
2251      zone());
2252
2253  // Make statement: outer: for (;;)
2254  // Note that we don't actually create the label, or set this loop up as an
2255  // explicit break target, instead handing it directly to those nodes that
2256  // need to know about it. This should be safe because we don't run any code
2257  // in this function that looks up break targets.
2258  ForStatement* outer_loop =
2259      factory()->NewForStatement(NULL, kNoSourcePosition);
2260  outer_block->statements()->Add(outer_loop, zone());
2261  outer_block->set_scope(scope());
2262
2263  Block* inner_block = factory()->NewBlock(NULL, 3, false, kNoSourcePosition);
2264  {
2265    BlockState block_state(&scope_, inner_scope);
2266
2267    Block* ignore_completion_block = factory()->NewBlock(
2268        nullptr, for_info.bound_names.length() + 3, true, kNoSourcePosition);
2269    ZoneList<Variable*> inner_vars(for_info.bound_names.length(), zone());
2270    // For each let variable x:
2271    //    make statement: let/const x = temp_x.
2272    for (int i = 0; i < for_info.bound_names.length(); i++) {
2273      Declaration* decl = DeclareVariable(
2274          for_info.bound_names[i], for_info.parsing_result.descriptor.mode,
2275          kNoSourcePosition, CHECK_OK);
2276      inner_vars.Add(decl->proxy()->var(), zone());
2277      VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i));
2278      Assignment* assignment = factory()->NewAssignment(
2279          Token::INIT, decl->proxy(), temp_proxy, kNoSourcePosition);
2280      Statement* assignment_statement =
2281          factory()->NewExpressionStatement(assignment, kNoSourcePosition);
2282      DCHECK(init->position() != kNoSourcePosition);
2283      decl->proxy()->var()->set_initializer_position(init->position());
2284      ignore_completion_block->statements()->Add(assignment_statement, zone());
2285    }
2286
2287    // Make statement: if (first == 1) { first = 0; } else { next; }
2288    if (next) {
2289      DCHECK(first);
2290      Expression* compare = NULL;
2291      // Make compare expression: first == 1.
2292      {
2293        Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition);
2294        VariableProxy* first_proxy = factory()->NewVariableProxy(first);
2295        compare = factory()->NewCompareOperation(Token::EQ, first_proxy, const1,
2296                                                 kNoSourcePosition);
2297      }
2298      Statement* clear_first = NULL;
2299      // Make statement: first = 0.
2300      {
2301        VariableProxy* first_proxy = factory()->NewVariableProxy(first);
2302        Expression* const0 = factory()->NewSmiLiteral(0, kNoSourcePosition);
2303        Assignment* assignment = factory()->NewAssignment(
2304            Token::ASSIGN, first_proxy, const0, kNoSourcePosition);
2305        clear_first =
2306            factory()->NewExpressionStatement(assignment, kNoSourcePosition);
2307      }
2308      Statement* clear_first_or_next = factory()->NewIfStatement(
2309          compare, clear_first, next, kNoSourcePosition);
2310      ignore_completion_block->statements()->Add(clear_first_or_next, zone());
2311    }
2312
2313    Variable* flag = NewTemporary(temp_name);
2314    // Make statement: flag = 1.
2315    {
2316      VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2317      Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition);
2318      Assignment* assignment = factory()->NewAssignment(
2319          Token::ASSIGN, flag_proxy, const1, kNoSourcePosition);
2320      Statement* assignment_statement =
2321          factory()->NewExpressionStatement(assignment, kNoSourcePosition);
2322      ignore_completion_block->statements()->Add(assignment_statement, zone());
2323    }
2324
2325    // Make statement: if (!cond) break.
2326    if (cond) {
2327      Statement* stop =
2328          factory()->NewBreakStatement(outer_loop, kNoSourcePosition);
2329      Statement* noop = factory()->NewEmptyStatement(kNoSourcePosition);
2330      ignore_completion_block->statements()->Add(
2331          factory()->NewIfStatement(cond, noop, stop, cond->position()),
2332          zone());
2333    }
2334
2335    inner_block->statements()->Add(ignore_completion_block, zone());
2336    // Make cond expression for main loop: flag == 1.
2337    Expression* flag_cond = NULL;
2338    {
2339      Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition);
2340      VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2341      flag_cond = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1,
2342                                                 kNoSourcePosition);
2343    }
2344
2345    // Create chain of expressions "flag = 0, temp_x = x, ..."
2346    Statement* compound_next_statement = NULL;
2347    {
2348      Expression* compound_next = NULL;
2349      // Make expression: flag = 0.
2350      {
2351        VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2352        Expression* const0 = factory()->NewSmiLiteral(0, kNoSourcePosition);
2353        compound_next = factory()->NewAssignment(Token::ASSIGN, flag_proxy,
2354                                                 const0, kNoSourcePosition);
2355      }
2356
2357      // Make the comma-separated list of temp_x = x assignments.
2358      int inner_var_proxy_pos = scanner()->location().beg_pos;
2359      for (int i = 0; i < for_info.bound_names.length(); i++) {
2360        VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i));
2361        VariableProxy* proxy =
2362            factory()->NewVariableProxy(inner_vars.at(i), inner_var_proxy_pos);
2363        Assignment* assignment = factory()->NewAssignment(
2364            Token::ASSIGN, temp_proxy, proxy, kNoSourcePosition);
2365        compound_next = factory()->NewBinaryOperation(
2366            Token::COMMA, compound_next, assignment, kNoSourcePosition);
2367      }
2368
2369      compound_next_statement =
2370          factory()->NewExpressionStatement(compound_next, kNoSourcePosition);
2371    }
2372
2373    // Make statement: labels: for (; flag == 1; flag = 0, temp_x = x)
2374    // Note that we re-use the original loop node, which retains its labels
2375    // and ensures that any break or continue statements in body point to
2376    // the right place.
2377    loop->Initialize(NULL, flag_cond, compound_next_statement, body);
2378    inner_block->statements()->Add(loop, zone());
2379
2380    // Make statement: {{if (flag == 1) break;}}
2381    {
2382      Expression* compare = NULL;
2383      // Make compare expresion: flag == 1.
2384      {
2385        Expression* const1 = factory()->NewSmiLiteral(1, kNoSourcePosition);
2386        VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2387        compare = factory()->NewCompareOperation(Token::EQ, flag_proxy, const1,
2388                                                 kNoSourcePosition);
2389      }
2390      Statement* stop =
2391          factory()->NewBreakStatement(outer_loop, kNoSourcePosition);
2392      Statement* empty = factory()->NewEmptyStatement(kNoSourcePosition);
2393      Statement* if_flag_break =
2394          factory()->NewIfStatement(compare, stop, empty, kNoSourcePosition);
2395      Block* ignore_completion_block =
2396          factory()->NewBlock(NULL, 1, true, kNoSourcePosition);
2397      ignore_completion_block->statements()->Add(if_flag_break, zone());
2398      inner_block->statements()->Add(ignore_completion_block, zone());
2399    }
2400
2401    inner_block->set_scope(inner_scope);
2402  }
2403
2404  outer_loop->Initialize(NULL, NULL, NULL, inner_block);
2405  return outer_block;
2406}
2407
2408void Parser::AddArrowFunctionFormalParameters(
2409    ParserFormalParameters* parameters, Expression* expr, int end_pos,
2410    bool* ok) {
2411  // ArrowFunctionFormals ::
2412  //    Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail)
2413  //    Tail
2414  // NonTailArrowFunctionFormals ::
2415  //    Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy)
2416  //    VariableProxy
2417  // Tail ::
2418  //    VariableProxy
2419  //    Spread(VariableProxy)
2420  //
2421  // As we need to visit the parameters in left-to-right order, we recurse on
2422  // the left-hand side of comma expressions.
2423  //
2424  if (expr->IsBinaryOperation()) {
2425    BinaryOperation* binop = expr->AsBinaryOperation();
2426    // The classifier has already run, so we know that the expression is a valid
2427    // arrow function formals production.
2428    DCHECK_EQ(binop->op(), Token::COMMA);
2429    Expression* left = binop->left();
2430    Expression* right = binop->right();
2431    int comma_pos = binop->position();
2432    AddArrowFunctionFormalParameters(parameters, left, comma_pos,
2433                                     CHECK_OK_VOID);
2434    // LHS of comma expression should be unparenthesized.
2435    expr = right;
2436  }
2437
2438  // Only the right-most expression may be a rest parameter.
2439  DCHECK(!parameters->has_rest);
2440
2441  bool is_rest = expr->IsSpread();
2442  if (is_rest) {
2443    expr = expr->AsSpread()->expression();
2444    parameters->has_rest = true;
2445  }
2446  if (parameters->is_simple) {
2447    parameters->is_simple = !is_rest && expr->IsVariableProxy();
2448  }
2449
2450  Expression* initializer = nullptr;
2451  if (expr->IsAssignment()) {
2452    Assignment* assignment = expr->AsAssignment();
2453    DCHECK(!assignment->is_compound());
2454    initializer = assignment->value();
2455    expr = assignment->target();
2456  }
2457
2458  AddFormalParameter(parameters, expr, initializer,
2459                     end_pos, is_rest);
2460}
2461
2462void Parser::DeclareArrowFunctionFormalParameters(
2463    ParserFormalParameters* parameters, Expression* expr,
2464    const Scanner::Location& params_loc, Scanner::Location* duplicate_loc,
2465    bool* ok) {
2466  if (expr->IsEmptyParentheses()) return;
2467
2468  AddArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos,
2469                                   CHECK_OK_VOID);
2470
2471  if (parameters->arity > Code::kMaxArguments) {
2472    ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList);
2473    *ok = false;
2474    return;
2475  }
2476
2477  ExpressionClassifier classifier(this);
2478  if (!parameters->is_simple) {
2479    this->classifier()->RecordNonSimpleParameter();
2480  }
2481  DeclareFormalParameters(parameters->scope, parameters->params);
2482  if (!this->classifier()
2483           ->is_valid_formal_parameter_list_without_duplicates()) {
2484    *duplicate_loc =
2485        this->classifier()->duplicate_formal_parameter_error().location;
2486  }
2487  DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters());
2488}
2489
2490void Parser::PrepareGeneratorVariables() {
2491  // For generators, allocating variables in contexts is currently a win because
2492  // it minimizes the work needed to suspend and resume an activation.  The
2493  // code produced for generators relies on this forced context allocation (it
2494  // does not restore the frame's parameters upon resume).
2495  function_state_->scope()->ForceContextAllocation();
2496
2497  // Calling a generator returns a generator object.  That object is stored
2498  // in a temporary variable, a definition that is used by "yield"
2499  // expressions.
2500  function_state_->scope()->DeclareGeneratorObjectVar(
2501      ast_value_factory()->dot_generator_object_string());
2502}
2503
2504FunctionLiteral* Parser::ParseFunctionLiteral(
2505    const AstRawString* function_name, Scanner::Location function_name_location,
2506    FunctionNameValidity function_name_validity, FunctionKind kind,
2507    int function_token_pos, FunctionLiteral::FunctionType function_type,
2508    LanguageMode language_mode, bool* ok) {
2509  // Function ::
2510  //   '(' FormalParameterList? ')' '{' FunctionBody '}'
2511  //
2512  // Getter ::
2513  //   '(' ')' '{' FunctionBody '}'
2514  //
2515  // Setter ::
2516  //   '(' PropertySetParameterList ')' '{' FunctionBody '}'
2517
2518  int pos = function_token_pos == kNoSourcePosition ? peek_position()
2519                                                    : function_token_pos;
2520
2521  // Anonymous functions were passed either the empty symbol or a null
2522  // handle as the function name.  Remember if we were passed a non-empty
2523  // handle to decide whether to invoke function name inference.
2524  bool should_infer_name = function_name == NULL;
2525
2526  // We want a non-null handle as the function name.
2527  if (should_infer_name) {
2528    function_name = ast_value_factory()->empty_string();
2529  }
2530
2531  FunctionLiteral::EagerCompileHint eager_compile_hint =
2532      function_state_->next_function_is_likely_called()
2533          ? FunctionLiteral::kShouldEagerCompile
2534          : default_eager_compile_hint();
2535
2536  // Determine if the function can be parsed lazily. Lazy parsing is
2537  // different from lazy compilation; we need to parse more eagerly than we
2538  // compile.
2539
2540  // We can only parse lazily if we also compile lazily. The heuristics for lazy
2541  // compilation are:
2542  // - It must not have been prohibited by the caller to Parse (some callers
2543  //   need a full AST).
2544  // - The outer scope must allow lazy compilation of inner functions.
2545  // - The function mustn't be a function expression with an open parenthesis
2546  //   before; we consider that a hint that the function will be called
2547  //   immediately, and it would be a waste of time to make it lazily
2548  //   compiled.
2549  // These are all things we can know at this point, without looking at the
2550  // function itself.
2551
2552  // We separate between lazy parsing top level functions and lazy parsing inner
2553  // functions, because the latter needs to do more work. In particular, we need
2554  // to track unresolved variables to distinguish between these cases:
2555  // (function foo() {
2556  //   bar = function() { return 1; }
2557  //  })();
2558  // and
2559  // (function foo() {
2560  //   var a = 1;
2561  //   bar = function() { return a; }
2562  //  })();
2563
2564  // Now foo will be parsed eagerly and compiled eagerly (optimization: assume
2565  // parenthesis before the function means that it will be called
2566  // immediately). bar can be parsed lazily, but we need to parse it in a mode
2567  // that tracks unresolved variables.
2568  DCHECK_IMPLIES(parse_lazily(), FLAG_lazy);
2569  DCHECK_IMPLIES(parse_lazily(), allow_lazy_);
2570  DCHECK_IMPLIES(parse_lazily(), extension_ == nullptr);
2571
2572  bool can_preparse = parse_lazily() &&
2573                      eager_compile_hint == FunctionLiteral::kShouldLazyCompile;
2574
2575  bool is_lazy_top_level_function =
2576      can_preparse && impl()->AllowsLazyParsingWithoutUnresolvedVariables();
2577
2578  RuntimeCallTimerScope runtime_timer(
2579      runtime_call_stats_,
2580      parsing_on_main_thread_
2581          ? &RuntimeCallStats::ParseFunctionLiteral
2582          : &RuntimeCallStats::ParseBackgroundFunctionLiteral);
2583
2584  // Determine whether we can still lazy parse the inner function.
2585  // The preconditions are:
2586  // - Lazy compilation has to be enabled.
2587  // - Neither V8 natives nor native function declarations can be allowed,
2588  //   since parsing one would retroactively force the function to be
2589  //   eagerly compiled.
2590  // - The invoker of this parser can't depend on the AST being eagerly
2591  //   built (either because the function is about to be compiled, or
2592  //   because the AST is going to be inspected for some reason).
2593  // - Because of the above, we can't be attempting to parse a
2594  //   FunctionExpression; even without enclosing parentheses it might be
2595  //   immediately invoked.
2596  // - The function literal shouldn't be hinted to eagerly compile.
2597
2598  // Inner functions will be parsed using a temporary Zone. After parsing, we
2599  // will migrate unresolved variable into a Scope in the main Zone.
2600  // TODO(marja): Refactor parsing modes: simplify this.
2601  bool use_temp_zone =
2602      (FLAG_aggressive_lazy_inner_functions
2603           ? can_preparse
2604           : (is_lazy_top_level_function ||
2605              (parse_lazily() &&
2606               function_type == FunctionLiteral::kDeclaration &&
2607               eager_compile_hint == FunctionLiteral::kShouldLazyCompile)));
2608
2609  DCHECK_IMPLIES(
2610      (is_lazy_top_level_function ||
2611       (parse_lazily() && function_type == FunctionLiteral::kDeclaration &&
2612        eager_compile_hint == FunctionLiteral::kShouldLazyCompile)),
2613      can_preparse);
2614  bool is_lazy_inner_function =
2615      use_temp_zone && FLAG_lazy_inner_functions && !is_lazy_top_level_function;
2616
2617  ZoneList<Statement*>* body = nullptr;
2618  int expected_property_count = -1;
2619  bool should_be_used_once_hint = false;
2620  int num_parameters = -1;
2621  int function_length = -1;
2622  bool has_duplicate_parameters = false;
2623  int function_literal_id = GetNextFunctionLiteralId();
2624
2625  Zone* outer_zone = zone();
2626  DeclarationScope* scope;
2627
2628  {
2629    // Temporary zones can nest. When we migrate free variables (see below), we
2630    // need to recreate them in the previous Zone.
2631    AstNodeFactory previous_zone_ast_node_factory(ast_value_factory());
2632    previous_zone_ast_node_factory.set_zone(zone());
2633
2634    // Open a new zone scope, which sets our AstNodeFactory to allocate in the
2635    // new temporary zone if the preconditions are satisfied, and ensures that
2636    // the previous zone is always restored after parsing the body. To be able
2637    // to do scope analysis correctly after full parsing, we migrate needed
2638    // information when the function is parsed.
2639    Zone temp_zone(zone()->allocator(), ZONE_NAME);
2640    DiscardableZoneScope zone_scope(this, &temp_zone, use_temp_zone);
2641
2642    // This Scope lives in the main zone. We'll migrate data into that zone
2643    // later.
2644    scope = NewFunctionScope(kind, outer_zone);
2645    SetLanguageMode(scope, language_mode);
2646#ifdef DEBUG
2647    scope->SetScopeName(function_name);
2648    if (use_temp_zone) scope->set_needs_migration();
2649#endif
2650
2651    Expect(Token::LPAREN, CHECK_OK);
2652    scope->set_start_position(scanner()->location().beg_pos);
2653
2654    // Eager or lazy parse? If is_lazy_top_level_function, we'll parse
2655    // lazily. We'll call SkipFunction, which may decide to
2656    // abort lazy parsing if it suspects that wasn't a good idea. If so (in
2657    // which case the parser is expected to have backtracked), or if we didn't
2658    // try to lazy parse in the first place, we'll have to parse eagerly.
2659    if (is_lazy_top_level_function || is_lazy_inner_function) {
2660      Scanner::BookmarkScope bookmark(scanner());
2661      bookmark.Set();
2662      LazyParsingResult result = SkipFunction(
2663          kind, scope, &num_parameters, &function_length,
2664          &has_duplicate_parameters, &expected_property_count,
2665          is_lazy_inner_function, is_lazy_top_level_function, CHECK_OK);
2666
2667      if (result == kLazyParsingAborted) {
2668        DCHECK(is_lazy_top_level_function);
2669        bookmark.Apply();
2670        // Trigger eager (re-)parsing, just below this block.
2671        is_lazy_top_level_function = false;
2672
2673        // This is probably an initialization function. Inform the compiler it
2674        // should also eager-compile this function, and that we expect it to be
2675        // used once.
2676        eager_compile_hint = FunctionLiteral::kShouldEagerCompile;
2677        should_be_used_once_hint = true;
2678        scope->ResetAfterPreparsing(ast_value_factory(), true);
2679        zone_scope.Reset();
2680        use_temp_zone = false;
2681      }
2682    }
2683
2684    if (!is_lazy_top_level_function && !is_lazy_inner_function) {
2685      body = ParseFunction(function_name, pos, kind, function_type, scope,
2686                           &num_parameters, &function_length,
2687                           &has_duplicate_parameters, &expected_property_count,
2688                           CHECK_OK);
2689    }
2690
2691    DCHECK(use_temp_zone || !is_lazy_top_level_function);
2692    if (use_temp_zone) {
2693      // If the preconditions are correct the function body should never be
2694      // accessed, but do this anyway for better behaviour if they're wrong.
2695      body = nullptr;
2696      scope->AnalyzePartially(&previous_zone_ast_node_factory,
2697                              preparsed_scope_data_);
2698    }
2699
2700    DCHECK_IMPLIES(use_temp_zone, temp_zoned_);
2701    if (FLAG_trace_preparse) {
2702      PrintF("  [%s]: %i-%i %.*s\n",
2703             is_lazy_top_level_function
2704                 ? "Preparse no-resolution"
2705                 : (temp_zoned_ ? "Preparse resolution" : "Full parse"),
2706             scope->start_position(), scope->end_position(),
2707             function_name->byte_length(), function_name->raw_data());
2708    }
2709    if (V8_UNLIKELY(FLAG_runtime_stats)) {
2710      if (is_lazy_top_level_function) {
2711        RuntimeCallStats::CorrectCurrentCounterId(
2712            runtime_call_stats_,
2713            parsing_on_main_thread_
2714                ? &RuntimeCallStats::PreParseNoVariableResolution
2715                : &RuntimeCallStats::PreParseBackgroundNoVariableResolution);
2716      } else if (temp_zoned_) {
2717        RuntimeCallStats::CorrectCurrentCounterId(
2718            runtime_call_stats_,
2719            parsing_on_main_thread_
2720                ? &RuntimeCallStats::PreParseWithVariableResolution
2721                : &RuntimeCallStats::PreParseBackgroundWithVariableResolution);
2722      }
2723    }
2724
2725    // Validate function name. We can do this only after parsing the function,
2726    // since the function can declare itself strict.
2727    language_mode = scope->language_mode();
2728    CheckFunctionName(language_mode, function_name, function_name_validity,
2729                      function_name_location, CHECK_OK);
2730
2731    if (is_strict(language_mode)) {
2732      CheckStrictOctalLiteral(scope->start_position(), scope->end_position(),
2733                              CHECK_OK);
2734    }
2735    CheckConflictingVarDeclarations(scope, CHECK_OK);
2736  }  // DiscardableZoneScope goes out of scope.
2737
2738  FunctionLiteral::ParameterFlag duplicate_parameters =
2739      has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters
2740                               : FunctionLiteral::kNoDuplicateParameters;
2741
2742  // Note that the FunctionLiteral needs to be created in the main Zone again.
2743  FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
2744      function_name, scope, body, expected_property_count, num_parameters,
2745      function_length, duplicate_parameters, function_type, eager_compile_hint,
2746      pos, true, function_literal_id);
2747  function_literal->set_function_token_position(function_token_pos);
2748  if (should_be_used_once_hint)
2749    function_literal->set_should_be_used_once_hint();
2750
2751  if (should_infer_name) {
2752    DCHECK_NOT_NULL(fni_);
2753    fni_->AddFunction(function_literal);
2754  }
2755  return function_literal;
2756}
2757
2758Parser::LazyParsingResult Parser::SkipFunction(
2759    FunctionKind kind, DeclarationScope* function_scope, int* num_parameters,
2760    int* function_length, bool* has_duplicate_parameters,
2761    int* expected_property_count, bool is_inner_function, bool may_abort,
2762    bool* ok) {
2763  DCHECK_NE(kNoSourcePosition, function_scope->start_position());
2764  DCHECK_EQ(kNoSourcePosition, parameters_end_pos_);
2765  if (produce_cached_parse_data()) CHECK(log_);
2766
2767  DCHECK_IMPLIES(IsArrowFunction(kind),
2768                 scanner()->current_token() == Token::ARROW);
2769
2770  // Inner functions are not part of the cached data.
2771  if (!is_inner_function && consume_cached_parse_data() &&
2772      !cached_parse_data_->rejected()) {
2773    // If we have cached data, we use it to skip parsing the function. The data
2774    // contains the information we need to construct the lazy function.
2775    FunctionEntry entry =
2776        cached_parse_data_->GetFunctionEntry(function_scope->start_position());
2777    // Check that cached data is valid. If not, mark it as invalid (the embedder
2778    // handles it). Note that end position greater than end of stream is safe,
2779    // and hard to check.
2780    if (entry.is_valid() &&
2781        entry.end_pos() > function_scope->start_position()) {
2782      total_preparse_skipped_ += entry.end_pos() - position();
2783      function_scope->set_end_position(entry.end_pos());
2784      scanner()->SeekForward(entry.end_pos() - 1);
2785      Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete));
2786      *num_parameters = entry.num_parameters();
2787      *function_length = entry.function_length();
2788      *has_duplicate_parameters = entry.has_duplicate_parameters();
2789      *expected_property_count = entry.property_count();
2790      SetLanguageMode(function_scope, entry.language_mode());
2791      if (entry.uses_super_property())
2792        function_scope->RecordSuperPropertyUsage();
2793      if (entry.calls_eval()) function_scope->RecordEvalCall();
2794      SkipFunctionLiterals(entry.num_inner_functions());
2795      return kLazyParsingComplete;
2796    }
2797    cached_parse_data_->Reject();
2798  }
2799
2800  // With no cached data, we partially parse the function, without building an
2801  // AST. This gathers the data needed to build a lazy function.
2802  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.PreParse");
2803
2804  if (reusable_preparser_ == NULL) {
2805    reusable_preparser_ = new PreParser(
2806        zone(), &scanner_, stack_limit_, ast_value_factory(),
2807        &pending_error_handler_, runtime_call_stats_, parsing_on_main_thread_);
2808#define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name());
2809    SET_ALLOW(natives);
2810    SET_ALLOW(harmony_do_expressions);
2811    SET_ALLOW(harmony_function_sent);
2812    SET_ALLOW(harmony_trailing_commas);
2813    SET_ALLOW(harmony_class_fields);
2814    SET_ALLOW(harmony_object_rest_spread);
2815    SET_ALLOW(harmony_dynamic_import);
2816    SET_ALLOW(harmony_async_iteration);
2817#undef SET_ALLOW
2818  }
2819  // Aborting inner function preparsing would leave scopes in an inconsistent
2820  // state; we don't parse inner functions in the abortable mode anyway.
2821  DCHECK(!is_inner_function || !may_abort);
2822
2823  PreParser::PreParseResult result = reusable_preparser_->PreParseFunction(
2824      kind, function_scope, parsing_module_, is_inner_function, may_abort,
2825      use_counts_);
2826
2827  // Return immediately if pre-parser decided to abort parsing.
2828  if (result == PreParser::kPreParseAbort) return kLazyParsingAborted;
2829  if (result == PreParser::kPreParseStackOverflow) {
2830    // Propagate stack overflow.
2831    set_stack_overflow();
2832    *ok = false;
2833    return kLazyParsingComplete;
2834  }
2835  if (pending_error_handler_.has_pending_error()) {
2836    *ok = false;
2837    return kLazyParsingComplete;
2838  }
2839  PreParserLogger* logger = reusable_preparser_->logger();
2840  function_scope->set_end_position(logger->end());
2841  Expect(Token::RBRACE, CHECK_OK_VALUE(kLazyParsingComplete));
2842  total_preparse_skipped_ +=
2843      function_scope->end_position() - function_scope->start_position();
2844  *num_parameters = logger->num_parameters();
2845  *function_length = logger->function_length();
2846  *has_duplicate_parameters = logger->has_duplicate_parameters();
2847  *expected_property_count = logger->properties();
2848  SkipFunctionLiterals(logger->num_inner_functions());
2849  if (!is_inner_function && produce_cached_parse_data()) {
2850    DCHECK(log_);
2851    log_->LogFunction(
2852        function_scope->start_position(), function_scope->end_position(),
2853        *num_parameters, *function_length, *has_duplicate_parameters,
2854        *expected_property_count, language_mode(),
2855        function_scope->uses_super_property(), function_scope->calls_eval(),
2856        logger->num_inner_functions());
2857  }
2858  return kLazyParsingComplete;
2859}
2860
2861
2862Statement* Parser::BuildAssertIsCoercible(Variable* var) {
2863  // if (var === null || var === undefined)
2864  //     throw /* type error kNonCoercible) */;
2865
2866  Expression* condition = factory()->NewBinaryOperation(
2867      Token::OR,
2868      factory()->NewCompareOperation(
2869          Token::EQ_STRICT, factory()->NewVariableProxy(var),
2870          factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition),
2871      factory()->NewCompareOperation(
2872          Token::EQ_STRICT, factory()->NewVariableProxy(var),
2873          factory()->NewNullLiteral(kNoSourcePosition), kNoSourcePosition),
2874      kNoSourcePosition);
2875  Expression* throw_type_error =
2876      NewThrowTypeError(MessageTemplate::kNonCoercible,
2877                        ast_value_factory()->empty_string(), kNoSourcePosition);
2878  IfStatement* if_statement = factory()->NewIfStatement(
2879      condition,
2880      factory()->NewExpressionStatement(throw_type_error, kNoSourcePosition),
2881      factory()->NewEmptyStatement(kNoSourcePosition), kNoSourcePosition);
2882  return if_statement;
2883}
2884
2885
2886class InitializerRewriter final
2887    : public AstTraversalVisitor<InitializerRewriter> {
2888 public:
2889  InitializerRewriter(uintptr_t stack_limit, Expression* root, Parser* parser,
2890                      Scope* scope)
2891      : AstTraversalVisitor(stack_limit, root),
2892        parser_(parser),
2893        scope_(scope) {}
2894
2895 private:
2896  // This is required so that the overriden Visit* methods can be
2897  // called by the base class (template).
2898  friend class AstTraversalVisitor<InitializerRewriter>;
2899
2900  // Just rewrite destructuring assignments wrapped in RewritableExpressions.
2901  void VisitRewritableExpression(RewritableExpression* to_rewrite) {
2902    if (to_rewrite->is_rewritten()) return;
2903    Parser::PatternRewriter::RewriteDestructuringAssignment(parser_, to_rewrite,
2904                                                            scope_);
2905    AstTraversalVisitor::VisitRewritableExpression(to_rewrite);
2906  }
2907
2908  // Code in function literals does not need to be eagerly rewritten, it will be
2909  // rewritten when scheduled.
2910  void VisitFunctionLiteral(FunctionLiteral* expr) {}
2911
2912  Parser* parser_;
2913  Scope* scope_;
2914};
2915
2916
2917void Parser::RewriteParameterInitializer(Expression* expr, Scope* scope) {
2918  InitializerRewriter rewriter(stack_limit_, expr, this, scope);
2919  rewriter.Run();
2920}
2921
2922
2923Block* Parser::BuildParameterInitializationBlock(
2924    const ParserFormalParameters& parameters, bool* ok) {
2925  DCHECK(!parameters.is_simple);
2926  DCHECK(scope()->is_function_scope());
2927  Block* init_block = factory()->NewBlock(NULL, 1, true, kNoSourcePosition);
2928  int index = 0;
2929  for (auto parameter : parameters.params) {
2930    if (parameter->is_nondestructuring_rest()) break;
2931    DeclarationDescriptor descriptor;
2932    descriptor.declaration_kind = DeclarationDescriptor::PARAMETER;
2933    descriptor.scope = scope();
2934    descriptor.mode = LET;
2935    descriptor.declaration_pos = parameter->pattern->position();
2936    // The position that will be used by the AssignmentExpression
2937    // which copies from the temp parameter to the pattern.
2938    //
2939    // TODO(adamk): Should this be kNoSourcePosition, since
2940    // it's just copying from a temp var to the real param var?
2941    descriptor.initialization_pos = parameter->pattern->position();
2942    Expression* initial_value =
2943        factory()->NewVariableProxy(parameters.scope->parameter(index));
2944    if (parameter->initializer != nullptr) {
2945      // IS_UNDEFINED($param) ? initializer : $param
2946
2947      // Ensure initializer is rewritten
2948      RewriteParameterInitializer(parameter->initializer, scope());
2949
2950      auto condition = factory()->NewCompareOperation(
2951          Token::EQ_STRICT,
2952          factory()->NewVariableProxy(parameters.scope->parameter(index)),
2953          factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition);
2954      initial_value = factory()->NewConditional(
2955          condition, parameter->initializer, initial_value, kNoSourcePosition);
2956      descriptor.initialization_pos = parameter->initializer->position();
2957    }
2958
2959    Scope* param_scope = scope();
2960    Block* param_block = init_block;
2961    if (!parameter->is_simple() && scope()->calls_sloppy_eval()) {
2962      param_scope = NewVarblockScope();
2963      param_scope->set_start_position(descriptor.initialization_pos);
2964      param_scope->set_end_position(parameter->initializer_end_position);
2965      param_scope->RecordEvalCall();
2966      param_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition);
2967      param_block->set_scope(param_scope);
2968      // Pass the appropriate scope in so that PatternRewriter can appropriately
2969      // rewrite inner initializers of the pattern to param_scope
2970      descriptor.scope = param_scope;
2971      // Rewrite the outer initializer to point to param_scope
2972      ReparentParameterExpressionScope(stack_limit(), initial_value,
2973                                       param_scope);
2974    }
2975
2976    BlockState block_state(&scope_, param_scope);
2977    DeclarationParsingResult::Declaration decl(
2978        parameter->pattern, parameter->initializer_end_position, initial_value);
2979    PatternRewriter::DeclareAndInitializeVariables(
2980        this, param_block, &descriptor, &decl, nullptr, CHECK_OK);
2981
2982    if (param_block != init_block) {
2983      param_scope = param_scope->FinalizeBlockScope();
2984      if (param_scope != nullptr) {
2985        CheckConflictingVarDeclarations(param_scope, CHECK_OK);
2986      }
2987      init_block->statements()->Add(param_block, zone());
2988    }
2989    ++index;
2990  }
2991  return init_block;
2992}
2993
2994Block* Parser::BuildRejectPromiseOnException(Block* inner_block) {
2995  // .promise = %AsyncFunctionPromiseCreate();
2996  // try {
2997  //   <inner_block>
2998  // } catch (.catch) {
2999  //   %RejectPromise(.promise, .catch);
3000  //   return .promise;
3001  // } finally {
3002  //   %AsyncFunctionPromiseRelease(.promise);
3003  // }
3004  Block* result = factory()->NewBlock(nullptr, 2, true, kNoSourcePosition);
3005
3006  // .promise = %AsyncFunctionPromiseCreate();
3007  Statement* set_promise;
3008  {
3009    Expression* create_promise = factory()->NewCallRuntime(
3010        Context::ASYNC_FUNCTION_PROMISE_CREATE_INDEX,
3011        new (zone()) ZoneList<Expression*>(0, zone()), kNoSourcePosition);
3012    Assignment* assign_promise = factory()->NewAssignment(
3013        Token::ASSIGN, factory()->NewVariableProxy(PromiseVariable()),
3014        create_promise, kNoSourcePosition);
3015    set_promise =
3016        factory()->NewExpressionStatement(assign_promise, kNoSourcePosition);
3017  }
3018  result->statements()->Add(set_promise, zone());
3019
3020  // catch (.catch) { return %RejectPromise(.promise, .catch), .promise }
3021  Scope* catch_scope = NewScope(CATCH_SCOPE);
3022  catch_scope->set_is_hidden();
3023  Variable* catch_variable =
3024      catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR);
3025  Block* catch_block = factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3026
3027  Expression* promise_reject = BuildRejectPromise(
3028      factory()->NewVariableProxy(catch_variable), kNoSourcePosition);
3029  ReturnStatement* return_promise_reject =
3030      factory()->NewReturnStatement(promise_reject, kNoSourcePosition);
3031  catch_block->statements()->Add(return_promise_reject, zone());
3032
3033  TryStatement* try_catch_statement =
3034      factory()->NewTryCatchStatementForAsyncAwait(inner_block, catch_scope,
3035                                                   catch_variable, catch_block,
3036                                                   kNoSourcePosition);
3037
3038  // There is no TryCatchFinally node, so wrap it in an outer try/finally
3039  Block* outer_try_block =
3040      factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3041  outer_try_block->statements()->Add(try_catch_statement, zone());
3042
3043  // finally { %AsyncFunctionPromiseRelease(.promise) }
3044  Block* finally_block =
3045      factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3046  {
3047    ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone());
3048    args->Add(factory()->NewVariableProxy(PromiseVariable()), zone());
3049    Expression* call_promise_release = factory()->NewCallRuntime(
3050        Context::ASYNC_FUNCTION_PROMISE_RELEASE_INDEX, args, kNoSourcePosition);
3051    Statement* promise_release = factory()->NewExpressionStatement(
3052        call_promise_release, kNoSourcePosition);
3053    finally_block->statements()->Add(promise_release, zone());
3054  }
3055
3056  Statement* try_finally_statement = factory()->NewTryFinallyStatement(
3057      outer_try_block, finally_block, kNoSourcePosition);
3058
3059  result->statements()->Add(try_finally_statement, zone());
3060  return result;
3061}
3062
3063Assignment* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) {
3064  // .generator = %CreateJSGeneratorObject(...);
3065  DCHECK_NOT_NULL(function_state_->generator_object_variable());
3066  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
3067  args->Add(factory()->NewThisFunction(pos), zone());
3068  args->Add(IsArrowFunction(kind) ? GetLiteralUndefined(pos)
3069                                  : ThisExpression(kNoSourcePosition),
3070            zone());
3071  Expression* allocation =
3072      factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, pos);
3073  VariableProxy* proxy =
3074      factory()->NewVariableProxy(function_state_->generator_object_variable());
3075  return factory()->NewAssignment(Token::INIT, proxy, allocation,
3076                                  kNoSourcePosition);
3077}
3078
3079Expression* Parser::BuildResolvePromise(Expression* value, int pos) {
3080  // %ResolvePromise(.promise, value), .promise
3081  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
3082  args->Add(factory()->NewVariableProxy(PromiseVariable()), zone());
3083  args->Add(value, zone());
3084  Expression* call_runtime =
3085      factory()->NewCallRuntime(Context::PROMISE_RESOLVE_INDEX, args, pos);
3086  return factory()->NewBinaryOperation(
3087      Token::COMMA, call_runtime,
3088      factory()->NewVariableProxy(PromiseVariable()), pos);
3089}
3090
3091Expression* Parser::BuildRejectPromise(Expression* value, int pos) {
3092  // %promise_internal_reject(.promise, value, false), .promise
3093  // Disables the additional debug event for the rejection since a debug event
3094  // already happened for the exception that got us here.
3095  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(3, zone());
3096  args->Add(factory()->NewVariableProxy(PromiseVariable()), zone());
3097  args->Add(value, zone());
3098  args->Add(factory()->NewBooleanLiteral(false, pos), zone());
3099  Expression* call_runtime = factory()->NewCallRuntime(
3100      Context::PROMISE_INTERNAL_REJECT_INDEX, args, pos);
3101  return factory()->NewBinaryOperation(
3102      Token::COMMA, call_runtime,
3103      factory()->NewVariableProxy(PromiseVariable()), pos);
3104}
3105
3106Variable* Parser::PromiseVariable() {
3107  // Based on the various compilation paths, there are many different code
3108  // paths which may be the first to access the Promise temporary. Whichever
3109  // comes first should create it and stash it in the FunctionState.
3110  Variable* promise = function_state_->promise_variable();
3111  if (function_state_->promise_variable() == nullptr) {
3112    promise = function_state_->scope()->DeclarePromiseVar(
3113        ast_value_factory()->empty_string());
3114  }
3115  return promise;
3116}
3117
3118Expression* Parser::BuildInitialYield(int pos, FunctionKind kind) {
3119  Assignment* assignment = BuildCreateJSGeneratorObject(pos, kind);
3120  VariableProxy* generator =
3121      factory()->NewVariableProxy(function_state_->generator_object_variable());
3122  // The position of the yield is important for reporting the exception
3123  // caused by calling the .throw method on a generator suspended at the
3124  // initial yield (i.e. right after generator instantiation).
3125  return factory()->NewYield(generator, assignment, scope()->start_position(),
3126                             Yield::kOnExceptionThrow);
3127}
3128
3129ZoneList<Statement*>* Parser::ParseFunction(
3130    const AstRawString* function_name, int pos, FunctionKind kind,
3131    FunctionLiteral::FunctionType function_type,
3132    DeclarationScope* function_scope, int* num_parameters, int* function_length,
3133    bool* has_duplicate_parameters, int* expected_property_count, bool* ok) {
3134  ParsingModeScope mode(this, allow_lazy_ ? PARSE_LAZILY : PARSE_EAGERLY);
3135
3136  FunctionState function_state(&function_state_, &scope_, function_scope);
3137
3138  DuplicateFinder duplicate_finder;
3139  ExpressionClassifier formals_classifier(this, &duplicate_finder);
3140
3141  if (IsResumableFunction(kind)) PrepareGeneratorVariables();
3142
3143  int expected_parameters_end_pos = parameters_end_pos_;
3144  if (expected_parameters_end_pos != kNoSourcePosition) {
3145    // This is the first function encountered in a CreateDynamicFunction eval.
3146    parameters_end_pos_ = kNoSourcePosition;
3147    // The function name should have been ignored, giving us the empty string
3148    // here.
3149    DCHECK_EQ(function_name, ast_value_factory()->empty_string());
3150  }
3151
3152  ParserFormalParameters formals(function_scope);
3153  ParseFormalParameterList(&formals, CHECK_OK);
3154  if (expected_parameters_end_pos != kNoSourcePosition) {
3155    // Check for '(' or ')' shenanigans in the parameter string for dynamic
3156    // functions.
3157    int position = peek_position();
3158    if (position < expected_parameters_end_pos) {
3159      ReportMessageAt(Scanner::Location(position, position + 1),
3160                      MessageTemplate::kArgStringTerminatesParametersEarly);
3161      *ok = false;
3162      return nullptr;
3163    } else if (position > expected_parameters_end_pos) {
3164      ReportMessageAt(Scanner::Location(expected_parameters_end_pos - 2,
3165                                        expected_parameters_end_pos),
3166                      MessageTemplate::kUnexpectedEndOfArgString);
3167      *ok = false;
3168      return nullptr;
3169    }
3170  }
3171  Expect(Token::RPAREN, CHECK_OK);
3172  int formals_end_position = scanner()->location().end_pos;
3173  *num_parameters = formals.num_parameters();
3174  *function_length = formals.function_length;
3175
3176  CheckArityRestrictions(formals.arity, kind, formals.has_rest,
3177                         function_scope->start_position(), formals_end_position,
3178                         CHECK_OK);
3179  Expect(Token::LBRACE, CHECK_OK);
3180
3181  ZoneList<Statement*>* body = new (zone()) ZoneList<Statement*>(8, zone());
3182  ParseFunctionBody(body, function_name, pos, formals, kind, function_type, ok);
3183
3184  // Validate parameter names. We can do this only after parsing the function,
3185  // since the function can declare itself strict.
3186  const bool allow_duplicate_parameters =
3187      is_sloppy(function_scope->language_mode()) && formals.is_simple &&
3188      !IsConciseMethod(kind);
3189  ValidateFormalParameters(function_scope->language_mode(),
3190                           allow_duplicate_parameters, CHECK_OK);
3191
3192  RewriteDestructuringAssignments();
3193
3194  *has_duplicate_parameters =
3195      !classifier()->is_valid_formal_parameter_list_without_duplicates();
3196
3197  *expected_property_count = function_state.expected_property_count();
3198  return body;
3199}
3200
3201void Parser::DeclareClassVariable(const AstRawString* name,
3202                                  ClassInfo* class_info, int class_token_pos,
3203                                  bool* ok) {
3204#ifdef DEBUG
3205  scope()->SetScopeName(name);
3206#endif
3207
3208  if (name != nullptr) {
3209    class_info->proxy = factory()->NewVariableProxy(name, NORMAL_VARIABLE);
3210    Declaration* declaration = factory()->NewVariableDeclaration(
3211        class_info->proxy, scope(), class_token_pos);
3212    Declare(declaration, DeclarationDescriptor::NORMAL, CONST,
3213            Variable::DefaultInitializationFlag(CONST), ok);
3214  }
3215}
3216
3217// This method declares a property of the given class.  It updates the
3218// following fields of class_info, as appropriate:
3219//   - constructor
3220//   - properties
3221void Parser::DeclareClassProperty(const AstRawString* class_name,
3222                                  ClassLiteralProperty* property,
3223                                  ClassLiteralProperty::Kind kind,
3224                                  bool is_static, bool is_constructor,
3225                                  ClassInfo* class_info, bool* ok) {
3226  if (is_constructor) {
3227    DCHECK(!class_info->constructor);
3228    class_info->constructor = GetPropertyValue(property)->AsFunctionLiteral();
3229    DCHECK_NOT_NULL(class_info->constructor);
3230    class_info->constructor->set_raw_name(
3231        class_name != nullptr ? class_name
3232                              : ast_value_factory()->empty_string());
3233    return;
3234  }
3235
3236  if (property->kind() == ClassLiteralProperty::FIELD) {
3237    DCHECK(allow_harmony_class_fields());
3238    // TODO(littledan): Implement class fields
3239  }
3240  class_info->properties->Add(property, zone());
3241}
3242
3243// This method rewrites a class literal into a do-expression.
3244// It uses the following fields of class_info:
3245//   - constructor (if missing, it updates it with a default constructor)
3246//   - proxy
3247//   - extends
3248//   - properties
3249//   - has_name_static_property
3250//   - has_static_computed_names
3251Expression* Parser::RewriteClassLiteral(const AstRawString* name,
3252                                        ClassInfo* class_info, int pos,
3253                                        bool* ok) {
3254  int end_pos = scanner()->location().end_pos;
3255  Block* do_block = factory()->NewBlock(nullptr, 1, false, pos);
3256  Variable* result_var = NewTemporary(ast_value_factory()->empty_string());
3257  DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
3258
3259  bool has_extends = class_info->extends != nullptr;
3260  bool has_default_constructor = class_info->constructor == nullptr;
3261  if (has_default_constructor) {
3262    class_info->constructor =
3263        DefaultConstructor(name, has_extends, pos, end_pos);
3264  }
3265
3266  scope()->set_end_position(end_pos);
3267
3268  if (name != nullptr) {
3269    DCHECK_NOT_NULL(class_info->proxy);
3270    class_info->proxy->var()->set_initializer_position(end_pos);
3271  }
3272
3273  ClassLiteral* class_literal = factory()->NewClassLiteral(
3274      class_info->proxy, class_info->extends, class_info->constructor,
3275      class_info->properties, pos, end_pos,
3276      class_info->has_name_static_property,
3277      class_info->has_static_computed_names);
3278
3279  do_block->statements()->Add(
3280      factory()->NewExpressionStatement(
3281          factory()->NewAssignment(Token::ASSIGN,
3282                                   factory()->NewVariableProxy(result_var),
3283                                   class_literal, kNoSourcePosition),
3284          pos),
3285      zone());
3286  do_block->set_scope(scope()->FinalizeBlockScope());
3287  do_expr->set_represented_function(class_info->constructor);
3288  AddFunctionForNameInference(class_info->constructor);
3289
3290  return do_expr;
3291}
3292
3293Literal* Parser::GetLiteralUndefined(int position) {
3294  return factory()->NewUndefinedLiteral(position);
3295}
3296
3297
3298void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
3299  Declaration* decl = scope->CheckConflictingVarDeclarations();
3300  if (decl != NULL) {
3301    // In ES6, conflicting variable bindings are early errors.
3302    const AstRawString* name = decl->proxy()->raw_name();
3303    int position = decl->proxy()->position();
3304    Scanner::Location location =
3305        position == kNoSourcePosition
3306            ? Scanner::Location::invalid()
3307            : Scanner::Location(position, position + 1);
3308    ReportMessageAt(location, MessageTemplate::kVarRedeclaration, name);
3309    *ok = false;
3310  }
3311}
3312
3313
3314void Parser::InsertShadowingVarBindingInitializers(Block* inner_block) {
3315  // For each var-binding that shadows a parameter, insert an assignment
3316  // initializing the variable with the parameter.
3317  Scope* inner_scope = inner_block->scope();
3318  DCHECK(inner_scope->is_declaration_scope());
3319  Scope* function_scope = inner_scope->outer_scope();
3320  DCHECK(function_scope->is_function_scope());
3321  BlockState block_state(&scope_, inner_scope);
3322  for (Declaration* decl : *inner_scope->declarations()) {
3323    if (decl->proxy()->var()->mode() != VAR || !decl->IsVariableDeclaration()) {
3324      continue;
3325    }
3326    const AstRawString* name = decl->proxy()->raw_name();
3327    Variable* parameter = function_scope->LookupLocal(name);
3328    if (parameter == nullptr) continue;
3329    VariableProxy* to = NewUnresolved(name);
3330    VariableProxy* from = factory()->NewVariableProxy(parameter);
3331    Expression* assignment =
3332        factory()->NewAssignment(Token::ASSIGN, to, from, kNoSourcePosition);
3333    Statement* statement =
3334        factory()->NewExpressionStatement(assignment, kNoSourcePosition);
3335    inner_block->statements()->InsertAt(0, statement, zone());
3336  }
3337}
3338
3339void Parser::InsertSloppyBlockFunctionVarBindings(DeclarationScope* scope) {
3340  // For the outermost eval scope, we cannot hoist during parsing: let
3341  // declarations in the surrounding scope may prevent hoisting, but the
3342  // information is unaccessible during parsing. In this case, we hoist later in
3343  // DeclarationScope::Analyze.
3344  if (scope->is_eval_scope() && scope->outer_scope() == original_scope_) {
3345    return;
3346  }
3347  scope->HoistSloppyBlockFunctions(factory());
3348}
3349
3350// ----------------------------------------------------------------------------
3351// Parser support
3352
3353bool Parser::TargetStackContainsLabel(const AstRawString* label) {
3354  for (ParserTarget* t = target_stack_; t != NULL; t = t->previous()) {
3355    if (ContainsLabel(t->statement()->labels(), label)) return true;
3356  }
3357  return false;
3358}
3359
3360
3361BreakableStatement* Parser::LookupBreakTarget(const AstRawString* label,
3362                                              bool* ok) {
3363  bool anonymous = label == NULL;
3364  for (ParserTarget* t = target_stack_; t != NULL; t = t->previous()) {
3365    BreakableStatement* stat = t->statement();
3366    if ((anonymous && stat->is_target_for_anonymous()) ||
3367        (!anonymous && ContainsLabel(stat->labels(), label))) {
3368      return stat;
3369    }
3370  }
3371  return NULL;
3372}
3373
3374
3375IterationStatement* Parser::LookupContinueTarget(const AstRawString* label,
3376                                                 bool* ok) {
3377  bool anonymous = label == NULL;
3378  for (ParserTarget* t = target_stack_; t != NULL; t = t->previous()) {
3379    IterationStatement* stat = t->statement()->AsIterationStatement();
3380    if (stat == NULL) continue;
3381
3382    DCHECK(stat->is_target_for_anonymous());
3383    if (anonymous || ContainsLabel(stat->labels(), label)) {
3384      return stat;
3385    }
3386  }
3387  return NULL;
3388}
3389
3390
3391void Parser::HandleSourceURLComments(Isolate* isolate, Handle<Script> script) {
3392  Handle<String> source_url = scanner_.SourceUrl(isolate);
3393  if (!source_url.is_null()) {
3394    script->set_source_url(*source_url);
3395  }
3396  Handle<String> source_mapping_url = scanner_.SourceMappingUrl(isolate);
3397  if (!source_mapping_url.is_null()) {
3398    script->set_source_mapping_url(*source_mapping_url);
3399  }
3400}
3401
3402void Parser::ReportErrors(Isolate* isolate, Handle<Script> script) {
3403  if (stack_overflow()) {
3404    isolate->StackOverflow();
3405  } else {
3406    DCHECK(pending_error_handler_.has_pending_error());
3407    // Internalize ast values for throwing the pending error.
3408    ast_value_factory()->Internalize(isolate);
3409    pending_error_handler_.ThrowPendingError(isolate, script);
3410  }
3411}
3412
3413void Parser::UpdateStatistics(Isolate* isolate, Handle<Script> script) {
3414  // Move statistics to Isolate.
3415  for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
3416       ++feature) {
3417    if (use_counts_[feature] > 0) {
3418      isolate->CountUsage(v8::Isolate::UseCounterFeature(feature));
3419    }
3420  }
3421  if (scanner_.FoundHtmlComment()) {
3422    isolate->CountUsage(v8::Isolate::kHtmlComment);
3423    if (script->line_offset() == 0 && script->column_offset() == 0) {
3424      isolate->CountUsage(v8::Isolate::kHtmlCommentInExternalScript);
3425    }
3426  }
3427  isolate->counters()->total_preparse_skipped()->Increment(
3428      total_preparse_skipped_);
3429  if (!parsing_on_main_thread_ &&
3430      FLAG_runtime_stats ==
3431          v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE) {
3432    // Copy over the counters from the background thread to the main counters on
3433    // the isolate.
3434    isolate->counters()->runtime_call_stats()->Add(runtime_call_stats_);
3435  }
3436}
3437
3438void Parser::ParseOnBackground(ParseInfo* info) {
3439  parsing_on_main_thread_ = false;
3440
3441  DCHECK(info->literal() == NULL);
3442  FunctionLiteral* result = NULL;
3443
3444  ParserLogger logger;
3445  if (produce_cached_parse_data()) {
3446    if (allow_lazy_) {
3447      log_ = &logger;
3448    } else {
3449      compile_options_ = ScriptCompiler::kNoCompileOptions;
3450    }
3451  }
3452  if (FLAG_runtime_stats) {
3453    // Create separate runtime stats for background parsing.
3454    runtime_call_stats_ = new (zone()) RuntimeCallStats();
3455  }
3456
3457  std::unique_ptr<Utf16CharacterStream> stream;
3458  Utf16CharacterStream* stream_ptr;
3459  if (info->character_stream()) {
3460    DCHECK(info->source_stream() == nullptr);
3461    stream_ptr = info->character_stream();
3462  } else {
3463    DCHECK(info->character_stream() == nullptr);
3464    stream.reset(ScannerStream::For(info->source_stream(),
3465                                    info->source_stream_encoding(),
3466                                    runtime_call_stats_));
3467    stream_ptr = stream.get();
3468  }
3469  DCHECK(info->maybe_outer_scope_info().is_null());
3470
3471  DCHECK(original_scope_);
3472
3473  // When streaming, we don't know the length of the source until we have parsed
3474  // it. The raw data can be UTF-8, so we wouldn't know the source length until
3475  // we have decoded it anyway even if we knew the raw data length (which we
3476  // don't). We work around this by storing all the scopes which need their end
3477  // position set at the end of the script (the top scope and possible eval
3478  // scopes) and set their end position after we know the script length.
3479  if (info->is_toplevel()) {
3480    fni_ = new (zone()) FuncNameInferrer(ast_value_factory(), zone());
3481    scanner_.Initialize(stream_ptr);
3482    result = DoParseProgram(info);
3483  } else {
3484    result = DoParseFunction(info, info->function_name(), stream_ptr);
3485  }
3486
3487  info->set_literal(result);
3488
3489  // We cannot internalize on a background thread; a foreground task will take
3490  // care of calling Parser::Internalize just before compilation.
3491
3492  if (produce_cached_parse_data()) {
3493    if (result != NULL) *info->cached_data() = logger.GetScriptData();
3494    log_ = NULL;
3495  }
3496  if (FLAG_runtime_stats &
3497      v8::tracing::TracingCategoryObserver::ENABLED_BY_TRACING) {
3498    auto value = v8::tracing::TracedValue::Create();
3499    runtime_call_stats_->Dump(value.get());
3500    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("v8.runtime_stats"),
3501                         "V8.RuntimeStats", TRACE_EVENT_SCOPE_THREAD,
3502                         "runtime-call-stats", std::move(value));
3503  }
3504}
3505
3506Parser::TemplateLiteralState Parser::OpenTemplateLiteral(int pos) {
3507  return new (zone()) TemplateLiteral(zone(), pos);
3508}
3509
3510void Parser::AddTemplateSpan(TemplateLiteralState* state, bool should_cook,
3511                             bool tail) {
3512  DCHECK(should_cook || allow_harmony_template_escapes());
3513  int pos = scanner()->location().beg_pos;
3514  int end = scanner()->location().end_pos - (tail ? 1 : 2);
3515  const AstRawString* trv = scanner()->CurrentRawSymbol(ast_value_factory());
3516  Literal* raw = factory()->NewStringLiteral(trv, pos);
3517  if (should_cook) {
3518    const AstRawString* tv = scanner()->CurrentSymbol(ast_value_factory());
3519    Literal* cooked = factory()->NewStringLiteral(tv, pos);
3520    (*state)->AddTemplateSpan(cooked, raw, end, zone());
3521  } else {
3522    (*state)->AddTemplateSpan(GetLiteralUndefined(pos), raw, end, zone());
3523  }
3524}
3525
3526
3527void Parser::AddTemplateExpression(TemplateLiteralState* state,
3528                                   Expression* expression) {
3529  (*state)->AddExpression(expression, zone());
3530}
3531
3532
3533Expression* Parser::CloseTemplateLiteral(TemplateLiteralState* state, int start,
3534                                         Expression* tag) {
3535  TemplateLiteral* lit = *state;
3536  int pos = lit->position();
3537  const ZoneList<Expression*>* cooked_strings = lit->cooked();
3538  const ZoneList<Expression*>* raw_strings = lit->raw();
3539  const ZoneList<Expression*>* expressions = lit->expressions();
3540  DCHECK_EQ(cooked_strings->length(), raw_strings->length());
3541  DCHECK_EQ(cooked_strings->length(), expressions->length() + 1);
3542
3543  if (!tag) {
3544    // Build tree of BinaryOps to simplify code-generation
3545    Expression* expr = cooked_strings->at(0);
3546    int i = 0;
3547    while (i < expressions->length()) {
3548      Expression* sub = expressions->at(i++);
3549      Expression* cooked_str = cooked_strings->at(i);
3550
3551      // Let middle be ToString(sub).
3552      ZoneList<Expression*>* args =
3553          new (zone()) ZoneList<Expression*>(1, zone());
3554      args->Add(sub, zone());
3555      Expression* middle = factory()->NewCallRuntime(Runtime::kInlineToString,
3556                                                     args, sub->position());
3557
3558      expr = factory()->NewBinaryOperation(
3559          Token::ADD, factory()->NewBinaryOperation(
3560                          Token::ADD, expr, middle, expr->position()),
3561          cooked_str, sub->position());
3562    }
3563    return expr;
3564  } else {
3565    uint32_t hash = ComputeTemplateLiteralHash(lit);
3566
3567    // $getTemplateCallSite
3568    ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(4, zone());
3569    args->Add(factory()->NewArrayLiteral(
3570                  const_cast<ZoneList<Expression*>*>(cooked_strings), pos),
3571              zone());
3572    args->Add(factory()->NewArrayLiteral(
3573                  const_cast<ZoneList<Expression*>*>(raw_strings), pos),
3574              zone());
3575
3576    // Truncate hash to Smi-range.
3577    Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash)));
3578    args->Add(factory()->NewNumberLiteral(hash_obj->value(), pos), zone());
3579
3580    Expression* call_site = factory()->NewCallRuntime(
3581        Context::GET_TEMPLATE_CALL_SITE_INDEX, args, start);
3582
3583    // Call TagFn
3584    ZoneList<Expression*>* call_args =
3585        new (zone()) ZoneList<Expression*>(expressions->length() + 1, zone());
3586    call_args->Add(call_site, zone());
3587    call_args->AddAll(*expressions, zone());
3588    return factory()->NewCall(tag, call_args, pos);
3589  }
3590}
3591
3592
3593uint32_t Parser::ComputeTemplateLiteralHash(const TemplateLiteral* lit) {
3594  const ZoneList<Expression*>* raw_strings = lit->raw();
3595  int total = raw_strings->length();
3596  DCHECK(total);
3597
3598  uint32_t running_hash = 0;
3599
3600  for (int index = 0; index < total; ++index) {
3601    if (index) {
3602      running_hash = StringHasher::ComputeRunningHashOneByte(
3603          running_hash, "${}", 3);
3604    }
3605
3606    const AstRawString* raw_string =
3607        raw_strings->at(index)->AsLiteral()->raw_value()->AsString();
3608    if (raw_string->is_one_byte()) {
3609      const char* data = reinterpret_cast<const char*>(raw_string->raw_data());
3610      running_hash = StringHasher::ComputeRunningHashOneByte(
3611          running_hash, data, raw_string->length());
3612    } else {
3613      const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
3614      running_hash = StringHasher::ComputeRunningHash(running_hash, data,
3615                                                      raw_string->length());
3616    }
3617  }
3618
3619  return running_hash;
3620}
3621
3622namespace {
3623
3624bool OnlyLastArgIsSpread(ZoneList<Expression*>* args) {
3625  for (int i = 0; i < args->length() - 1; i++) {
3626    if (args->at(i)->IsSpread()) {
3627      return false;
3628    }
3629  }
3630  return args->at(args->length() - 1)->IsSpread();
3631}
3632
3633}  // namespace
3634
3635ZoneList<Expression*>* Parser::PrepareSpreadArguments(
3636    ZoneList<Expression*>* list) {
3637  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone());
3638  if (list->length() == 1) {
3639    // Spread-call with single spread argument produces an InternalArray
3640    // containing the values from the array.
3641    //
3642    // Function is called or constructed with the produced array of arguments
3643    //
3644    // EG: Apply(Func, Spread(spread0))
3645    ZoneList<Expression*>* spread_list =
3646        new (zone()) ZoneList<Expression*>(0, zone());
3647    spread_list->Add(list->at(0)->AsSpread()->expression(), zone());
3648    args->Add(factory()->NewCallRuntime(Runtime::kSpreadIterablePrepare,
3649                                        spread_list, kNoSourcePosition),
3650              zone());
3651    return args;
3652  } else {
3653    // Spread-call with multiple arguments produces array literals for each
3654    // sequences of unspread arguments, and converts each spread iterable to
3655    // an Internal array. Finally, all of these produced arrays are flattened
3656    // into a single InternalArray, containing the arguments for the call.
3657    //
3658    // EG: Apply(Func, Flatten([unspread0, unspread1], Spread(spread0),
3659    //                         Spread(spread1), [unspread2, unspread3]))
3660    int i = 0;
3661    int n = list->length();
3662    while (i < n) {
3663      if (!list->at(i)->IsSpread()) {
3664        ZoneList<Expression*>* unspread =
3665            new (zone()) ZoneList<Expression*>(1, zone());
3666
3667        // Push array of unspread parameters
3668        while (i < n && !list->at(i)->IsSpread()) {
3669          unspread->Add(list->at(i++), zone());
3670        }
3671        args->Add(factory()->NewArrayLiteral(unspread, kNoSourcePosition),
3672                  zone());
3673
3674        if (i == n) break;
3675      }
3676
3677      // Push eagerly spread argument
3678      ZoneList<Expression*>* spread_list =
3679          new (zone()) ZoneList<Expression*>(1, zone());
3680      spread_list->Add(list->at(i++)->AsSpread()->expression(), zone());
3681      args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX,
3682                                          spread_list, kNoSourcePosition),
3683                zone());
3684    }
3685
3686    list = new (zone()) ZoneList<Expression*>(1, zone());
3687    list->Add(factory()->NewCallRuntime(Context::SPREAD_ARGUMENTS_INDEX, args,
3688                                        kNoSourcePosition),
3689              zone());
3690    return list;
3691  }
3692  UNREACHABLE();
3693}
3694
3695Expression* Parser::SpreadCall(Expression* function,
3696                               ZoneList<Expression*>* args, int pos,
3697                               Call::PossiblyEval is_possibly_eval) {
3698  // Handle these cases in BytecodeGenerator.
3699  // [Call,New]WithSpread bytecodes aren't used with tailcalls - see
3700  // https://crbug.com/v8/5867
3701  if (!allow_tailcalls() && OnlyLastArgIsSpread(args)) {
3702    return factory()->NewCall(function, args, pos);
3703  }
3704
3705  if (function->IsSuperCallReference()) {
3706    // Super calls
3707    // $super_constructor = %_GetSuperConstructor(<this-function>)
3708    // %reflect_construct($super_constructor, args, new.target)
3709
3710    args = PrepareSpreadArguments(args);
3711    ZoneList<Expression*>* tmp = new (zone()) ZoneList<Expression*>(1, zone());
3712    tmp->Add(function->AsSuperCallReference()->this_function_var(), zone());
3713    Expression* super_constructor = factory()->NewCallRuntime(
3714        Runtime::kInlineGetSuperConstructor, tmp, pos);
3715    args->InsertAt(0, super_constructor, zone());
3716    args->Add(function->AsSuperCallReference()->new_target_var(), zone());
3717    return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args,
3718                                     pos);
3719  } else {
3720    args = PrepareSpreadArguments(args);
3721    if (function->IsProperty()) {
3722      // Method calls
3723      if (function->AsProperty()->IsSuperAccess()) {
3724        Expression* home = ThisExpression(kNoSourcePosition);
3725        args->InsertAt(0, function, zone());
3726        args->InsertAt(1, home, zone());
3727      } else {
3728        Variable* temp = NewTemporary(ast_value_factory()->empty_string());
3729        VariableProxy* obj = factory()->NewVariableProxy(temp);
3730        Assignment* assign_obj = factory()->NewAssignment(
3731            Token::ASSIGN, obj, function->AsProperty()->obj(),
3732            kNoSourcePosition);
3733        function = factory()->NewProperty(
3734            assign_obj, function->AsProperty()->key(), kNoSourcePosition);
3735        args->InsertAt(0, function, zone());
3736        obj = factory()->NewVariableProxy(temp);
3737        args->InsertAt(1, obj, zone());
3738      }
3739    } else {
3740      // Non-method calls
3741      args->InsertAt(0, function, zone());
3742      args->InsertAt(1, factory()->NewUndefinedLiteral(kNoSourcePosition),
3743                     zone());
3744    }
3745    return factory()->NewCallRuntime(Context::REFLECT_APPLY_INDEX, args, pos);
3746  }
3747}
3748
3749Expression* Parser::SpreadCallNew(Expression* function,
3750                                  ZoneList<Expression*>* args, int pos) {
3751  if (OnlyLastArgIsSpread(args)) {
3752    // Handle in BytecodeGenerator.
3753    return factory()->NewCallNew(function, args, pos);
3754  }
3755  args = PrepareSpreadArguments(args);
3756  args->InsertAt(0, function, zone());
3757
3758  return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos);
3759}
3760
3761
3762void Parser::SetLanguageMode(Scope* scope, LanguageMode mode) {
3763  v8::Isolate::UseCounterFeature feature;
3764  if (is_sloppy(mode))
3765    feature = v8::Isolate::kSloppyMode;
3766  else if (is_strict(mode))
3767    feature = v8::Isolate::kStrictMode;
3768  else
3769    UNREACHABLE();
3770  ++use_counts_[feature];
3771  scope->SetLanguageMode(mode);
3772}
3773
3774void Parser::SetAsmModule() {
3775  // Store the usage count; The actual use counter on the isolate is
3776  // incremented after parsing is done.
3777  ++use_counts_[v8::Isolate::kUseAsm];
3778  DCHECK(scope()->is_declaration_scope());
3779  scope()->AsDeclarationScope()->set_asm_module();
3780}
3781
3782void Parser::MarkCollectedTailCallExpressions() {
3783  const ZoneList<Expression*>& tail_call_expressions =
3784      function_state_->tail_call_expressions().expressions();
3785  for (int i = 0; i < tail_call_expressions.length(); ++i) {
3786    MarkTailPosition(tail_call_expressions[i]);
3787  }
3788}
3789
3790Expression* Parser::ExpressionListToExpression(ZoneList<Expression*>* args) {
3791  Expression* expr = args->at(0);
3792  for (int i = 1; i < args->length(); ++i) {
3793    expr = factory()->NewBinaryOperation(Token::COMMA, expr, args->at(i),
3794                                         expr->position());
3795  }
3796  return expr;
3797}
3798
3799// This method intoduces the line initializing the generator object
3800// when desugaring the body of async_function.
3801void Parser::PrepareAsyncFunctionBody(ZoneList<Statement*>* body,
3802                                      FunctionKind kind, int pos) {
3803  // When parsing an async arrow function, we get here without having called
3804  // PrepareGeneratorVariables yet, so do it now.
3805  if (function_state_->generator_object_variable() == nullptr) {
3806    PrepareGeneratorVariables();
3807  }
3808  body->Add(factory()->NewExpressionStatement(
3809                BuildCreateJSGeneratorObject(pos, kind), kNoSourcePosition),
3810            zone());
3811}
3812
3813// This method completes the desugaring of the body of async_function.
3814void Parser::RewriteAsyncFunctionBody(ZoneList<Statement*>* body, Block* block,
3815                                      Expression* return_value, bool* ok) {
3816  // function async_function() {
3817  //   .generator_object = %CreateJSGeneratorObject();
3818  //   BuildRejectPromiseOnException({
3819  //     ... block ...
3820  //     return %ResolvePromise(.promise, expr), .promise;
3821  //   })
3822  // }
3823
3824  return_value = BuildResolvePromise(return_value, return_value->position());
3825  block->statements()->Add(
3826      factory()->NewReturnStatement(return_value, return_value->position()),
3827      zone());
3828  block = BuildRejectPromiseOnException(block);
3829  body->Add(block, zone());
3830}
3831
3832Expression* Parser::RewriteAwaitExpression(Expression* value, int await_pos) {
3833  // yield do {
3834  //   tmp = <operand>;
3835  //   %AsyncFunctionAwait(.generator_object, tmp, .promise);
3836  //   .promise
3837  // }
3838  // The value of the expression is returned to the caller of the async
3839  // function for the first yield statement; for this, .promise is the
3840  // appropriate return value, being a Promise that will be fulfilled or
3841  // rejected with the appropriate value by the desugaring. Subsequent yield
3842  // occurrences will return to the AsyncFunctionNext call within the
3843  // implemementation of the intermediate throwaway Promise's then handler.
3844  // This handler has nothing useful to do with the value, as the Promise is
3845  // ignored. If we yielded the value of the throwawayPromise that
3846  // AsyncFunctionAwait creates as an intermediate, it would create a memory
3847  // leak; we must return .promise instead;
3848  // The operand needs to be evaluated on a separate statement in order to get
3849  // a break location, and the .promise needs to be read earlier so that it
3850  // doesn't insert a false location.
3851  // TODO(littledan): investigate why this ordering is needed in more detail.
3852  Variable* generator_object_variable =
3853      function_state_->generator_object_variable();
3854  DCHECK_NOT_NULL(generator_object_variable);
3855
3856  const int nopos = kNoSourcePosition;
3857
3858  Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos);
3859
3860  Variable* promise = PromiseVariable();
3861
3862  // Wrap value evaluation to provide a break location.
3863  Variable* temp_var = NewTemporary(ast_value_factory()->empty_string());
3864  Expression* value_assignment = factory()->NewAssignment(
3865      Token::ASSIGN, factory()->NewVariableProxy(temp_var), value, nopos);
3866  do_block->statements()->Add(
3867      factory()->NewExpressionStatement(value_assignment, value->position()),
3868      zone());
3869
3870  ZoneList<Expression*>* async_function_await_args =
3871      new (zone()) ZoneList<Expression*>(3, zone());
3872  Expression* generator_object =
3873      factory()->NewVariableProxy(generator_object_variable);
3874  async_function_await_args->Add(generator_object, zone());
3875  async_function_await_args->Add(factory()->NewVariableProxy(temp_var), zone());
3876  async_function_await_args->Add(factory()->NewVariableProxy(promise), zone());
3877
3878  // The parser emits calls to AsyncFunctionAwaitCaught, but the
3879  // AstNumberingVisitor will rewrite this to AsyncFunctionAwaitUncaught
3880  // if there is no local enclosing try/catch block.
3881  Expression* async_function_await =
3882      factory()->NewCallRuntime(Context::ASYNC_FUNCTION_AWAIT_CAUGHT_INDEX,
3883                                async_function_await_args, nopos);
3884  do_block->statements()->Add(
3885      factory()->NewExpressionStatement(async_function_await, await_pos),
3886      zone());
3887
3888  // Wrap await to provide a break location between value evaluation and yield.
3889  Expression* do_expr = factory()->NewDoExpression(do_block, promise, nopos);
3890
3891  generator_object = factory()->NewVariableProxy(generator_object_variable);
3892  return factory()->NewYield(generator_object, do_expr, nopos,
3893                             Yield::kOnExceptionRethrow);
3894}
3895
3896class NonPatternRewriter : public AstExpressionRewriter {
3897 public:
3898  NonPatternRewriter(uintptr_t stack_limit, Parser* parser)
3899      : AstExpressionRewriter(stack_limit), parser_(parser) {}
3900  ~NonPatternRewriter() override {}
3901
3902 private:
3903  bool RewriteExpression(Expression* expr) override {
3904    if (expr->IsRewritableExpression()) return true;
3905    // Rewrite only what could have been a pattern but is not.
3906    if (expr->IsArrayLiteral()) {
3907      // Spread rewriting in array literals.
3908      ArrayLiteral* lit = expr->AsArrayLiteral();
3909      VisitExpressions(lit->values());
3910      replacement_ = parser_->RewriteSpreads(lit);
3911      return false;
3912    }
3913    if (expr->IsObjectLiteral()) {
3914      return true;
3915    }
3916    if (expr->IsBinaryOperation() &&
3917        expr->AsBinaryOperation()->op() == Token::COMMA) {
3918      return true;
3919    }
3920    // Everything else does not need rewriting.
3921    return false;
3922  }
3923
3924  void VisitLiteralProperty(LiteralProperty* property) override {
3925    if (property == nullptr) return;
3926    // Do not rewrite (computed) key expressions
3927    AST_REWRITE_PROPERTY(Expression, property, value);
3928  }
3929
3930  Parser* parser_;
3931};
3932
3933void Parser::RewriteNonPattern(bool* ok) {
3934  ValidateExpression(CHECK_OK_VOID);
3935  auto non_patterns_to_rewrite = function_state_->non_patterns_to_rewrite();
3936  int begin = classifier()->GetNonPatternBegin();
3937  int end = non_patterns_to_rewrite->length();
3938  if (begin < end) {
3939    NonPatternRewriter rewriter(stack_limit_, this);
3940    for (int i = begin; i < end; i++) {
3941      DCHECK(non_patterns_to_rewrite->at(i)->IsRewritableExpression());
3942      rewriter.Rewrite(non_patterns_to_rewrite->at(i));
3943    }
3944    non_patterns_to_rewrite->Rewind(begin);
3945  }
3946}
3947
3948
3949void Parser::RewriteDestructuringAssignments() {
3950  const auto& assignments =
3951      function_state_->destructuring_assignments_to_rewrite();
3952  for (int i = assignments.length() - 1; i >= 0; --i) {
3953    // Rewrite list in reverse, so that nested assignment patterns are rewritten
3954    // correctly.
3955    const DestructuringAssignment& pair = assignments.at(i);
3956    RewritableExpression* to_rewrite =
3957        pair.assignment->AsRewritableExpression();
3958    DCHECK_NOT_NULL(to_rewrite);
3959    if (!to_rewrite->is_rewritten()) {
3960      // Since this function is called at the end of parsing the program,
3961      // pair.scope may already have been removed by FinalizeBlockScope in the
3962      // meantime.
3963      Scope* scope = pair.scope->GetUnremovedScope();
3964      PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, scope);
3965    }
3966  }
3967}
3968
3969Expression* Parser::RewriteExponentiation(Expression* left, Expression* right,
3970                                          int pos) {
3971  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
3972  args->Add(left, zone());
3973  args->Add(right, zone());
3974  return factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos);
3975}
3976
3977Expression* Parser::RewriteAssignExponentiation(Expression* left,
3978                                                Expression* right, int pos) {
3979  ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
3980  if (left->IsVariableProxy()) {
3981    VariableProxy* lhs = left->AsVariableProxy();
3982
3983    Expression* result;
3984    DCHECK_NOT_NULL(lhs->raw_name());
3985    result = ExpressionFromIdentifier(lhs->raw_name(), lhs->position());
3986    args->Add(left, zone());
3987    args->Add(right, zone());
3988    Expression* call =
3989        factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos);
3990    return factory()->NewAssignment(Token::ASSIGN, result, call, pos);
3991  } else if (left->IsProperty()) {
3992    Property* prop = left->AsProperty();
3993    auto temp_obj = NewTemporary(ast_value_factory()->empty_string());
3994    auto temp_key = NewTemporary(ast_value_factory()->empty_string());
3995    Expression* assign_obj = factory()->NewAssignment(
3996        Token::ASSIGN, factory()->NewVariableProxy(temp_obj), prop->obj(),
3997        kNoSourcePosition);
3998    Expression* assign_key = factory()->NewAssignment(
3999        Token::ASSIGN, factory()->NewVariableProxy(temp_key), prop->key(),
4000        kNoSourcePosition);
4001    args->Add(factory()->NewProperty(factory()->NewVariableProxy(temp_obj),
4002                                     factory()->NewVariableProxy(temp_key),
4003                                     left->position()),
4004              zone());
4005    args->Add(right, zone());
4006    Expression* call =
4007        factory()->NewCallRuntime(Context::MATH_POW_INDEX, args, pos);
4008    Expression* target = factory()->NewProperty(
4009        factory()->NewVariableProxy(temp_obj),
4010        factory()->NewVariableProxy(temp_key), kNoSourcePosition);
4011    Expression* assign =
4012        factory()->NewAssignment(Token::ASSIGN, target, call, pos);
4013    return factory()->NewBinaryOperation(
4014        Token::COMMA, assign_obj,
4015        factory()->NewBinaryOperation(Token::COMMA, assign_key, assign, pos),
4016        pos);
4017  }
4018  UNREACHABLE();
4019  return nullptr;
4020}
4021
4022Expression* Parser::RewriteSpreads(ArrayLiteral* lit) {
4023  // Array literals containing spreads are rewritten using do expressions, e.g.
4024  //    [1, 2, 3, ...x, 4, ...y, 5]
4025  // is roughly rewritten as:
4026  //    do {
4027  //      $R = [1, 2, 3];
4028  //      for ($i of x) %AppendElement($R, $i);
4029  //      %AppendElement($R, 4);
4030  //      for ($j of y) %AppendElement($R, $j);
4031  //      %AppendElement($R, 5);
4032  //      $R
4033  //    }
4034  // where $R, $i and $j are fresh temporary variables.
4035  ZoneList<Expression*>::iterator s = lit->FirstSpread();
4036  if (s == lit->EndValue()) return nullptr;  // no spread, no rewriting...
4037  Variable* result = NewTemporary(ast_value_factory()->dot_result_string());
4038  // NOTE: The value assigned to R is the whole original array literal,
4039  // spreads included. This will be fixed before the rewritten AST is returned.
4040  // $R = lit
4041  Expression* init_result = factory()->NewAssignment(
4042      Token::INIT, factory()->NewVariableProxy(result), lit, kNoSourcePosition);
4043  Block* do_block = factory()->NewBlock(nullptr, 16, false, kNoSourcePosition);
4044  do_block->statements()->Add(
4045      factory()->NewExpressionStatement(init_result, kNoSourcePosition),
4046      zone());
4047  // Traverse the array literal starting from the first spread.
4048  while (s != lit->EndValue()) {
4049    Expression* value = *s++;
4050    Spread* spread = value->AsSpread();
4051    if (spread == nullptr) {
4052      // If the element is not a spread, we're adding a single:
4053      // %AppendElement($R, value)
4054      // or, in case of a hole,
4055      // ++($R.length)
4056      if (!value->IsLiteral() ||
4057          !value->AsLiteral()->raw_value()->IsTheHole()) {
4058        ZoneList<Expression*>* append_element_args = NewExpressionList(2);
4059        append_element_args->Add(factory()->NewVariableProxy(result), zone());
4060        append_element_args->Add(value, zone());
4061        do_block->statements()->Add(
4062            factory()->NewExpressionStatement(
4063                factory()->NewCallRuntime(Runtime::kAppendElement,
4064                                          append_element_args,
4065                                          kNoSourcePosition),
4066                kNoSourcePosition),
4067            zone());
4068      } else {
4069        Property* length_property = factory()->NewProperty(
4070            factory()->NewVariableProxy(result),
4071            factory()->NewStringLiteral(ast_value_factory()->length_string(),
4072                                        kNoSourcePosition),
4073            kNoSourcePosition);
4074        CountOperation* count_op = factory()->NewCountOperation(
4075            Token::INC, true /* prefix */, length_property, kNoSourcePosition);
4076        do_block->statements()->Add(
4077            factory()->NewExpressionStatement(count_op, kNoSourcePosition),
4078            zone());
4079      }
4080    } else {
4081      // If it's a spread, we're adding a for/of loop iterating through it.
4082      Variable* each = NewTemporary(ast_value_factory()->dot_for_string());
4083      Expression* subject = spread->expression();
4084      // %AppendElement($R, each)
4085      Statement* append_body;
4086      {
4087        ZoneList<Expression*>* append_element_args = NewExpressionList(2);
4088        append_element_args->Add(factory()->NewVariableProxy(result), zone());
4089        append_element_args->Add(factory()->NewVariableProxy(each), zone());
4090        append_body = factory()->NewExpressionStatement(
4091            factory()->NewCallRuntime(Runtime::kAppendElement,
4092                                      append_element_args, kNoSourcePosition),
4093            kNoSourcePosition);
4094      }
4095      // for (each of spread) %AppendElement($R, each)
4096      ForOfStatement* loop =
4097          factory()->NewForOfStatement(nullptr, kNoSourcePosition);
4098      const bool finalize = false;
4099      InitializeForOfStatement(loop, factory()->NewVariableProxy(each), subject,
4100                               append_body, finalize, IteratorType::kNormal);
4101      do_block->statements()->Add(loop, zone());
4102    }
4103  }
4104  // Now, rewind the original array literal to truncate everything from the
4105  // first spread (included) until the end. This fixes $R's initialization.
4106  lit->RewindSpreads();
4107  return factory()->NewDoExpression(do_block, result, lit->position());
4108}
4109
4110void Parser::QueueDestructuringAssignmentForRewriting(Expression* expr) {
4111  DCHECK(expr->IsRewritableExpression());
4112  function_state_->AddDestructuringAssignment(
4113      DestructuringAssignment(expr, scope()));
4114}
4115
4116void Parser::QueueNonPatternForRewriting(Expression* expr, bool* ok) {
4117  DCHECK(expr->IsRewritableExpression());
4118  function_state_->AddNonPatternForRewriting(expr, ok);
4119}
4120
4121void Parser::AddAccessorPrefixToFunctionName(bool is_get,
4122                                             FunctionLiteral* function,
4123                                             const AstRawString* name) {
4124  DCHECK_NOT_NULL(name);
4125  const AstRawString* prefix = is_get ? ast_value_factory()->get_space_string()
4126                                      : ast_value_factory()->set_space_string();
4127  function->set_raw_name(ast_value_factory()->NewConsString(prefix, name));
4128}
4129
4130void Parser::SetFunctionNameFromPropertyName(ObjectLiteralProperty* property,
4131                                             const AstRawString* name) {
4132  DCHECK(property->kind() != ObjectLiteralProperty::GETTER);
4133  DCHECK(property->kind() != ObjectLiteralProperty::SETTER);
4134
4135  // Computed name setting must happen at runtime.
4136  DCHECK(!property->is_computed_name());
4137
4138  // Ignore "__proto__" as a name when it's being used to set the [[Prototype]]
4139  // of an object literal.
4140  if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return;
4141
4142  Expression* value = property->value();
4143
4144  DCHECK(!value->IsAnonymousFunctionDefinition() ||
4145         property->kind() == ObjectLiteralProperty::COMPUTED);
4146  SetFunctionName(value, name);
4147}
4148
4149void Parser::SetFunctionNameFromIdentifierRef(Expression* value,
4150                                              Expression* identifier) {
4151  if (!identifier->IsVariableProxy()) return;
4152  SetFunctionName(value, identifier->AsVariableProxy()->raw_name());
4153}
4154
4155void Parser::SetFunctionName(Expression* value, const AstRawString* name) {
4156  DCHECK_NOT_NULL(name);
4157  if (!value->IsAnonymousFunctionDefinition()) return;
4158  auto function = value->AsFunctionLiteral();
4159  if (function != nullptr) {
4160    function->set_raw_name(name);
4161  } else {
4162    DCHECK(value->IsDoExpression());
4163    value->AsDoExpression()->represented_function()->set_raw_name(name);
4164  }
4165}
4166
4167
4168// Desugaring of yield*
4169// ====================
4170//
4171// With the help of do-expressions and function.sent, we desugar yield* into a
4172// loop containing a "raw" yield (a yield that doesn't wrap an iterator result
4173// object around its argument).  Concretely, "yield* iterable" turns into
4174// roughly the following code:
4175//
4176//   do {
4177//     const kNext = 0;
4178//     const kReturn = 1;
4179//     const kThrow = 2;
4180//
4181//     let input = undefined;
4182//     let mode = kNext;
4183//     let output = undefined;
4184//
4185//     let iterator = GetIterator(iterable);
4186//
4187//     while (true) {
4188//       // From the generator to the iterator:
4189//       // Forward input according to resume mode and obtain output.
4190//       switch (mode) {
4191//         case kNext:
4192//           output = iterator.next(input);
4193//           if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4194//           break;
4195//         case kReturn:
4196//           IteratorClose(iterator, input, output);  // See below.
4197//           break;
4198//         case kThrow:
4199//           let iteratorThrow = iterator.throw;
4200//           if (IS_NULL_OR_UNDEFINED(iteratorThrow)) {
4201//             IteratorClose(iterator);  // See below.
4202//             throw MakeTypeError(kThrowMethodMissing);
4203//           }
4204//           output = %_Call(iteratorThrow, iterator, input);
4205//           if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4206//           break;
4207//       }
4208//       if (output.done) break;
4209//
4210//       // From the generator to its user:
4211//       // Forward output, receive new input, and determine resume mode.
4212//       mode = kReturn;
4213//       try {
4214//         try {
4215//           RawYield(output);  // See explanation above.
4216//           mode = kNext;
4217//         } catch (error) {
4218//           mode = kThrow;
4219//         }
4220//       } finally {
4221//         input = function.sent;
4222//         continue;
4223//       }
4224//     }
4225//
4226//     if (mode === kReturn) {
4227//       return {value: output.value, done: true};
4228//     }
4229//     output.value
4230//   }
4231//
4232// IteratorClose(iterator) expands to the following:
4233//
4234//   let iteratorReturn = iterator.return;
4235//   if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) {
4236//     let output = %_Call(iteratorReturn, iterator);
4237//     if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4238//   }
4239//
4240// IteratorClose(iterator, input, output) expands to the following:
4241//
4242//   let iteratorReturn = iterator.return;
4243//   if (IS_NULL_OR_UNDEFINED(iteratorReturn)) return input;
4244//   output = %_Call(iteratorReturn, iterator, input);
4245//   if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4246
4247Expression* Parser::RewriteYieldStar(Expression* generator,
4248                                     Expression* iterable, int pos) {
4249  const int nopos = kNoSourcePosition;
4250
4251  // Forward definition for break/continue statements.
4252  WhileStatement* loop = factory()->NewWhileStatement(nullptr, nopos);
4253
4254  // let input = undefined;
4255  Variable* var_input = NewTemporary(ast_value_factory()->empty_string());
4256  Statement* initialize_input;
4257  {
4258    Expression* input_proxy = factory()->NewVariableProxy(var_input);
4259    Expression* assignment =
4260        factory()->NewAssignment(Token::ASSIGN, input_proxy,
4261                                 factory()->NewUndefinedLiteral(nopos), nopos);
4262    initialize_input = factory()->NewExpressionStatement(assignment, nopos);
4263  }
4264
4265  // let mode = kNext;
4266  Variable* var_mode = NewTemporary(ast_value_factory()->empty_string());
4267  Statement* initialize_mode;
4268  {
4269    Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
4270    Expression* knext =
4271        factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
4272    Expression* assignment =
4273        factory()->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos);
4274    initialize_mode = factory()->NewExpressionStatement(assignment, nopos);
4275  }
4276
4277  // let output = undefined;
4278  Variable* var_output = NewTemporary(ast_value_factory()->empty_string());
4279  Statement* initialize_output;
4280  {
4281    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4282    Expression* assignment =
4283        factory()->NewAssignment(Token::ASSIGN, output_proxy,
4284                                 factory()->NewUndefinedLiteral(nopos), nopos);
4285    initialize_output = factory()->NewExpressionStatement(assignment, nopos);
4286  }
4287
4288  // let iterator = GetIterator(iterable);
4289  Variable* var_iterator = NewTemporary(ast_value_factory()->empty_string());
4290  Statement* get_iterator;
4291  {
4292    Expression* iterator =
4293        factory()->NewGetIterator(iterable, IteratorType::kNormal, nopos);
4294    Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
4295    Expression* assignment = factory()->NewAssignment(
4296        Token::ASSIGN, iterator_proxy, iterator, nopos);
4297    get_iterator = factory()->NewExpressionStatement(assignment, nopos);
4298  }
4299
4300  // output = iterator.next(input);
4301  Statement* call_next;
4302  {
4303    Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
4304    Expression* literal =
4305        factory()->NewStringLiteral(ast_value_factory()->next_string(), nopos);
4306    Expression* next_property =
4307        factory()->NewProperty(iterator_proxy, literal, nopos);
4308    Expression* input_proxy = factory()->NewVariableProxy(var_input);
4309    auto args = new (zone()) ZoneList<Expression*>(1, zone());
4310    args->Add(input_proxy, zone());
4311    Expression* call = factory()->NewCall(next_property, args, nopos);
4312    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4313    Expression* assignment =
4314        factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
4315    call_next = factory()->NewExpressionStatement(assignment, nopos);
4316  }
4317
4318  // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4319  Statement* validate_next_output;
4320  {
4321    Expression* is_receiver_call;
4322    {
4323      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4324      args->Add(factory()->NewVariableProxy(var_output), zone());
4325      is_receiver_call =
4326          factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
4327    }
4328
4329    Statement* throw_call;
4330    {
4331      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4332      args->Add(factory()->NewVariableProxy(var_output), zone());
4333      Expression* call = factory()->NewCallRuntime(
4334          Runtime::kThrowIteratorResultNotAnObject, args, nopos);
4335      throw_call = factory()->NewExpressionStatement(call, nopos);
4336    }
4337
4338    validate_next_output = factory()->NewIfStatement(
4339        is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
4340        nopos);
4341  }
4342
4343  // let iteratorThrow = iterator.throw;
4344  Variable* var_throw = NewTemporary(ast_value_factory()->empty_string());
4345  Statement* get_throw;
4346  {
4347    Expression* iterator_proxy = factory()->NewVariableProxy(var_iterator);
4348    Expression* literal =
4349        factory()->NewStringLiteral(ast_value_factory()->throw_string(), nopos);
4350    Expression* property =
4351        factory()->NewProperty(iterator_proxy, literal, nopos);
4352    Expression* throw_proxy = factory()->NewVariableProxy(var_throw);
4353    Expression* assignment =
4354        factory()->NewAssignment(Token::ASSIGN, throw_proxy, property, nopos);
4355    get_throw = factory()->NewExpressionStatement(assignment, nopos);
4356  }
4357
4358  // if (IS_NULL_OR_UNDEFINED(iteratorThrow) {
4359  //   IteratorClose(iterator);
4360  //   throw MakeTypeError(kThrowMethodMissing);
4361  // }
4362  Statement* check_throw;
4363  {
4364    Expression* condition = factory()->NewCompareOperation(
4365        Token::EQ, factory()->NewVariableProxy(var_throw),
4366        factory()->NewNullLiteral(nopos), nopos);
4367    Expression* call =
4368        NewThrowTypeError(MessageTemplate::kThrowMethodMissing,
4369                          ast_value_factory()->empty_string(), nopos);
4370    Statement* throw_call = factory()->NewExpressionStatement(call, nopos);
4371
4372    Block* then = factory()->NewBlock(nullptr, 4 + 1, false, nopos);
4373    BuildIteratorCloseForCompletion(
4374        scope(), then->statements(), var_iterator,
4375        factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos),
4376        IteratorType::kNormal);
4377    then->statements()->Add(throw_call, zone());
4378    check_throw = factory()->NewIfStatement(
4379        condition, then, factory()->NewEmptyStatement(nopos), nopos);
4380  }
4381
4382  // output = %_Call(iteratorThrow, iterator, input);
4383  Statement* call_throw;
4384  {
4385    auto args = new (zone()) ZoneList<Expression*>(3, zone());
4386    args->Add(factory()->NewVariableProxy(var_throw), zone());
4387    args->Add(factory()->NewVariableProxy(var_iterator), zone());
4388    args->Add(factory()->NewVariableProxy(var_input), zone());
4389    Expression* call =
4390        factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
4391    Expression* assignment = factory()->NewAssignment(
4392        Token::ASSIGN, factory()->NewVariableProxy(var_output), call, nopos);
4393    call_throw = factory()->NewExpressionStatement(assignment, nopos);
4394  }
4395
4396  // if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4397  Statement* validate_throw_output;
4398  {
4399    Expression* is_receiver_call;
4400    {
4401      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4402      args->Add(factory()->NewVariableProxy(var_output), zone());
4403      is_receiver_call =
4404          factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
4405    }
4406
4407    Statement* throw_call;
4408    {
4409      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4410      args->Add(factory()->NewVariableProxy(var_output), zone());
4411      Expression* call = factory()->NewCallRuntime(
4412          Runtime::kThrowIteratorResultNotAnObject, args, nopos);
4413      throw_call = factory()->NewExpressionStatement(call, nopos);
4414    }
4415
4416    validate_throw_output = factory()->NewIfStatement(
4417        is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
4418        nopos);
4419  }
4420
4421  // if (output.done) break;
4422  Statement* if_done;
4423  {
4424    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4425    Expression* literal =
4426        factory()->NewStringLiteral(ast_value_factory()->done_string(), nopos);
4427    Expression* property = factory()->NewProperty(output_proxy, literal, nopos);
4428    BreakStatement* break_loop = factory()->NewBreakStatement(loop, nopos);
4429    if_done = factory()->NewIfStatement(
4430        property, break_loop, factory()->NewEmptyStatement(nopos), nopos);
4431  }
4432
4433
4434  // mode = kReturn;
4435  Statement* set_mode_return;
4436  {
4437    Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
4438    Expression* kreturn =
4439        factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
4440    Expression* assignment =
4441        factory()->NewAssignment(Token::ASSIGN, mode_proxy, kreturn, nopos);
4442    set_mode_return = factory()->NewExpressionStatement(assignment, nopos);
4443  }
4444
4445  // Yield(output);
4446  Statement* yield_output;
4447  {
4448    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4449    Yield* yield = factory()->NewYield(generator, output_proxy, nopos,
4450                                       Yield::kOnExceptionThrow);
4451    yield_output = factory()->NewExpressionStatement(yield, nopos);
4452  }
4453
4454  // mode = kNext;
4455  Statement* set_mode_next;
4456  {
4457    Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
4458    Expression* knext =
4459        factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
4460    Expression* assignment =
4461        factory()->NewAssignment(Token::ASSIGN, mode_proxy, knext, nopos);
4462    set_mode_next = factory()->NewExpressionStatement(assignment, nopos);
4463  }
4464
4465  // mode = kThrow;
4466  Statement* set_mode_throw;
4467  {
4468    Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
4469    Expression* kthrow =
4470        factory()->NewSmiLiteral(JSGeneratorObject::kThrow, nopos);
4471    Expression* assignment =
4472        factory()->NewAssignment(Token::ASSIGN, mode_proxy, kthrow, nopos);
4473    set_mode_throw = factory()->NewExpressionStatement(assignment, nopos);
4474  }
4475
4476  // input = function.sent;
4477  Statement* get_input;
4478  {
4479    Expression* function_sent = FunctionSentExpression(nopos);
4480    Expression* input_proxy = factory()->NewVariableProxy(var_input);
4481    Expression* assignment = factory()->NewAssignment(
4482        Token::ASSIGN, input_proxy, function_sent, nopos);
4483    get_input = factory()->NewExpressionStatement(assignment, nopos);
4484  }
4485
4486  // if (mode === kReturn) {
4487  //   return {value: output.value, done: true};
4488  // }
4489  Statement* maybe_return_value;
4490  {
4491    Expression* mode_proxy = factory()->NewVariableProxy(var_mode);
4492    Expression* kreturn =
4493        factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
4494    Expression* condition = factory()->NewCompareOperation(
4495        Token::EQ_STRICT, mode_proxy, kreturn, nopos);
4496
4497    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4498    Expression* literal =
4499        factory()->NewStringLiteral(ast_value_factory()->value_string(), nopos);
4500    Expression* property = factory()->NewProperty(output_proxy, literal, nopos);
4501    Statement* return_value = factory()->NewReturnStatement(
4502        BuildIteratorResult(property, true), nopos);
4503
4504    maybe_return_value = factory()->NewIfStatement(
4505        condition, return_value, factory()->NewEmptyStatement(nopos), nopos);
4506  }
4507
4508  // output.value
4509  Statement* get_value;
4510  {
4511    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4512    Expression* literal =
4513        factory()->NewStringLiteral(ast_value_factory()->value_string(), nopos);
4514    Expression* property = factory()->NewProperty(output_proxy, literal, nopos);
4515    get_value = factory()->NewExpressionStatement(property, nopos);
4516  }
4517
4518  // Now put things together.
4519
4520  // try { ... } catch(e) { ... }
4521  Statement* try_catch;
4522  {
4523    Block* try_block = factory()->NewBlock(nullptr, 2, false, nopos);
4524    try_block->statements()->Add(yield_output, zone());
4525    try_block->statements()->Add(set_mode_next, zone());
4526
4527    Block* catch_block = factory()->NewBlock(nullptr, 1, false, nopos);
4528    catch_block->statements()->Add(set_mode_throw, zone());
4529
4530    Scope* catch_scope = NewScope(CATCH_SCOPE);
4531    catch_scope->set_is_hidden();
4532    const AstRawString* name = ast_value_factory()->dot_catch_string();
4533    Variable* catch_variable = catch_scope->DeclareLocal(name, VAR);
4534
4535    try_catch = factory()->NewTryCatchStatementForDesugaring(
4536        try_block, catch_scope, catch_variable, catch_block, nopos);
4537  }
4538
4539  // try { ... } finally { ... }
4540  Statement* try_finally;
4541  {
4542    Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
4543    try_block->statements()->Add(try_catch, zone());
4544
4545    Block* finally = factory()->NewBlock(nullptr, 2, false, nopos);
4546    finally->statements()->Add(get_input, zone());
4547    finally->statements()->Add(factory()->NewContinueStatement(loop, nopos),
4548                               zone());
4549
4550    try_finally = factory()->NewTryFinallyStatement(try_block, finally, nopos);
4551  }
4552
4553  // switch (mode) { ... }
4554  SwitchStatement* switch_mode = factory()->NewSwitchStatement(nullptr, nopos);
4555  {
4556    auto case_next = new (zone()) ZoneList<Statement*>(3, zone());
4557    case_next->Add(call_next, zone());
4558    case_next->Add(validate_next_output, zone());
4559    case_next->Add(factory()->NewBreakStatement(switch_mode, nopos), zone());
4560
4561    auto case_return = new (zone()) ZoneList<Statement*>(5, zone());
4562    BuildIteratorClose(case_return, var_iterator, var_input, var_output);
4563    case_return->Add(factory()->NewBreakStatement(switch_mode, nopos), zone());
4564
4565    auto case_throw = new (zone()) ZoneList<Statement*>(5, zone());
4566    case_throw->Add(get_throw, zone());
4567    case_throw->Add(check_throw, zone());
4568    case_throw->Add(call_throw, zone());
4569    case_throw->Add(validate_throw_output, zone());
4570    case_throw->Add(factory()->NewBreakStatement(switch_mode, nopos), zone());
4571
4572    auto cases = new (zone()) ZoneList<CaseClause*>(3, zone());
4573    Expression* knext =
4574        factory()->NewSmiLiteral(JSGeneratorObject::kNext, nopos);
4575    Expression* kreturn =
4576        factory()->NewSmiLiteral(JSGeneratorObject::kReturn, nopos);
4577    Expression* kthrow =
4578        factory()->NewSmiLiteral(JSGeneratorObject::kThrow, nopos);
4579    cases->Add(factory()->NewCaseClause(knext, case_next, nopos), zone());
4580    cases->Add(factory()->NewCaseClause(kreturn, case_return, nopos), zone());
4581    cases->Add(factory()->NewCaseClause(kthrow, case_throw, nopos), zone());
4582
4583    switch_mode->Initialize(factory()->NewVariableProxy(var_mode), cases);
4584  }
4585
4586  // while (true) { ... }
4587  // Already defined earlier: WhileStatement* loop = ...
4588  {
4589    Block* loop_body = factory()->NewBlock(nullptr, 4, false, nopos);
4590    loop_body->statements()->Add(switch_mode, zone());
4591    loop_body->statements()->Add(if_done, zone());
4592    loop_body->statements()->Add(set_mode_return, zone());
4593    loop_body->statements()->Add(try_finally, zone());
4594
4595    loop->Initialize(factory()->NewBooleanLiteral(true, nopos), loop_body);
4596  }
4597
4598  // do { ... }
4599  DoExpression* yield_star;
4600  {
4601    // The rewriter needs to process the get_value statement only, hence we
4602    // put the preceding statements into an init block.
4603
4604    Block* do_block_ = factory()->NewBlock(nullptr, 6, true, nopos);
4605    do_block_->statements()->Add(initialize_input, zone());
4606    do_block_->statements()->Add(initialize_mode, zone());
4607    do_block_->statements()->Add(initialize_output, zone());
4608    do_block_->statements()->Add(get_iterator, zone());
4609    do_block_->statements()->Add(loop, zone());
4610    do_block_->statements()->Add(maybe_return_value, zone());
4611
4612    Block* do_block = factory()->NewBlock(nullptr, 2, false, nopos);
4613    do_block->statements()->Add(do_block_, zone());
4614    do_block->statements()->Add(get_value, zone());
4615
4616    Variable* dot_result =
4617        NewTemporary(ast_value_factory()->dot_result_string());
4618    yield_star = factory()->NewDoExpression(do_block, dot_result, nopos);
4619    Rewriter::Rewrite(this, GetClosureScope(), yield_star, ast_value_factory());
4620  }
4621
4622  return yield_star;
4623}
4624
4625Statement* Parser::CheckCallable(Variable* var, Expression* error, int pos) {
4626  const int nopos = kNoSourcePosition;
4627  Statement* validate_var;
4628  {
4629    Expression* type_of = factory()->NewUnaryOperation(
4630        Token::TYPEOF, factory()->NewVariableProxy(var), nopos);
4631    Expression* function_literal = factory()->NewStringLiteral(
4632        ast_value_factory()->function_string(), nopos);
4633    Expression* condition = factory()->NewCompareOperation(
4634        Token::EQ_STRICT, type_of, function_literal, nopos);
4635
4636    Statement* throw_call = factory()->NewExpressionStatement(error, pos);
4637
4638    validate_var = factory()->NewIfStatement(
4639        condition, factory()->NewEmptyStatement(nopos), throw_call, nopos);
4640  }
4641  return validate_var;
4642}
4643
4644void Parser::BuildIteratorClose(ZoneList<Statement*>* statements,
4645                                Variable* iterator, Variable* input,
4646                                Variable* var_output) {
4647  //
4648  // This function adds four statements to [statements], corresponding to the
4649  // following code:
4650  //
4651  //   let iteratorReturn = iterator.return;
4652  //   if (IS_NULL_OR_UNDEFINED(iteratorReturn) {
4653  //     return {value: input, done: true};
4654  //   }
4655  //   output = %_Call(iteratorReturn, iterator, input);
4656  //   if (!IS_RECEIVER(output)) %ThrowIterResultNotAnObject(output);
4657  //
4658
4659  const int nopos = kNoSourcePosition;
4660
4661  // let iteratorReturn = iterator.return;
4662  Variable* var_return = var_output;  // Reusing the output variable.
4663  Statement* get_return;
4664  {
4665    Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
4666    Expression* literal = factory()->NewStringLiteral(
4667        ast_value_factory()->return_string(), nopos);
4668    Expression* property =
4669        factory()->NewProperty(iterator_proxy, literal, nopos);
4670    Expression* return_proxy = factory()->NewVariableProxy(var_return);
4671    Expression* assignment =
4672        factory()->NewAssignment(Token::ASSIGN, return_proxy, property, nopos);
4673    get_return = factory()->NewExpressionStatement(assignment, nopos);
4674  }
4675
4676  // if (IS_NULL_OR_UNDEFINED(iteratorReturn) {
4677  //   return {value: input, done: true};
4678  // }
4679  Statement* check_return;
4680  {
4681    Expression* condition = factory()->NewCompareOperation(
4682        Token::EQ, factory()->NewVariableProxy(var_return),
4683        factory()->NewNullLiteral(nopos), nopos);
4684
4685    Expression* value = factory()->NewVariableProxy(input);
4686
4687    Statement* return_input =
4688        factory()->NewReturnStatement(BuildIteratorResult(value, true), nopos);
4689
4690    check_return = factory()->NewIfStatement(
4691        condition, return_input, factory()->NewEmptyStatement(nopos), nopos);
4692  }
4693
4694  // output = %_Call(iteratorReturn, iterator, input);
4695  Statement* call_return;
4696  {
4697    auto args = new (zone()) ZoneList<Expression*>(3, zone());
4698    args->Add(factory()->NewVariableProxy(var_return), zone());
4699    args->Add(factory()->NewVariableProxy(iterator), zone());
4700    args->Add(factory()->NewVariableProxy(input), zone());
4701
4702    Expression* call =
4703        factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
4704    Expression* output_proxy = factory()->NewVariableProxy(var_output);
4705    Expression* assignment =
4706        factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
4707    call_return = factory()->NewExpressionStatement(assignment, nopos);
4708  }
4709
4710  // if (!IS_RECEIVER(output)) %ThrowIteratorResultNotAnObject(output);
4711  Statement* validate_output;
4712  {
4713    Expression* is_receiver_call;
4714    {
4715      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4716      args->Add(factory()->NewVariableProxy(var_output), zone());
4717      is_receiver_call =
4718          factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
4719    }
4720
4721    Statement* throw_call;
4722    {
4723      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4724      args->Add(factory()->NewVariableProxy(var_output), zone());
4725      Expression* call = factory()->NewCallRuntime(
4726          Runtime::kThrowIteratorResultNotAnObject, args, nopos);
4727      throw_call = factory()->NewExpressionStatement(call, nopos);
4728    }
4729
4730    validate_output = factory()->NewIfStatement(
4731        is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
4732        nopos);
4733  }
4734
4735  statements->Add(get_return, zone());
4736  statements->Add(check_return, zone());
4737  statements->Add(call_return, zone());
4738  statements->Add(validate_output, zone());
4739}
4740
4741void Parser::FinalizeIteratorUse(Scope* use_scope, Variable* completion,
4742                                 Expression* condition, Variable* iter,
4743                                 Block* iterator_use, Block* target,
4744                                 IteratorType type) {
4745  //
4746  // This function adds two statements to [target], corresponding to the
4747  // following code:
4748  //
4749  //   completion = kNormalCompletion;
4750  //   try {
4751  //     try {
4752  //       iterator_use
4753  //     } catch(e) {
4754  //       if (completion === kAbruptCompletion) completion = kThrowCompletion;
4755  //       %ReThrow(e);
4756  //     }
4757  //   } finally {
4758  //     if (condition) {
4759  //       #BuildIteratorCloseForCompletion(iter, completion)
4760  //     }
4761  //   }
4762  //
4763
4764  const int nopos = kNoSourcePosition;
4765
4766  // completion = kNormalCompletion;
4767  Statement* initialize_completion;
4768  {
4769    Expression* proxy = factory()->NewVariableProxy(completion);
4770    Expression* assignment = factory()->NewAssignment(
4771        Token::ASSIGN, proxy,
4772        factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
4773    initialize_completion =
4774        factory()->NewExpressionStatement(assignment, nopos);
4775  }
4776
4777  // if (completion === kAbruptCompletion) completion = kThrowCompletion;
4778  Statement* set_completion_throw;
4779  {
4780    Expression* condition = factory()->NewCompareOperation(
4781        Token::EQ_STRICT, factory()->NewVariableProxy(completion),
4782        factory()->NewSmiLiteral(Parser::kAbruptCompletion, nopos), nopos);
4783
4784    Expression* proxy = factory()->NewVariableProxy(completion);
4785    Expression* assignment = factory()->NewAssignment(
4786        Token::ASSIGN, proxy,
4787        factory()->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
4788    Statement* statement = factory()->NewExpressionStatement(assignment, nopos);
4789    set_completion_throw = factory()->NewIfStatement(
4790        condition, statement, factory()->NewEmptyStatement(nopos), nopos);
4791  }
4792
4793  // if (condition) {
4794  //   #BuildIteratorCloseForCompletion(iter, completion)
4795  // }
4796  Block* maybe_close;
4797  {
4798    Block* block = factory()->NewBlock(nullptr, 2, true, nopos);
4799    Expression* proxy = factory()->NewVariableProxy(completion);
4800    BuildIteratorCloseForCompletion(use_scope, block->statements(), iter, proxy,
4801                                    type);
4802    DCHECK(block->statements()->length() == 2);
4803
4804    maybe_close = factory()->NewBlock(nullptr, 1, true, nopos);
4805    maybe_close->statements()->Add(
4806        factory()->NewIfStatement(condition, block,
4807                                  factory()->NewEmptyStatement(nopos), nopos),
4808        zone());
4809  }
4810
4811  // try { #try_block }
4812  // catch(e) {
4813  //   #set_completion_throw;
4814  //   %ReThrow(e);
4815  // }
4816  Statement* try_catch;
4817  {
4818    Scope* catch_scope = NewScopeWithParent(use_scope, CATCH_SCOPE);
4819    Variable* catch_variable =
4820        catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR);
4821    catch_scope->set_is_hidden();
4822
4823    Statement* rethrow;
4824    // We use %ReThrow rather than the ordinary throw because we want to
4825    // preserve the original exception message.  This is also why we create a
4826    // TryCatchStatementForReThrow below (which does not clear the pending
4827    // message), rather than a TryCatchStatement.
4828    {
4829      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4830      args->Add(factory()->NewVariableProxy(catch_variable), zone());
4831      rethrow = factory()->NewExpressionStatement(
4832          factory()->NewCallRuntime(Runtime::kReThrow, args, nopos), nopos);
4833    }
4834
4835    Block* catch_block = factory()->NewBlock(nullptr, 2, false, nopos);
4836    catch_block->statements()->Add(set_completion_throw, zone());
4837    catch_block->statements()->Add(rethrow, zone());
4838
4839    try_catch = factory()->NewTryCatchStatementForReThrow(
4840        iterator_use, catch_scope, catch_variable, catch_block, nopos);
4841  }
4842
4843  // try { #try_catch } finally { #maybe_close }
4844  Statement* try_finally;
4845  {
4846    Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
4847    try_block->statements()->Add(try_catch, zone());
4848
4849    try_finally =
4850        factory()->NewTryFinallyStatement(try_block, maybe_close, nopos);
4851  }
4852
4853  target->statements()->Add(initialize_completion, zone());
4854  target->statements()->Add(try_finally, zone());
4855}
4856
4857void Parser::BuildIteratorCloseForCompletion(Scope* scope,
4858                                             ZoneList<Statement*>* statements,
4859                                             Variable* iterator,
4860                                             Expression* completion,
4861                                             IteratorType type) {
4862  //
4863  // This function adds two statements to [statements], corresponding to the
4864  // following code:
4865  //
4866  //   let iteratorReturn = iterator.return;
4867  //   if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) {
4868  //     if (completion === kThrowCompletion) {
4869  //       if (!IS_CALLABLE(iteratorReturn)) {
4870  //         throw MakeTypeError(kReturnMethodNotCallable);
4871  //       }
4872  //       [if (IteratorType == kAsync)]
4873  //           try { Await(%_Call(iteratorReturn, iterator) } catch (_) { }
4874  //       [else]
4875  //           try { %_Call(iteratorReturn, iterator) } catch (_) { }
4876  //       [endif]
4877  //     } else {
4878  //       [if (IteratorType == kAsync)]
4879  //           let output = Await(%_Call(iteratorReturn, iterator));
4880  //       [else]
4881  //           let output = %_Call(iteratorReturn, iterator);
4882  //       [endif]
4883  //       if (!IS_RECEIVER(output)) {
4884  //         %ThrowIterResultNotAnObject(output);
4885  //       }
4886  //     }
4887  //   }
4888  //
4889
4890  const int nopos = kNoSourcePosition;
4891  // let iteratorReturn = iterator.return;
4892  Variable* var_return = NewTemporary(ast_value_factory()->empty_string());
4893  Statement* get_return;
4894  {
4895    Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
4896    Expression* literal = factory()->NewStringLiteral(
4897        ast_value_factory()->return_string(), nopos);
4898    Expression* property =
4899        factory()->NewProperty(iterator_proxy, literal, nopos);
4900    Expression* return_proxy = factory()->NewVariableProxy(var_return);
4901    Expression* assignment =
4902        factory()->NewAssignment(Token::ASSIGN, return_proxy, property, nopos);
4903    get_return = factory()->NewExpressionStatement(assignment, nopos);
4904  }
4905
4906  // if (!IS_CALLABLE(iteratorReturn)) {
4907  //   throw MakeTypeError(kReturnMethodNotCallable);
4908  // }
4909  Statement* check_return_callable;
4910  {
4911    Expression* throw_expr =
4912        NewThrowTypeError(MessageTemplate::kReturnMethodNotCallable,
4913                          ast_value_factory()->empty_string(), nopos);
4914    check_return_callable = CheckCallable(var_return, throw_expr, nopos);
4915  }
4916
4917  // try { %_Call(iteratorReturn, iterator) } catch (_) { }
4918  Statement* try_call_return;
4919  {
4920    auto args = new (zone()) ZoneList<Expression*>(2, zone());
4921    args->Add(factory()->NewVariableProxy(var_return), zone());
4922    args->Add(factory()->NewVariableProxy(iterator), zone());
4923
4924    Expression* call =
4925        factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
4926
4927    if (type == IteratorType::kAsync) {
4928      call = RewriteAwaitExpression(call, nopos);
4929    }
4930
4931    Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
4932    try_block->statements()->Add(factory()->NewExpressionStatement(call, nopos),
4933                                 zone());
4934
4935    Block* catch_block = factory()->NewBlock(nullptr, 0, false, nopos);
4936
4937    Scope* catch_scope = NewScopeWithParent(scope, CATCH_SCOPE);
4938    Variable* catch_variable =
4939        catch_scope->DeclareLocal(ast_value_factory()->dot_catch_string(), VAR);
4940    catch_scope->set_is_hidden();
4941
4942    try_call_return = factory()->NewTryCatchStatement(
4943        try_block, catch_scope, catch_variable, catch_block, nopos);
4944  }
4945
4946  // let output = %_Call(iteratorReturn, iterator);
4947  // if (!IS_RECEIVER(output)) {
4948  //   %ThrowIteratorResultNotAnObject(output);
4949  // }
4950  Block* validate_return;
4951  {
4952    Variable* var_output = NewTemporary(ast_value_factory()->empty_string());
4953    Statement* call_return;
4954    {
4955      auto args = new (zone()) ZoneList<Expression*>(2, zone());
4956      args->Add(factory()->NewVariableProxy(var_return), zone());
4957      args->Add(factory()->NewVariableProxy(iterator), zone());
4958      Expression* call =
4959          factory()->NewCallRuntime(Runtime::kInlineCall, args, nopos);
4960      if (type == IteratorType::kAsync) {
4961        call = RewriteAwaitExpression(call, nopos);
4962      }
4963
4964      Expression* output_proxy = factory()->NewVariableProxy(var_output);
4965      Expression* assignment =
4966          factory()->NewAssignment(Token::ASSIGN, output_proxy, call, nopos);
4967      call_return = factory()->NewExpressionStatement(assignment, nopos);
4968    }
4969
4970    Expression* is_receiver_call;
4971    {
4972      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4973      args->Add(factory()->NewVariableProxy(var_output), zone());
4974      is_receiver_call =
4975          factory()->NewCallRuntime(Runtime::kInlineIsJSReceiver, args, nopos);
4976    }
4977
4978    Statement* throw_call;
4979    {
4980      auto args = new (zone()) ZoneList<Expression*>(1, zone());
4981      args->Add(factory()->NewVariableProxy(var_output), zone());
4982      Expression* call = factory()->NewCallRuntime(
4983          Runtime::kThrowIteratorResultNotAnObject, args, nopos);
4984      throw_call = factory()->NewExpressionStatement(call, nopos);
4985    }
4986
4987    Statement* check_return = factory()->NewIfStatement(
4988        is_receiver_call, factory()->NewEmptyStatement(nopos), throw_call,
4989        nopos);
4990
4991    validate_return = factory()->NewBlock(nullptr, 2, false, nopos);
4992    validate_return->statements()->Add(call_return, zone());
4993    validate_return->statements()->Add(check_return, zone());
4994  }
4995
4996  // if (completion === kThrowCompletion) {
4997  //   #check_return_callable;
4998  //   #try_call_return;
4999  // } else {
5000  //   #validate_return;
5001  // }
5002  Statement* call_return_carefully;
5003  {
5004    Expression* condition = factory()->NewCompareOperation(
5005        Token::EQ_STRICT, completion,
5006        factory()->NewSmiLiteral(Parser::kThrowCompletion, nopos), nopos);
5007
5008    Block* then_block = factory()->NewBlock(nullptr, 2, false, nopos);
5009    then_block->statements()->Add(check_return_callable, zone());
5010    then_block->statements()->Add(try_call_return, zone());
5011
5012    call_return_carefully = factory()->NewIfStatement(condition, then_block,
5013                                                      validate_return, nopos);
5014  }
5015
5016  // if (!IS_NULL_OR_UNDEFINED(iteratorReturn)) { ... }
5017  Statement* maybe_call_return;
5018  {
5019    Expression* condition = factory()->NewCompareOperation(
5020        Token::EQ, factory()->NewVariableProxy(var_return),
5021        factory()->NewNullLiteral(nopos), nopos);
5022
5023    maybe_call_return = factory()->NewIfStatement(
5024        condition, factory()->NewEmptyStatement(nopos), call_return_carefully,
5025        nopos);
5026  }
5027
5028  statements->Add(get_return, zone());
5029  statements->Add(maybe_call_return, zone());
5030}
5031
5032Statement* Parser::FinalizeForOfStatement(ForOfStatement* loop,
5033                                          Variable* var_completion,
5034                                          IteratorType type, int pos) {
5035  //
5036  // This function replaces the loop with the following wrapping:
5037  //
5038  //   completion = kNormalCompletion;
5039  //   try {
5040  //     try {
5041  //       #loop;
5042  //     } catch(e) {
5043  //       if (completion === kAbruptCompletion) completion = kThrowCompletion;
5044  //       %ReThrow(e);
5045  //     }
5046  //   } finally {
5047  //     if (!(completion === kNormalCompletion)) {
5048  //       #BuildIteratorCloseForCompletion(#iterator, completion)
5049  //     }
5050  //   }
5051  //
5052  // Note that the loop's body and its assign_each already contain appropriate
5053  // assignments to completion (see InitializeForOfStatement).
5054  //
5055
5056  const int nopos = kNoSourcePosition;
5057
5058  // !(completion === kNormalCompletion)
5059  Expression* closing_condition;
5060  {
5061    Expression* cmp = factory()->NewCompareOperation(
5062        Token::EQ_STRICT, factory()->NewVariableProxy(var_completion),
5063        factory()->NewSmiLiteral(Parser::kNormalCompletion, nopos), nopos);
5064    closing_condition = factory()->NewUnaryOperation(Token::NOT, cmp, nopos);
5065  }
5066
5067  Block* final_loop = factory()->NewBlock(nullptr, 2, false, nopos);
5068  {
5069    Block* try_block = factory()->NewBlock(nullptr, 1, false, nopos);
5070    try_block->statements()->Add(loop, zone());
5071
5072    // The scope in which the parser creates this loop.
5073    Scope* loop_scope = scope()->outer_scope();
5074    DCHECK_EQ(loop_scope->scope_type(), BLOCK_SCOPE);
5075    DCHECK_EQ(scope()->scope_type(), BLOCK_SCOPE);
5076
5077    FinalizeIteratorUse(loop_scope, var_completion, closing_condition,
5078                        loop->iterator(), try_block, final_loop, type);
5079  }
5080
5081  return final_loop;
5082}
5083
5084#undef CHECK_OK
5085#undef CHECK_OK_VOID
5086#undef CHECK_FAILED
5087
5088}  // namespace internal
5089}  // namespace v8
5090