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/v8.h"
6
7#include "src/api.h"
8#include "src/ast.h"
9#include "src/bootstrapper.h"
10#include "src/char-predicates-inl.h"
11#include "src/codegen.h"
12#include "src/compiler.h"
13#include "src/messages.h"
14#include "src/parser.h"
15#include "src/platform.h"
16#include "src/preparser.h"
17#include "src/runtime.h"
18#include "src/scanner-character-streams.h"
19#include "src/scopeinfo.h"
20#include "src/string-stream.h"
21
22namespace v8 {
23namespace internal {
24
25RegExpBuilder::RegExpBuilder(Zone* zone)
26    : zone_(zone),
27      pending_empty_(false),
28      characters_(NULL),
29      terms_(),
30      alternatives_()
31#ifdef DEBUG
32    , last_added_(ADD_NONE)
33#endif
34  {}
35
36
37void RegExpBuilder::FlushCharacters() {
38  pending_empty_ = false;
39  if (characters_ != NULL) {
40    RegExpTree* atom = new(zone()) RegExpAtom(characters_->ToConstVector());
41    characters_ = NULL;
42    text_.Add(atom, zone());
43    LAST(ADD_ATOM);
44  }
45}
46
47
48void RegExpBuilder::FlushText() {
49  FlushCharacters();
50  int num_text = text_.length();
51  if (num_text == 0) {
52    return;
53  } else if (num_text == 1) {
54    terms_.Add(text_.last(), zone());
55  } else {
56    RegExpText* text = new(zone()) RegExpText(zone());
57    for (int i = 0; i < num_text; i++)
58      text_.Get(i)->AppendToText(text, zone());
59    terms_.Add(text, zone());
60  }
61  text_.Clear();
62}
63
64
65void RegExpBuilder::AddCharacter(uc16 c) {
66  pending_empty_ = false;
67  if (characters_ == NULL) {
68    characters_ = new(zone()) ZoneList<uc16>(4, zone());
69  }
70  characters_->Add(c, zone());
71  LAST(ADD_CHAR);
72}
73
74
75void RegExpBuilder::AddEmpty() {
76  pending_empty_ = true;
77}
78
79
80void RegExpBuilder::AddAtom(RegExpTree* term) {
81  if (term->IsEmpty()) {
82    AddEmpty();
83    return;
84  }
85  if (term->IsTextElement()) {
86    FlushCharacters();
87    text_.Add(term, zone());
88  } else {
89    FlushText();
90    terms_.Add(term, zone());
91  }
92  LAST(ADD_ATOM);
93}
94
95
96void RegExpBuilder::AddAssertion(RegExpTree* assert) {
97  FlushText();
98  terms_.Add(assert, zone());
99  LAST(ADD_ASSERT);
100}
101
102
103void RegExpBuilder::NewAlternative() {
104  FlushTerms();
105}
106
107
108void RegExpBuilder::FlushTerms() {
109  FlushText();
110  int num_terms = terms_.length();
111  RegExpTree* alternative;
112  if (num_terms == 0) {
113    alternative = RegExpEmpty::GetInstance();
114  } else if (num_terms == 1) {
115    alternative = terms_.last();
116  } else {
117    alternative = new(zone()) RegExpAlternative(terms_.GetList(zone()));
118  }
119  alternatives_.Add(alternative, zone());
120  terms_.Clear();
121  LAST(ADD_NONE);
122}
123
124
125RegExpTree* RegExpBuilder::ToRegExp() {
126  FlushTerms();
127  int num_alternatives = alternatives_.length();
128  if (num_alternatives == 0) {
129    return RegExpEmpty::GetInstance();
130  }
131  if (num_alternatives == 1) {
132    return alternatives_.last();
133  }
134  return new(zone()) RegExpDisjunction(alternatives_.GetList(zone()));
135}
136
137
138void RegExpBuilder::AddQuantifierToAtom(
139    int min, int max, RegExpQuantifier::QuantifierType quantifier_type) {
140  if (pending_empty_) {
141    pending_empty_ = false;
142    return;
143  }
144  RegExpTree* atom;
145  if (characters_ != NULL) {
146    ASSERT(last_added_ == ADD_CHAR);
147    // Last atom was character.
148    Vector<const uc16> char_vector = characters_->ToConstVector();
149    int num_chars = char_vector.length();
150    if (num_chars > 1) {
151      Vector<const uc16> prefix = char_vector.SubVector(0, num_chars - 1);
152      text_.Add(new(zone()) RegExpAtom(prefix), zone());
153      char_vector = char_vector.SubVector(num_chars - 1, num_chars);
154    }
155    characters_ = NULL;
156    atom = new(zone()) RegExpAtom(char_vector);
157    FlushText();
158  } else if (text_.length() > 0) {
159    ASSERT(last_added_ == ADD_ATOM);
160    atom = text_.RemoveLast();
161    FlushText();
162  } else if (terms_.length() > 0) {
163    ASSERT(last_added_ == ADD_ATOM);
164    atom = terms_.RemoveLast();
165    if (atom->max_match() == 0) {
166      // Guaranteed to only match an empty string.
167      LAST(ADD_TERM);
168      if (min == 0) {
169        return;
170      }
171      terms_.Add(atom, zone());
172      return;
173    }
174  } else {
175    // Only call immediately after adding an atom or character!
176    UNREACHABLE();
177    return;
178  }
179  terms_.Add(
180      new(zone()) RegExpQuantifier(min, max, quantifier_type, atom), zone());
181  LAST(ADD_TERM);
182}
183
184
185ScriptData* ScriptData::New(const char* data, int length) {
186  // The length is obviously invalid.
187  if (length % sizeof(unsigned) != 0) {
188    return NULL;
189  }
190
191  int deserialized_data_length = length / sizeof(unsigned);
192  unsigned* deserialized_data;
193  bool owns_store = reinterpret_cast<intptr_t>(data) % sizeof(unsigned) != 0;
194  if (owns_store) {
195    // Copy the data to align it.
196    deserialized_data = i::NewArray<unsigned>(deserialized_data_length);
197    i::CopyBytes(reinterpret_cast<char*>(deserialized_data),
198                 data, static_cast<size_t>(length));
199  } else {
200    // If aligned, don't create a copy of the data.
201    deserialized_data = reinterpret_cast<unsigned*>(const_cast<char*>(data));
202  }
203  return new ScriptData(
204      Vector<unsigned>(deserialized_data, deserialized_data_length),
205      owns_store);
206}
207
208
209FunctionEntry ScriptData::GetFunctionEntry(int start) {
210  // The current pre-data entry must be a FunctionEntry with the given
211  // start position.
212  if ((function_index_ + FunctionEntry::kSize <= store_.length())
213      && (static_cast<int>(store_[function_index_]) == start)) {
214    int index = function_index_;
215    function_index_ += FunctionEntry::kSize;
216    return FunctionEntry(store_.SubVector(index,
217                                          index + FunctionEntry::kSize));
218  }
219  return FunctionEntry();
220}
221
222
223int ScriptData::GetSymbolIdentifier() {
224  return ReadNumber(&symbol_data_);
225}
226
227
228bool ScriptData::SanityCheck() {
229  // Check that the header data is valid and doesn't specify
230  // point to positions outside the store.
231  if (store_.length() < PreparseDataConstants::kHeaderSize) return false;
232  if (magic() != PreparseDataConstants::kMagicNumber) return false;
233  if (version() != PreparseDataConstants::kCurrentVersion) return false;
234  if (has_error()) {
235    // Extra sane sanity check for error message encoding.
236    if (store_.length() <= PreparseDataConstants::kHeaderSize
237                         + PreparseDataConstants::kMessageTextPos) {
238      return false;
239    }
240    if (Read(PreparseDataConstants::kMessageStartPos) >
241        Read(PreparseDataConstants::kMessageEndPos)) {
242      return false;
243    }
244    unsigned arg_count = Read(PreparseDataConstants::kMessageArgCountPos);
245    int pos = PreparseDataConstants::kMessageTextPos;
246    for (unsigned int i = 0; i <= arg_count; i++) {
247      if (store_.length() <= PreparseDataConstants::kHeaderSize + pos) {
248        return false;
249      }
250      int length = static_cast<int>(Read(pos));
251      if (length < 0) return false;
252      pos += 1 + length;
253    }
254    if (store_.length() < PreparseDataConstants::kHeaderSize + pos) {
255      return false;
256    }
257    return true;
258  }
259  // Check that the space allocated for function entries is sane.
260  int functions_size =
261      static_cast<int>(store_[PreparseDataConstants::kFunctionsSizeOffset]);
262  if (functions_size < 0) return false;
263  if (functions_size % FunctionEntry::kSize != 0) return false;
264  // Check that the total size has room for header and function entries.
265  int minimum_size =
266      PreparseDataConstants::kHeaderSize + functions_size;
267  if (store_.length() < minimum_size) return false;
268  return true;
269}
270
271
272
273const char* ScriptData::ReadString(unsigned* start, int* chars) {
274  int length = start[0];
275  char* result = NewArray<char>(length + 1);
276  for (int i = 0; i < length; i++) {
277    result[i] = start[i + 1];
278  }
279  result[length] = '\0';
280  if (chars != NULL) *chars = length;
281  return result;
282}
283
284
285Scanner::Location ScriptData::MessageLocation() const {
286  int beg_pos = Read(PreparseDataConstants::kMessageStartPos);
287  int end_pos = Read(PreparseDataConstants::kMessageEndPos);
288  return Scanner::Location(beg_pos, end_pos);
289}
290
291
292bool ScriptData::IsReferenceError() const {
293  return Read(PreparseDataConstants::kIsReferenceErrorPos);
294}
295
296
297const char* ScriptData::BuildMessage() const {
298  unsigned* start = ReadAddress(PreparseDataConstants::kMessageTextPos);
299  return ReadString(start, NULL);
300}
301
302
303const char* ScriptData::BuildArg() const {
304  int arg_count = Read(PreparseDataConstants::kMessageArgCountPos);
305  ASSERT(arg_count == 0 || arg_count == 1);
306  if (arg_count == 0) {
307    return NULL;
308  }
309  // Position after text found by skipping past length field and
310  // length field content words.
311  int pos = PreparseDataConstants::kMessageTextPos + 1
312      + Read(PreparseDataConstants::kMessageTextPos);
313  int count = 0;
314  return ReadString(ReadAddress(pos), &count);
315}
316
317
318unsigned ScriptData::Read(int position) const {
319  return store_[PreparseDataConstants::kHeaderSize + position];
320}
321
322
323unsigned* ScriptData::ReadAddress(int position) const {
324  return &store_[PreparseDataConstants::kHeaderSize + position];
325}
326
327
328Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) {
329  Scope* result = new(zone()) Scope(parent, scope_type, zone());
330  result->Initialize();
331  return result;
332}
333
334
335// ----------------------------------------------------------------------------
336// Target is a support class to facilitate manipulation of the
337// Parser's target_stack_ (the stack of potential 'break' and
338// 'continue' statement targets). Upon construction, a new target is
339// added; it is removed upon destruction.
340
341class Target BASE_EMBEDDED {
342 public:
343  Target(Target** variable, AstNode* node)
344      : variable_(variable), node_(node), previous_(*variable) {
345    *variable = this;
346  }
347
348  ~Target() {
349    *variable_ = previous_;
350  }
351
352  Target* previous() { return previous_; }
353  AstNode* node() { return node_; }
354
355 private:
356  Target** variable_;
357  AstNode* node_;
358  Target* previous_;
359};
360
361
362class TargetScope BASE_EMBEDDED {
363 public:
364  explicit TargetScope(Target** variable)
365      : variable_(variable), previous_(*variable) {
366    *variable = NULL;
367  }
368
369  ~TargetScope() {
370    *variable_ = previous_;
371  }
372
373 private:
374  Target** variable_;
375  Target* previous_;
376};
377
378
379// ----------------------------------------------------------------------------
380// The CHECK_OK macro is a convenient macro to enforce error
381// handling for functions that may fail (by returning !*ok).
382//
383// CAUTION: This macro appends extra statements after a call,
384// thus it must never be used where only a single statement
385// is correct (e.g. an if statement branch w/o braces)!
386
387#define CHECK_OK  ok);   \
388  if (!*ok) return NULL; \
389  ((void)0
390#define DUMMY )  // to make indentation work
391#undef DUMMY
392
393#define CHECK_FAILED  /**/);   \
394  if (failed_) return NULL; \
395  ((void)0
396#define DUMMY )  // to make indentation work
397#undef DUMMY
398
399// ----------------------------------------------------------------------------
400// Implementation of Parser
401
402bool ParserTraits::IsEvalOrArguments(Handle<String> identifier) const {
403  Factory* factory = parser_->isolate()->factory();
404  return identifier.is_identical_to(factory->eval_string())
405      || identifier.is_identical_to(factory->arguments_string());
406}
407
408
409bool ParserTraits::IsThisProperty(Expression* expression) {
410  ASSERT(expression != NULL);
411  Property* property = expression->AsProperty();
412  return property != NULL &&
413      property->obj()->AsVariableProxy() != NULL &&
414      property->obj()->AsVariableProxy()->is_this();
415}
416
417
418bool ParserTraits::IsIdentifier(Expression* expression) {
419  VariableProxy* operand = expression->AsVariableProxy();
420  return operand != NULL && !operand->is_this();
421}
422
423
424void ParserTraits::PushPropertyName(FuncNameInferrer* fni,
425                                    Expression* expression) {
426  if (expression->IsPropertyName()) {
427    fni->PushLiteralName(expression->AsLiteral()->AsPropertyName());
428  } else {
429    fni->PushLiteralName(
430        parser_->isolate()->factory()->anonymous_function_string());
431  }
432}
433
434
435void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left,
436                                                           Expression* right) {
437  ASSERT(left != NULL);
438  if (left->AsProperty() != NULL &&
439      right->AsFunctionLiteral() != NULL) {
440    right->AsFunctionLiteral()->set_pretenure();
441  }
442}
443
444
445void ParserTraits::CheckPossibleEvalCall(Expression* expression,
446                                         Scope* scope) {
447  VariableProxy* callee = expression->AsVariableProxy();
448  if (callee != NULL &&
449      callee->IsVariable(parser_->isolate()->factory()->eval_string())) {
450    scope->DeclarationScope()->RecordEvalCall();
451  }
452}
453
454
455Expression* ParserTraits::MarkExpressionAsLValue(Expression* expression) {
456  VariableProxy* proxy = expression != NULL
457      ? expression->AsVariableProxy()
458      : NULL;
459  if (proxy != NULL) proxy->MarkAsLValue();
460  return expression;
461}
462
463
464bool ParserTraits::ShortcutNumericLiteralBinaryExpression(
465    Expression** x, Expression* y, Token::Value op, int pos,
466    AstNodeFactory<AstConstructionVisitor>* factory) {
467  if ((*x)->AsLiteral() && (*x)->AsLiteral()->value()->IsNumber() &&
468      y->AsLiteral() && y->AsLiteral()->value()->IsNumber()) {
469    double x_val = (*x)->AsLiteral()->value()->Number();
470    double y_val = y->AsLiteral()->value()->Number();
471    switch (op) {
472      case Token::ADD:
473        *x = factory->NewNumberLiteral(x_val + y_val, pos);
474        return true;
475      case Token::SUB:
476        *x = factory->NewNumberLiteral(x_val - y_val, pos);
477        return true;
478      case Token::MUL:
479        *x = factory->NewNumberLiteral(x_val * y_val, pos);
480        return true;
481      case Token::DIV:
482        *x = factory->NewNumberLiteral(x_val / y_val, pos);
483        return true;
484      case Token::BIT_OR: {
485        int value = DoubleToInt32(x_val) | DoubleToInt32(y_val);
486        *x = factory->NewNumberLiteral(value, pos);
487        return true;
488      }
489      case Token::BIT_AND: {
490        int value = DoubleToInt32(x_val) & DoubleToInt32(y_val);
491        *x = factory->NewNumberLiteral(value, pos);
492        return true;
493      }
494      case Token::BIT_XOR: {
495        int value = DoubleToInt32(x_val) ^ DoubleToInt32(y_val);
496        *x = factory->NewNumberLiteral(value, pos);
497        return true;
498      }
499      case Token::SHL: {
500        int value = DoubleToInt32(x_val) << (DoubleToInt32(y_val) & 0x1f);
501        *x = factory->NewNumberLiteral(value, pos);
502        return true;
503      }
504      case Token::SHR: {
505        uint32_t shift = DoubleToInt32(y_val) & 0x1f;
506        uint32_t value = DoubleToUint32(x_val) >> shift;
507        *x = factory->NewNumberLiteral(value, pos);
508        return true;
509      }
510      case Token::SAR: {
511        uint32_t shift = DoubleToInt32(y_val) & 0x1f;
512        int value = ArithmeticShiftRight(DoubleToInt32(x_val), shift);
513        *x = factory->NewNumberLiteral(value, pos);
514        return true;
515      }
516      default:
517        break;
518    }
519  }
520  return false;
521}
522
523
524Expression* ParserTraits::BuildUnaryExpression(
525    Expression* expression, Token::Value op, int pos,
526    AstNodeFactory<AstConstructionVisitor>* factory) {
527  ASSERT(expression != NULL);
528  if (expression->IsLiteral()) {
529    Handle<Object> literal = expression->AsLiteral()->value();
530    if (op == Token::NOT) {
531      // Convert the literal to a boolean condition and negate it.
532      bool condition = literal->BooleanValue();
533      Handle<Object> result =
534          parser_->isolate()->factory()->ToBoolean(!condition);
535      return factory->NewLiteral(result, pos);
536    } else if (literal->IsNumber()) {
537      // Compute some expressions involving only number literals.
538      double value = literal->Number();
539      switch (op) {
540        case Token::ADD:
541          return expression;
542        case Token::SUB:
543          return factory->NewNumberLiteral(-value, pos);
544        case Token::BIT_NOT:
545          return factory->NewNumberLiteral(~DoubleToInt32(value), pos);
546        default:
547          break;
548      }
549    }
550  }
551  // Desugar '+foo' => 'foo*1'
552  if (op == Token::ADD) {
553    return factory->NewBinaryOperation(
554        Token::MUL, expression, factory->NewNumberLiteral(1, pos), pos);
555  }
556  // The same idea for '-foo' => 'foo*(-1)'.
557  if (op == Token::SUB) {
558    return factory->NewBinaryOperation(
559        Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos);
560  }
561  // ...and one more time for '~foo' => 'foo^(~0)'.
562  if (op == Token::BIT_NOT) {
563    return factory->NewBinaryOperation(
564        Token::BIT_XOR, expression, factory->NewNumberLiteral(~0, pos), pos);
565  }
566  return factory->NewUnaryOperation(op, expression, pos);
567}
568
569
570Expression* ParserTraits::NewThrowReferenceError(const char* message, int pos) {
571  return NewThrowError(
572      parser_->isolate()->factory()->MakeReferenceError_string(),
573      message, HandleVector<Object>(NULL, 0), pos);
574}
575
576
577Expression* ParserTraits::NewThrowSyntaxError(
578    const char* message, Handle<Object> arg, int pos) {
579  int argc = arg.is_null() ? 0 : 1;
580  Vector< Handle<Object> > arguments = HandleVector<Object>(&arg, argc);
581  return NewThrowError(
582      parser_->isolate()->factory()->MakeSyntaxError_string(),
583      message, arguments, pos);
584}
585
586
587Expression* ParserTraits::NewThrowTypeError(
588    const char* message, Handle<Object> arg, int pos) {
589  int argc = arg.is_null() ? 0 : 1;
590  Vector< Handle<Object> > arguments = HandleVector<Object>(&arg, argc);
591  return NewThrowError(
592      parser_->isolate()->factory()->MakeTypeError_string(),
593      message, arguments, pos);
594}
595
596
597Expression* ParserTraits::NewThrowError(
598    Handle<String> constructor, const char* message,
599    Vector<Handle<Object> > arguments, int pos) {
600  Zone* zone = parser_->zone();
601  Factory* factory = parser_->isolate()->factory();
602  int argc = arguments.length();
603  Handle<FixedArray> elements = factory->NewFixedArray(argc, TENURED);
604  for (int i = 0; i < argc; i++) {
605    Handle<Object> element = arguments[i];
606    if (!element.is_null()) {
607      elements->set(i, *element);
608    }
609  }
610  Handle<JSArray> array =
611      factory->NewJSArrayWithElements(elements, FAST_ELEMENTS, TENURED);
612
613  ZoneList<Expression*>* args = new(zone) ZoneList<Expression*>(2, zone);
614  Handle<String> type = factory->InternalizeUtf8String(message);
615  args->Add(parser_->factory()->NewLiteral(type, pos), zone);
616  args->Add(parser_->factory()->NewLiteral(array, pos), zone);
617  CallRuntime* call_constructor =
618      parser_->factory()->NewCallRuntime(constructor, NULL, args, pos);
619  return parser_->factory()->NewThrow(call_constructor, pos);
620}
621
622
623void ParserTraits::ReportMessageAt(Scanner::Location source_location,
624                                   const char* message,
625                                   const char* arg,
626                                   bool is_reference_error) {
627  if (parser_->stack_overflow()) {
628    // Suppress the error message (syntax error or such) in the presence of a
629    // stack overflow. The isolate allows only one pending exception at at time
630    // and we want to report the stack overflow later.
631    return;
632  }
633  parser_->has_pending_error_ = true;
634  parser_->pending_error_location_ = source_location;
635  parser_->pending_error_message_ = message;
636  parser_->pending_error_char_arg_ = arg;
637  parser_->pending_error_arg_ = Handle<String>();
638  parser_->pending_error_is_reference_error_ = is_reference_error;
639}
640
641
642void ParserTraits::ReportMessage(const char* message,
643                                 MaybeHandle<String> arg,
644                                 bool is_reference_error) {
645  Scanner::Location source_location = parser_->scanner()->location();
646  ReportMessageAt(source_location, message, arg, is_reference_error);
647}
648
649
650void ParserTraits::ReportMessageAt(Scanner::Location source_location,
651                                   const char* message,
652                                   MaybeHandle<String> arg,
653                                   bool is_reference_error) {
654  if (parser_->stack_overflow()) {
655    // Suppress the error message (syntax error or such) in the presence of a
656    // stack overflow. The isolate allows only one pending exception at at time
657    // and we want to report the stack overflow later.
658    return;
659  }
660  parser_->has_pending_error_ = true;
661  parser_->pending_error_location_ = source_location;
662  parser_->pending_error_message_ = message;
663  parser_->pending_error_char_arg_ = NULL;
664  parser_->pending_error_arg_ = arg;
665  parser_->pending_error_is_reference_error_ = is_reference_error;
666}
667
668
669Handle<String> ParserTraits::GetSymbol(Scanner* scanner) {
670  Handle<String> result =
671      parser_->scanner()->AllocateInternalizedString(parser_->isolate());
672  ASSERT(!result.is_null());
673  return result;
674}
675
676
677Handle<String> ParserTraits::NextLiteralString(Scanner* scanner,
678                                               PretenureFlag tenured) {
679  return scanner->AllocateNextLiteralString(parser_->isolate(), tenured);
680}
681
682
683Expression* ParserTraits::ThisExpression(
684    Scope* scope,
685    AstNodeFactory<AstConstructionVisitor>* factory) {
686  return factory->NewVariableProxy(scope->receiver());
687}
688
689
690Literal* ParserTraits::ExpressionFromLiteral(
691    Token::Value token, int pos,
692    Scanner* scanner,
693    AstNodeFactory<AstConstructionVisitor>* factory) {
694  Factory* isolate_factory = parser_->isolate()->factory();
695  switch (token) {
696    case Token::NULL_LITERAL:
697      return factory->NewLiteral(isolate_factory->null_value(), pos);
698    case Token::TRUE_LITERAL:
699      return factory->NewLiteral(isolate_factory->true_value(), pos);
700    case Token::FALSE_LITERAL:
701      return factory->NewLiteral(isolate_factory->false_value(), pos);
702    case Token::NUMBER: {
703      double value = scanner->DoubleValue();
704      return factory->NewNumberLiteral(value, pos);
705    }
706    default:
707      ASSERT(false);
708  }
709  return NULL;
710}
711
712
713Expression* ParserTraits::ExpressionFromIdentifier(
714    Handle<String> name, int pos, Scope* scope,
715    AstNodeFactory<AstConstructionVisitor>* factory) {
716  if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name);
717  // The name may refer to a module instance object, so its type is unknown.
718#ifdef DEBUG
719  if (FLAG_print_interface_details)
720    PrintF("# Variable %s ", name->ToAsciiArray());
721#endif
722  Interface* interface = Interface::NewUnknown(parser_->zone());
723  return scope->NewUnresolved(factory, name, interface, pos);
724}
725
726
727Expression* ParserTraits::ExpressionFromString(
728    int pos, Scanner* scanner,
729    AstNodeFactory<AstConstructionVisitor>* factory) {
730  Handle<String> symbol = GetSymbol(scanner);
731  if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol);
732  return factory->NewLiteral(symbol, pos);
733}
734
735
736Literal* ParserTraits::GetLiteralTheHole(
737    int position, AstNodeFactory<AstConstructionVisitor>* factory) {
738  return factory->NewLiteral(parser_->isolate()->factory()->the_hole_value(),
739                             RelocInfo::kNoPosition);
740}
741
742
743Expression* ParserTraits::ParseV8Intrinsic(bool* ok) {
744  return parser_->ParseV8Intrinsic(ok);
745}
746
747
748FunctionLiteral* ParserTraits::ParseFunctionLiteral(
749    Handle<String> name,
750    Scanner::Location function_name_location,
751    bool name_is_strict_reserved,
752    bool is_generator,
753    int function_token_position,
754    FunctionLiteral::FunctionType type,
755    FunctionLiteral::ArityRestriction arity_restriction,
756    bool* ok) {
757  return parser_->ParseFunctionLiteral(name, function_name_location,
758                                       name_is_strict_reserved, is_generator,
759                                       function_token_position, type,
760                                       arity_restriction, ok);
761}
762
763
764Parser::Parser(CompilationInfo* info)
765    : ParserBase<ParserTraits>(&scanner_,
766                               info->isolate()->stack_guard()->real_climit(),
767                               info->extension(),
768                               NULL,
769                               info->zone(),
770                               this),
771      isolate_(info->isolate()),
772      script_(info->script()),
773      scanner_(isolate_->unicode_cache()),
774      reusable_preparser_(NULL),
775      original_scope_(NULL),
776      target_stack_(NULL),
777      cached_data_(NULL),
778      cached_data_mode_(NO_CACHED_DATA),
779      info_(info),
780      has_pending_error_(false),
781      pending_error_message_(NULL),
782      pending_error_char_arg_(NULL) {
783  ASSERT(!script_.is_null());
784  isolate_->set_ast_node_id(0);
785  set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
786  set_allow_modules(!info->is_native() && FLAG_harmony_modules);
787  set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native());
788  set_allow_lazy(false);  // Must be explicitly enabled.
789  set_allow_generators(FLAG_harmony_generators);
790  set_allow_for_of(FLAG_harmony_iteration);
791  set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
792}
793
794
795FunctionLiteral* Parser::ParseProgram() {
796  // TODO(bmeurer): We temporarily need to pass allow_nesting = true here,
797  // see comment for HistogramTimerScope class.
798  HistogramTimerScope timer_scope(isolate()->counters()->parse(), true);
799  Handle<String> source(String::cast(script_->source()));
800  isolate()->counters()->total_parse_size()->Increment(source->length());
801  ElapsedTimer timer;
802  if (FLAG_trace_parse) {
803    timer.Start();
804  }
805  fni_ = new(zone()) FuncNameInferrer(isolate(), zone());
806
807  // Initialize parser state.
808  CompleteParserRecorder recorder;
809  if (cached_data_mode_ == PRODUCE_CACHED_DATA) {
810    log_ = &recorder;
811  } else if (cached_data_mode_ == CONSUME_CACHED_DATA) {
812    (*cached_data_)->Initialize();
813  }
814
815  source = String::Flatten(source);
816  FunctionLiteral* result;
817  if (source->IsExternalTwoByteString()) {
818    // Notice that the stream is destroyed at the end of the branch block.
819    // The last line of the blocks can't be moved outside, even though they're
820    // identical calls.
821    ExternalTwoByteStringUtf16CharacterStream stream(
822        Handle<ExternalTwoByteString>::cast(source), 0, source->length());
823    scanner_.Initialize(&stream);
824    result = DoParseProgram(info(), source);
825  } else {
826    GenericStringUtf16CharacterStream stream(source, 0, source->length());
827    scanner_.Initialize(&stream);
828    result = DoParseProgram(info(), source);
829  }
830
831  if (FLAG_trace_parse && result != NULL) {
832    double ms = timer.Elapsed().InMillisecondsF();
833    if (info()->is_eval()) {
834      PrintF("[parsing eval");
835    } else if (info()->script()->name()->IsString()) {
836      String* name = String::cast(info()->script()->name());
837      SmartArrayPointer<char> name_chars = name->ToCString();
838      PrintF("[parsing script: %s", name_chars.get());
839    } else {
840      PrintF("[parsing script");
841    }
842    PrintF(" - took %0.3f ms]\n", ms);
843  }
844  if (cached_data_mode_ == PRODUCE_CACHED_DATA) {
845    if (result != NULL) {
846      Vector<unsigned> store = recorder.ExtractData();
847      *cached_data_ = new ScriptData(store);
848    }
849    log_ = NULL;
850  }
851  return result;
852}
853
854
855FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info,
856                                        Handle<String> source) {
857  ASSERT(scope_ == NULL);
858  ASSERT(target_stack_ == NULL);
859
860  Handle<String> no_name = isolate()->factory()->empty_string();
861
862  FunctionLiteral* result = NULL;
863  { Scope* scope = NewScope(scope_, GLOBAL_SCOPE);
864    info->SetGlobalScope(scope);
865    if (!info->context().is_null()) {
866      scope = Scope::DeserializeScopeChain(*info->context(), scope, zone());
867    }
868    original_scope_ = scope;
869    if (info->is_eval()) {
870      if (!scope->is_global_scope() || info->strict_mode() == STRICT) {
871        scope = NewScope(scope, EVAL_SCOPE);
872      }
873    } else if (info->is_global()) {
874      scope = NewScope(scope, GLOBAL_SCOPE);
875    }
876    scope->set_start_position(0);
877    scope->set_end_position(source->length());
878
879    // Compute the parsing mode.
880    Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
881    if (allow_natives_syntax() ||
882        extension_ != NULL ||
883        scope->is_eval_scope()) {
884      mode = PARSE_EAGERLY;
885    }
886    ParsingModeScope parsing_mode(this, mode);
887
888    // Enters 'scope'.
889    FunctionState function_state(&function_state_, &scope_, scope, zone());
890
891    scope_->SetStrictMode(info->strict_mode());
892    ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
893    bool ok = true;
894    int beg_pos = scanner()->location().beg_pos;
895    ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok);
896    if (ok && strict_mode() == STRICT) {
897      CheckOctalLiteral(beg_pos, scanner()->location().end_pos, &ok);
898    }
899
900    if (ok && allow_harmony_scoping() && strict_mode() == STRICT) {
901      CheckConflictingVarDeclarations(scope_, &ok);
902    }
903
904    if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) {
905      if (body->length() != 1 ||
906          !body->at(0)->IsExpressionStatement() ||
907          !body->at(0)->AsExpressionStatement()->
908              expression()->IsFunctionLiteral()) {
909        ReportMessage("single_function_literal");
910        ok = false;
911      }
912    }
913
914    if (ok) {
915      result = factory()->NewFunctionLiteral(
916          no_name,
917          scope_,
918          body,
919          function_state.materialized_literal_count(),
920          function_state.expected_property_count(),
921          function_state.handler_count(),
922          0,
923          FunctionLiteral::kNoDuplicateParameters,
924          FunctionLiteral::ANONYMOUS_EXPRESSION,
925          FunctionLiteral::kGlobalOrEval,
926          FunctionLiteral::kNotParenthesized,
927          FunctionLiteral::kNotGenerator,
928          0);
929      result->set_ast_properties(factory()->visitor()->ast_properties());
930      result->set_dont_optimize_reason(
931          factory()->visitor()->dont_optimize_reason());
932    } else if (stack_overflow()) {
933      isolate()->StackOverflow();
934    } else {
935      ThrowPendingError();
936    }
937  }
938
939  // Make sure the target stack is empty.
940  ASSERT(target_stack_ == NULL);
941
942  return result;
943}
944
945
946FunctionLiteral* Parser::ParseLazy() {
947  HistogramTimerScope timer_scope(isolate()->counters()->parse_lazy());
948  Handle<String> source(String::cast(script_->source()));
949  isolate()->counters()->total_parse_size()->Increment(source->length());
950  ElapsedTimer timer;
951  if (FLAG_trace_parse) {
952    timer.Start();
953  }
954  Handle<SharedFunctionInfo> shared_info = info()->shared_info();
955
956  // Initialize parser state.
957  source = String::Flatten(source);
958  FunctionLiteral* result;
959  if (source->IsExternalTwoByteString()) {
960    ExternalTwoByteStringUtf16CharacterStream stream(
961        Handle<ExternalTwoByteString>::cast(source),
962        shared_info->start_position(),
963        shared_info->end_position());
964    result = ParseLazy(&stream);
965  } else {
966    GenericStringUtf16CharacterStream stream(source,
967                                             shared_info->start_position(),
968                                             shared_info->end_position());
969    result = ParseLazy(&stream);
970  }
971
972  if (FLAG_trace_parse && result != NULL) {
973    double ms = timer.Elapsed().InMillisecondsF();
974    SmartArrayPointer<char> name_chars = result->debug_name()->ToCString();
975    PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms);
976  }
977  return result;
978}
979
980
981FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) {
982  Handle<SharedFunctionInfo> shared_info = info()->shared_info();
983  scanner_.Initialize(source);
984  ASSERT(scope_ == NULL);
985  ASSERT(target_stack_ == NULL);
986
987  Handle<String> name(String::cast(shared_info->name()));
988  fni_ = new(zone()) FuncNameInferrer(isolate(), zone());
989  fni_->PushEnclosingName(name);
990
991  ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
992
993  // Place holder for the result.
994  FunctionLiteral* result = NULL;
995
996  {
997    // Parse the function literal.
998    Scope* scope = NewScope(scope_, GLOBAL_SCOPE);
999    info()->SetGlobalScope(scope);
1000    if (!info()->closure().is_null()) {
1001      scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope,
1002                                           zone());
1003    }
1004    original_scope_ = scope;
1005    FunctionState function_state(&function_state_, &scope_, scope, zone());
1006    ASSERT(scope->strict_mode() == SLOPPY || info()->strict_mode() == STRICT);
1007    ASSERT(info()->strict_mode() == shared_info->strict_mode());
1008    scope->SetStrictMode(shared_info->strict_mode());
1009    FunctionLiteral::FunctionType function_type = shared_info->is_expression()
1010        ? (shared_info->is_anonymous()
1011              ? FunctionLiteral::ANONYMOUS_EXPRESSION
1012              : FunctionLiteral::NAMED_EXPRESSION)
1013        : FunctionLiteral::DECLARATION;
1014    bool ok = true;
1015    result = ParseFunctionLiteral(name,
1016                                  Scanner::Location::invalid(),
1017                                  false,  // Strict mode name already checked.
1018                                  shared_info->is_generator(),
1019                                  RelocInfo::kNoPosition,
1020                                  function_type,
1021                                  FunctionLiteral::NORMAL_ARITY,
1022                                  &ok);
1023    // Make sure the results agree.
1024    ASSERT(ok == (result != NULL));
1025  }
1026
1027  // Make sure the target stack is empty.
1028  ASSERT(target_stack_ == NULL);
1029
1030  if (result == NULL) {
1031    if (stack_overflow()) {
1032      isolate()->StackOverflow();
1033    } else {
1034      ThrowPendingError();
1035    }
1036  } else {
1037    Handle<String> inferred_name(shared_info->inferred_name());
1038    result->set_inferred_name(inferred_name);
1039  }
1040  return result;
1041}
1042
1043
1044void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
1045                                  int end_token,
1046                                  bool is_eval,
1047                                  bool is_global,
1048                                  bool* ok) {
1049  // SourceElements ::
1050  //   (ModuleElement)* <end_token>
1051
1052  // Allocate a target stack to use for this set of source
1053  // elements. This way, all scripts and functions get their own
1054  // target stack thus avoiding illegal breaks and continues across
1055  // functions.
1056  TargetScope scope(&this->target_stack_);
1057
1058  ASSERT(processor != NULL);
1059  bool directive_prologue = true;     // Parsing directive prologue.
1060
1061  while (peek() != end_token) {
1062    if (directive_prologue && peek() != Token::STRING) {
1063      directive_prologue = false;
1064    }
1065
1066    Scanner::Location token_loc = scanner()->peek_location();
1067    Statement* stat;
1068    if (is_global && !is_eval) {
1069      stat = ParseModuleElement(NULL, CHECK_OK);
1070    } else {
1071      stat = ParseBlockElement(NULL, CHECK_OK);
1072    }
1073    if (stat == NULL || stat->IsEmpty()) {
1074      directive_prologue = false;   // End of directive prologue.
1075      continue;
1076    }
1077
1078    if (directive_prologue) {
1079      // A shot at a directive.
1080      ExpressionStatement* e_stat;
1081      Literal* literal;
1082      // Still processing directive prologue?
1083      if ((e_stat = stat->AsExpressionStatement()) != NULL &&
1084          (literal = e_stat->expression()->AsLiteral()) != NULL &&
1085          literal->value()->IsString()) {
1086        Handle<String> directive = Handle<String>::cast(literal->value());
1087
1088        // Check "use strict" directive (ES5 14.1).
1089        if (strict_mode() == SLOPPY &&
1090            String::Equals(isolate()->factory()->use_strict_string(),
1091                           directive) &&
1092            token_loc.end_pos - token_loc.beg_pos ==
1093              isolate()->heap()->use_strict_string()->length() + 2) {
1094          // TODO(mstarzinger): Global strict eval calls, need their own scope
1095          // as specified in ES5 10.4.2(3). The correct fix would be to always
1096          // add this scope in DoParseProgram(), but that requires adaptations
1097          // all over the code base, so we go with a quick-fix for now.
1098          // In the same manner, we have to patch the parsing mode.
1099          if (is_eval && !scope_->is_eval_scope()) {
1100            ASSERT(scope_->is_global_scope());
1101            Scope* scope = NewScope(scope_, EVAL_SCOPE);
1102            scope->set_start_position(scope_->start_position());
1103            scope->set_end_position(scope_->end_position());
1104            scope_ = scope;
1105            mode_ = PARSE_EAGERLY;
1106          }
1107          scope_->SetStrictMode(STRICT);
1108          // "use strict" is the only directive for now.
1109          directive_prologue = false;
1110        }
1111      } else {
1112        // End of the directive prologue.
1113        directive_prologue = false;
1114      }
1115    }
1116
1117    processor->Add(stat, zone());
1118  }
1119
1120  return 0;
1121}
1122
1123
1124Statement* Parser::ParseModuleElement(ZoneStringList* labels,
1125                                      bool* ok) {
1126  // (Ecma 262 5th Edition, clause 14):
1127  // SourceElement:
1128  //    Statement
1129  //    FunctionDeclaration
1130  //
1131  // In harmony mode we allow additionally the following productions
1132  // ModuleElement:
1133  //    LetDeclaration
1134  //    ConstDeclaration
1135  //    ModuleDeclaration
1136  //    ImportDeclaration
1137  //    ExportDeclaration
1138  //    GeneratorDeclaration
1139
1140  switch (peek()) {
1141    case Token::FUNCTION:
1142      return ParseFunctionDeclaration(NULL, ok);
1143    case Token::LET:
1144    case Token::CONST:
1145      return ParseVariableStatement(kModuleElement, NULL, ok);
1146    case Token::IMPORT:
1147      return ParseImportDeclaration(ok);
1148    case Token::EXPORT:
1149      return ParseExportDeclaration(ok);
1150    default: {
1151      Statement* stmt = ParseStatement(labels, CHECK_OK);
1152      // Handle 'module' as a context-sensitive keyword.
1153      if (FLAG_harmony_modules &&
1154          peek() == Token::IDENTIFIER &&
1155          !scanner()->HasAnyLineTerminatorBeforeNext() &&
1156          stmt != NULL) {
1157        ExpressionStatement* estmt = stmt->AsExpressionStatement();
1158        if (estmt != NULL &&
1159            estmt->expression()->AsVariableProxy() != NULL &&
1160            String::Equals(isolate()->factory()->module_string(),
1161                           estmt->expression()->AsVariableProxy()->name()) &&
1162            !scanner()->literal_contains_escapes()) {
1163          return ParseModuleDeclaration(NULL, ok);
1164        }
1165      }
1166      return stmt;
1167    }
1168  }
1169}
1170
1171
1172Statement* Parser::ParseModuleDeclaration(ZoneStringList* names, bool* ok) {
1173  // ModuleDeclaration:
1174  //    'module' Identifier Module
1175
1176  int pos = peek_position();
1177  Handle<String> name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
1178
1179#ifdef DEBUG
1180  if (FLAG_print_interface_details)
1181    PrintF("# Module %s...\n", name->ToAsciiArray());
1182#endif
1183
1184  Module* module = ParseModule(CHECK_OK);
1185  VariableProxy* proxy = NewUnresolved(name, MODULE, module->interface());
1186  Declaration* declaration =
1187      factory()->NewModuleDeclaration(proxy, module, scope_, pos);
1188  Declare(declaration, true, CHECK_OK);
1189
1190#ifdef DEBUG
1191  if (FLAG_print_interface_details)
1192    PrintF("# Module %s.\n", name->ToAsciiArray());
1193
1194  if (FLAG_print_interfaces) {
1195    PrintF("module %s : ", name->ToAsciiArray());
1196    module->interface()->Print();
1197  }
1198#endif
1199
1200  if (names) names->Add(name, zone());
1201  if (module->body() == NULL)
1202    return factory()->NewEmptyStatement(pos);
1203  else
1204    return factory()->NewModuleStatement(proxy, module->body(), pos);
1205}
1206
1207
1208Module* Parser::ParseModule(bool* ok) {
1209  // Module:
1210  //    '{' ModuleElement '}'
1211  //    '=' ModulePath ';'
1212  //    'at' String ';'
1213
1214  switch (peek()) {
1215    case Token::LBRACE:
1216      return ParseModuleLiteral(ok);
1217
1218    case Token::ASSIGN: {
1219      Expect(Token::ASSIGN, CHECK_OK);
1220      Module* result = ParseModulePath(CHECK_OK);
1221      ExpectSemicolon(CHECK_OK);
1222      return result;
1223    }
1224
1225    default: {
1226      ExpectContextualKeyword(CStrVector("at"), CHECK_OK);
1227      Module* result = ParseModuleUrl(CHECK_OK);
1228      ExpectSemicolon(CHECK_OK);
1229      return result;
1230    }
1231  }
1232}
1233
1234
1235Module* Parser::ParseModuleLiteral(bool* ok) {
1236  // Module:
1237  //    '{' ModuleElement '}'
1238
1239  int pos = peek_position();
1240  // Construct block expecting 16 statements.
1241  Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition);
1242#ifdef DEBUG
1243  if (FLAG_print_interface_details) PrintF("# Literal ");
1244#endif
1245  Scope* scope = NewScope(scope_, MODULE_SCOPE);
1246
1247  Expect(Token::LBRACE, CHECK_OK);
1248  scope->set_start_position(scanner()->location().beg_pos);
1249  scope->SetStrictMode(STRICT);
1250
1251  {
1252    BlockState block_state(&scope_, scope);
1253    TargetCollector collector(zone());
1254    Target target(&this->target_stack_, &collector);
1255    Target target_body(&this->target_stack_, body);
1256
1257    while (peek() != Token::RBRACE) {
1258      Statement* stat = ParseModuleElement(NULL, CHECK_OK);
1259      if (stat && !stat->IsEmpty()) {
1260        body->AddStatement(stat, zone());
1261      }
1262    }
1263  }
1264
1265  Expect(Token::RBRACE, CHECK_OK);
1266  scope->set_end_position(scanner()->location().end_pos);
1267  body->set_scope(scope);
1268
1269  // Check that all exports are bound.
1270  Interface* interface = scope->interface();
1271  for (Interface::Iterator it = interface->iterator();
1272       !it.done(); it.Advance()) {
1273    if (scope->LookupLocal(it.name()) == NULL) {
1274      ParserTraits::ReportMessage("module_export_undefined", it.name());
1275      *ok = false;
1276      return NULL;
1277    }
1278  }
1279
1280  interface->MakeModule(ok);
1281  ASSERT(*ok);
1282  interface->Freeze(ok);
1283  ASSERT(*ok);
1284  return factory()->NewModuleLiteral(body, interface, pos);
1285}
1286
1287
1288Module* Parser::ParseModulePath(bool* ok) {
1289  // ModulePath:
1290  //    Identifier
1291  //    ModulePath '.' Identifier
1292
1293  int pos = peek_position();
1294  Module* result = ParseModuleVariable(CHECK_OK);
1295  while (Check(Token::PERIOD)) {
1296    Handle<String> name = ParseIdentifierName(CHECK_OK);
1297#ifdef DEBUG
1298    if (FLAG_print_interface_details)
1299      PrintF("# Path .%s ", name->ToAsciiArray());
1300#endif
1301    Module* member = factory()->NewModulePath(result, name, pos);
1302    result->interface()->Add(name, member->interface(), zone(), ok);
1303    if (!*ok) {
1304#ifdef DEBUG
1305      if (FLAG_print_interfaces) {
1306        PrintF("PATH TYPE ERROR at '%s'\n", name->ToAsciiArray());
1307        PrintF("result: ");
1308        result->interface()->Print();
1309        PrintF("member: ");
1310        member->interface()->Print();
1311      }
1312#endif
1313      ParserTraits::ReportMessage("invalid_module_path", name);
1314      return NULL;
1315    }
1316    result = member;
1317  }
1318
1319  return result;
1320}
1321
1322
1323Module* Parser::ParseModuleVariable(bool* ok) {
1324  // ModulePath:
1325  //    Identifier
1326
1327  int pos = peek_position();
1328  Handle<String> name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
1329#ifdef DEBUG
1330  if (FLAG_print_interface_details)
1331    PrintF("# Module variable %s ", name->ToAsciiArray());
1332#endif
1333  VariableProxy* proxy = scope_->NewUnresolved(
1334      factory(), name, Interface::NewModule(zone()),
1335      scanner()->location().beg_pos);
1336
1337  return factory()->NewModuleVariable(proxy, pos);
1338}
1339
1340
1341Module* Parser::ParseModuleUrl(bool* ok) {
1342  // Module:
1343  //    String
1344
1345  int pos = peek_position();
1346  Expect(Token::STRING, CHECK_OK);
1347  Handle<String> symbol = GetSymbol();
1348
1349  // TODO(ES6): Request JS resource from environment...
1350
1351#ifdef DEBUG
1352  if (FLAG_print_interface_details) PrintF("# Url ");
1353#endif
1354
1355  // Create an empty literal as long as the feature isn't finished.
1356  USE(symbol);
1357  Scope* scope = NewScope(scope_, MODULE_SCOPE);
1358  Block* body = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition);
1359  body->set_scope(scope);
1360  Interface* interface = scope->interface();
1361  Module* result = factory()->NewModuleLiteral(body, interface, pos);
1362  interface->Freeze(ok);
1363  ASSERT(*ok);
1364  interface->Unify(scope->interface(), zone(), ok);
1365  ASSERT(*ok);
1366  return result;
1367}
1368
1369
1370Module* Parser::ParseModuleSpecifier(bool* ok) {
1371  // ModuleSpecifier:
1372  //    String
1373  //    ModulePath
1374
1375  if (peek() == Token::STRING) {
1376    return ParseModuleUrl(ok);
1377  } else {
1378    return ParseModulePath(ok);
1379  }
1380}
1381
1382
1383Block* Parser::ParseImportDeclaration(bool* ok) {
1384  // ImportDeclaration:
1385  //    'import' IdentifierName (',' IdentifierName)* 'from' ModuleSpecifier ';'
1386  //
1387  // TODO(ES6): implement destructuring ImportSpecifiers
1388
1389  int pos = peek_position();
1390  Expect(Token::IMPORT, CHECK_OK);
1391  ZoneStringList names(1, zone());
1392
1393  Handle<String> name = ParseIdentifierName(CHECK_OK);
1394  names.Add(name, zone());
1395  while (peek() == Token::COMMA) {
1396    Consume(Token::COMMA);
1397    name = ParseIdentifierName(CHECK_OK);
1398    names.Add(name, zone());
1399  }
1400
1401  ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
1402  Module* module = ParseModuleSpecifier(CHECK_OK);
1403  ExpectSemicolon(CHECK_OK);
1404
1405  // Generate a separate declaration for each identifier.
1406  // TODO(ES6): once we implement destructuring, make that one declaration.
1407  Block* block = factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition);
1408  for (int i = 0; i < names.length(); ++i) {
1409#ifdef DEBUG
1410    if (FLAG_print_interface_details)
1411      PrintF("# Import %s ", names[i]->ToAsciiArray());
1412#endif
1413    Interface* interface = Interface::NewUnknown(zone());
1414    module->interface()->Add(names[i], interface, zone(), ok);
1415    if (!*ok) {
1416#ifdef DEBUG
1417      if (FLAG_print_interfaces) {
1418        PrintF("IMPORT TYPE ERROR at '%s'\n", names[i]->ToAsciiArray());
1419        PrintF("module: ");
1420        module->interface()->Print();
1421      }
1422#endif
1423      ParserTraits::ReportMessage("invalid_module_path", name);
1424      return NULL;
1425    }
1426    VariableProxy* proxy = NewUnresolved(names[i], LET, interface);
1427    Declaration* declaration =
1428        factory()->NewImportDeclaration(proxy, module, scope_, pos);
1429    Declare(declaration, true, CHECK_OK);
1430  }
1431
1432  return block;
1433}
1434
1435
1436Statement* Parser::ParseExportDeclaration(bool* ok) {
1437  // ExportDeclaration:
1438  //    'export' Identifier (',' Identifier)* ';'
1439  //    'export' VariableDeclaration
1440  //    'export' FunctionDeclaration
1441  //    'export' GeneratorDeclaration
1442  //    'export' ModuleDeclaration
1443  //
1444  // TODO(ES6): implement structuring ExportSpecifiers
1445
1446  Expect(Token::EXPORT, CHECK_OK);
1447
1448  Statement* result = NULL;
1449  ZoneStringList names(1, zone());
1450  switch (peek()) {
1451    case Token::IDENTIFIER: {
1452      int pos = position();
1453      Handle<String> name =
1454          ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
1455      // Handle 'module' as a context-sensitive keyword.
1456      if (!name->IsOneByteEqualTo(STATIC_ASCII_VECTOR("module"))) {
1457        names.Add(name, zone());
1458        while (peek() == Token::COMMA) {
1459          Consume(Token::COMMA);
1460          name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
1461          names.Add(name, zone());
1462        }
1463        ExpectSemicolon(CHECK_OK);
1464        result = factory()->NewEmptyStatement(pos);
1465      } else {
1466        result = ParseModuleDeclaration(&names, CHECK_OK);
1467      }
1468      break;
1469    }
1470
1471    case Token::FUNCTION:
1472      result = ParseFunctionDeclaration(&names, CHECK_OK);
1473      break;
1474
1475    case Token::VAR:
1476    case Token::LET:
1477    case Token::CONST:
1478      result = ParseVariableStatement(kModuleElement, &names, CHECK_OK);
1479      break;
1480
1481    default:
1482      *ok = false;
1483      ReportUnexpectedToken(scanner()->current_token());
1484      return NULL;
1485  }
1486
1487  // Extract declared names into export declarations and interface.
1488  Interface* interface = scope_->interface();
1489  for (int i = 0; i < names.length(); ++i) {
1490#ifdef DEBUG
1491    if (FLAG_print_interface_details)
1492      PrintF("# Export %s ", names[i]->ToAsciiArray());
1493#endif
1494    Interface* inner = Interface::NewUnknown(zone());
1495    interface->Add(names[i], inner, zone(), CHECK_OK);
1496    if (!*ok)
1497      return NULL;
1498    VariableProxy* proxy = NewUnresolved(names[i], LET, inner);
1499    USE(proxy);
1500    // TODO(rossberg): Rethink whether we actually need to store export
1501    // declarations (for compilation?).
1502    // ExportDeclaration* declaration =
1503    //     factory()->NewExportDeclaration(proxy, scope_, position);
1504    // scope_->AddDeclaration(declaration);
1505  }
1506
1507  ASSERT(result != NULL);
1508  return result;
1509}
1510
1511
1512Statement* Parser::ParseBlockElement(ZoneStringList* labels,
1513                                     bool* ok) {
1514  // (Ecma 262 5th Edition, clause 14):
1515  // SourceElement:
1516  //    Statement
1517  //    FunctionDeclaration
1518  //
1519  // In harmony mode we allow additionally the following productions
1520  // BlockElement (aka SourceElement):
1521  //    LetDeclaration
1522  //    ConstDeclaration
1523  //    GeneratorDeclaration
1524
1525  switch (peek()) {
1526    case Token::FUNCTION:
1527      return ParseFunctionDeclaration(NULL, ok);
1528    case Token::LET:
1529    case Token::CONST:
1530      return ParseVariableStatement(kModuleElement, NULL, ok);
1531    default:
1532      return ParseStatement(labels, ok);
1533  }
1534}
1535
1536
1537Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) {
1538  // Statement ::
1539  //   Block
1540  //   VariableStatement
1541  //   EmptyStatement
1542  //   ExpressionStatement
1543  //   IfStatement
1544  //   IterationStatement
1545  //   ContinueStatement
1546  //   BreakStatement
1547  //   ReturnStatement
1548  //   WithStatement
1549  //   LabelledStatement
1550  //   SwitchStatement
1551  //   ThrowStatement
1552  //   TryStatement
1553  //   DebuggerStatement
1554
1555  // Note: Since labels can only be used by 'break' and 'continue'
1556  // statements, which themselves are only valid within blocks,
1557  // iterations or 'switch' statements (i.e., BreakableStatements),
1558  // labels can be simply ignored in all other cases; except for
1559  // trivial labeled break statements 'label: break label' which is
1560  // parsed into an empty statement.
1561  switch (peek()) {
1562    case Token::LBRACE:
1563      return ParseBlock(labels, ok);
1564
1565    case Token::CONST:  // fall through
1566    case Token::LET:
1567    case Token::VAR:
1568      return ParseVariableStatement(kStatement, NULL, ok);
1569
1570    case Token::SEMICOLON:
1571      Next();
1572      return factory()->NewEmptyStatement(RelocInfo::kNoPosition);
1573
1574    case Token::IF:
1575      return ParseIfStatement(labels, ok);
1576
1577    case Token::DO:
1578      return ParseDoWhileStatement(labels, ok);
1579
1580    case Token::WHILE:
1581      return ParseWhileStatement(labels, ok);
1582
1583    case Token::FOR:
1584      return ParseForStatement(labels, ok);
1585
1586    case Token::CONTINUE:
1587      return ParseContinueStatement(ok);
1588
1589    case Token::BREAK:
1590      return ParseBreakStatement(labels, ok);
1591
1592    case Token::RETURN:
1593      return ParseReturnStatement(ok);
1594
1595    case Token::WITH:
1596      return ParseWithStatement(labels, ok);
1597
1598    case Token::SWITCH:
1599      return ParseSwitchStatement(labels, ok);
1600
1601    case Token::THROW:
1602      return ParseThrowStatement(ok);
1603
1604    case Token::TRY: {
1605      // NOTE: It is somewhat complicated to have labels on
1606      // try-statements. When breaking out of a try-finally statement,
1607      // one must take great care not to treat it as a
1608      // fall-through. It is much easier just to wrap the entire
1609      // try-statement in a statement block and put the labels there
1610      Block* result =
1611          factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1612      Target target(&this->target_stack_, result);
1613      TryStatement* statement = ParseTryStatement(CHECK_OK);
1614      if (result) result->AddStatement(statement, zone());
1615      return result;
1616    }
1617
1618    case Token::FUNCTION: {
1619      // FunctionDeclaration is only allowed in the context of SourceElements
1620      // (Ecma 262 5th Edition, clause 14):
1621      // SourceElement:
1622      //    Statement
1623      //    FunctionDeclaration
1624      // Common language extension is to allow function declaration in place
1625      // of any statement. This language extension is disabled in strict mode.
1626      //
1627      // In Harmony mode, this case also handles the extension:
1628      // Statement:
1629      //    GeneratorDeclaration
1630      if (strict_mode() == STRICT) {
1631        ReportMessageAt(scanner()->peek_location(), "strict_function");
1632        *ok = false;
1633        return NULL;
1634      }
1635      return ParseFunctionDeclaration(NULL, ok);
1636    }
1637
1638    case Token::DEBUGGER:
1639      return ParseDebuggerStatement(ok);
1640
1641    default:
1642      return ParseExpressionOrLabelledStatement(labels, ok);
1643  }
1644}
1645
1646
1647VariableProxy* Parser::NewUnresolved(
1648    Handle<String> name, VariableMode mode, Interface* interface) {
1649  // If we are inside a function, a declaration of a var/const variable is a
1650  // truly local variable, and the scope of the variable is always the function
1651  // scope.
1652  // Let/const variables in harmony mode are always added to the immediately
1653  // enclosing scope.
1654  return DeclarationScope(mode)->NewUnresolved(
1655      factory(), name, interface, position());
1656}
1657
1658
1659void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) {
1660  VariableProxy* proxy = declaration->proxy();
1661  Handle<String> name = proxy->name();
1662  VariableMode mode = declaration->mode();
1663  Scope* declaration_scope = DeclarationScope(mode);
1664  Variable* var = NULL;
1665
1666  // If a suitable scope exists, then we can statically declare this
1667  // variable and also set its mode. In any case, a Declaration node
1668  // will be added to the scope so that the declaration can be added
1669  // to the corresponding activation frame at runtime if necessary.
1670  // For instance declarations inside an eval scope need to be added
1671  // to the calling function context.
1672  // Similarly, strict mode eval scope does not leak variable declarations to
1673  // the caller's scope so we declare all locals, too.
1674  if (declaration_scope->is_function_scope() ||
1675      declaration_scope->is_strict_eval_scope() ||
1676      declaration_scope->is_block_scope() ||
1677      declaration_scope->is_module_scope() ||
1678      declaration_scope->is_global_scope()) {
1679    // Declare the variable in the declaration scope.
1680    // For the global scope, we have to check for collisions with earlier
1681    // (i.e., enclosing) global scopes, to maintain the illusion of a single
1682    // global scope.
1683    var = declaration_scope->is_global_scope()
1684        ? declaration_scope->Lookup(name)
1685        : declaration_scope->LookupLocal(name);
1686    if (var == NULL) {
1687      // Declare the name.
1688      var = declaration_scope->DeclareLocal(
1689          name, mode, declaration->initialization(), proxy->interface());
1690    } else if ((mode != VAR || var->mode() != VAR) &&
1691               (!declaration_scope->is_global_scope() ||
1692                IsLexicalVariableMode(mode) ||
1693                IsLexicalVariableMode(var->mode()))) {
1694      // The name was declared in this scope before; check for conflicting
1695      // re-declarations. We have a conflict if either of the declarations is
1696      // not a var (in the global scope, we also have to ignore legacy const for
1697      // compatibility). There is similar code in runtime.cc in the Declare
1698      // functions. The function CheckNonConflictingScope checks for conflicting
1699      // var and let bindings from different scopes whereas this is a check for
1700      // conflicting declarations within the same scope. This check also covers
1701      // the special case
1702      //
1703      // function () { let x; { var x; } }
1704      //
1705      // because the var declaration is hoisted to the function scope where 'x'
1706      // is already bound.
1707      ASSERT(IsDeclaredVariableMode(var->mode()));
1708      if (allow_harmony_scoping() && strict_mode() == STRICT) {
1709        // In harmony we treat re-declarations as early errors. See
1710        // ES5 16 for a definition of early errors.
1711        ParserTraits::ReportMessage("var_redeclaration", name);
1712        *ok = false;
1713        return;
1714      }
1715      Expression* expression = NewThrowTypeError(
1716          "var_redeclaration", name, declaration->position());
1717      declaration_scope->SetIllegalRedeclaration(expression);
1718    }
1719  }
1720
1721  // We add a declaration node for every declaration. The compiler
1722  // will only generate code if necessary. In particular, declarations
1723  // for inner local variables that do not represent functions won't
1724  // result in any generated code.
1725  //
1726  // Note that we always add an unresolved proxy even if it's not
1727  // used, simply because we don't know in this method (w/o extra
1728  // parameters) if the proxy is needed or not. The proxy will be
1729  // bound during variable resolution time unless it was pre-bound
1730  // below.
1731  //
1732  // WARNING: This will lead to multiple declaration nodes for the
1733  // same variable if it is declared several times. This is not a
1734  // semantic issue as long as we keep the source order, but it may be
1735  // a performance issue since it may lead to repeated
1736  // RuntimeHidden_DeclareContextSlot calls.
1737  declaration_scope->AddDeclaration(declaration);
1738
1739  if (mode == CONST_LEGACY && declaration_scope->is_global_scope()) {
1740    // For global const variables we bind the proxy to a variable.
1741    ASSERT(resolve);  // should be set by all callers
1742    Variable::Kind kind = Variable::NORMAL;
1743    var = new(zone()) Variable(
1744        declaration_scope, name, mode, true, kind,
1745        kNeedsInitialization, proxy->interface());
1746  } else if (declaration_scope->is_eval_scope() &&
1747             declaration_scope->strict_mode() == SLOPPY) {
1748    // For variable declarations in a sloppy eval scope the proxy is bound
1749    // to a lookup variable to force a dynamic declaration using the
1750    // DeclareContextSlot runtime function.
1751    Variable::Kind kind = Variable::NORMAL;
1752    var = new(zone()) Variable(
1753        declaration_scope, name, mode, true, kind,
1754        declaration->initialization(), proxy->interface());
1755    var->AllocateTo(Variable::LOOKUP, -1);
1756    resolve = true;
1757  }
1758
1759  // If requested and we have a local variable, bind the proxy to the variable
1760  // at parse-time. This is used for functions (and consts) declared inside
1761  // statements: the corresponding function (or const) variable must be in the
1762  // function scope and not a statement-local scope, e.g. as provided with a
1763  // 'with' statement:
1764  //
1765  //   with (obj) {
1766  //     function f() {}
1767  //   }
1768  //
1769  // which is translated into:
1770  //
1771  //   with (obj) {
1772  //     // in this case this is not: 'var f; f = function () {};'
1773  //     var f = function () {};
1774  //   }
1775  //
1776  // Note that if 'f' is accessed from inside the 'with' statement, it
1777  // will be allocated in the context (because we must be able to look
1778  // it up dynamically) but it will also be accessed statically, i.e.,
1779  // with a context slot index and a context chain length for this
1780  // initialization code. Thus, inside the 'with' statement, we need
1781  // both access to the static and the dynamic context chain; the
1782  // runtime needs to provide both.
1783  if (resolve && var != NULL) {
1784    proxy->BindTo(var);
1785
1786    if (FLAG_harmony_modules) {
1787      bool ok;
1788#ifdef DEBUG
1789      if (FLAG_print_interface_details)
1790        PrintF("# Declare %s\n", var->name()->ToAsciiArray());
1791#endif
1792      proxy->interface()->Unify(var->interface(), zone(), &ok);
1793      if (!ok) {
1794#ifdef DEBUG
1795        if (FLAG_print_interfaces) {
1796          PrintF("DECLARE TYPE ERROR\n");
1797          PrintF("proxy: ");
1798          proxy->interface()->Print();
1799          PrintF("var: ");
1800          var->interface()->Print();
1801        }
1802#endif
1803        ParserTraits::ReportMessage("module_type_error", name);
1804      }
1805    }
1806  }
1807}
1808
1809
1810// Language extension which is only enabled for source files loaded
1811// through the API's extension mechanism.  A native function
1812// declaration is resolved by looking up the function through a
1813// callback provided by the extension.
1814Statement* Parser::ParseNativeDeclaration(bool* ok) {
1815  int pos = peek_position();
1816  Expect(Token::FUNCTION, CHECK_OK);
1817  // Allow "eval" or "arguments" for backward compatibility.
1818  Handle<String> name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
1819  Expect(Token::LPAREN, CHECK_OK);
1820  bool done = (peek() == Token::RPAREN);
1821  while (!done) {
1822    ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
1823    done = (peek() == Token::RPAREN);
1824    if (!done) {
1825      Expect(Token::COMMA, CHECK_OK);
1826    }
1827  }
1828  Expect(Token::RPAREN, CHECK_OK);
1829  Expect(Token::SEMICOLON, CHECK_OK);
1830
1831  // Make sure that the function containing the native declaration
1832  // isn't lazily compiled. The extension structures are only
1833  // accessible while parsing the first time not when reparsing
1834  // because of lazy compilation.
1835  DeclarationScope(VAR)->ForceEagerCompilation();
1836
1837  // TODO(1240846): It's weird that native function declarations are
1838  // introduced dynamically when we meet their declarations, whereas
1839  // other functions are set up when entering the surrounding scope.
1840  VariableProxy* proxy = NewUnresolved(name, VAR, Interface::NewValue());
1841  Declaration* declaration =
1842      factory()->NewVariableDeclaration(proxy, VAR, scope_, pos);
1843  Declare(declaration, true, CHECK_OK);
1844  NativeFunctionLiteral* lit = factory()->NewNativeFunctionLiteral(
1845      name, extension_, RelocInfo::kNoPosition);
1846  return factory()->NewExpressionStatement(
1847      factory()->NewAssignment(
1848          Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition),
1849      pos);
1850}
1851
1852
1853Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) {
1854  // FunctionDeclaration ::
1855  //   'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
1856  // GeneratorDeclaration ::
1857  //   'function' '*' Identifier '(' FormalParameterListopt ')'
1858  //      '{' FunctionBody '}'
1859  Expect(Token::FUNCTION, CHECK_OK);
1860  int pos = position();
1861  bool is_generator = allow_generators() && Check(Token::MUL);
1862  bool is_strict_reserved = false;
1863  Handle<String> name = ParseIdentifierOrStrictReservedWord(
1864      &is_strict_reserved, CHECK_OK);
1865  FunctionLiteral* fun = ParseFunctionLiteral(name,
1866                                              scanner()->location(),
1867                                              is_strict_reserved,
1868                                              is_generator,
1869                                              pos,
1870                                              FunctionLiteral::DECLARATION,
1871                                              FunctionLiteral::NORMAL_ARITY,
1872                                              CHECK_OK);
1873  // Even if we're not at the top-level of the global or a function
1874  // scope, we treat it as such and introduce the function with its
1875  // initial value upon entering the corresponding scope.
1876  // In extended mode, a function behaves as a lexical binding, except in the
1877  // global scope.
1878  VariableMode mode =
1879      allow_harmony_scoping() &&
1880      strict_mode() == STRICT && !scope_->is_global_scope() ? LET : VAR;
1881  VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue());
1882  Declaration* declaration =
1883      factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
1884  Declare(declaration, true, CHECK_OK);
1885  if (names) names->Add(name, zone());
1886  return factory()->NewEmptyStatement(RelocInfo::kNoPosition);
1887}
1888
1889
1890Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) {
1891  if (allow_harmony_scoping() && strict_mode() == STRICT) {
1892    return ParseScopedBlock(labels, ok);
1893  }
1894
1895  // Block ::
1896  //   '{' Statement* '}'
1897
1898  // Note that a Block does not introduce a new execution scope!
1899  // (ECMA-262, 3rd, 12.2)
1900  //
1901  // Construct block expecting 16 statements.
1902  Block* result =
1903      factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
1904  Target target(&this->target_stack_, result);
1905  Expect(Token::LBRACE, CHECK_OK);
1906  while (peek() != Token::RBRACE) {
1907    Statement* stat = ParseStatement(NULL, CHECK_OK);
1908    if (stat && !stat->IsEmpty()) {
1909      result->AddStatement(stat, zone());
1910    }
1911  }
1912  Expect(Token::RBRACE, CHECK_OK);
1913  return result;
1914}
1915
1916
1917Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) {
1918  // The harmony mode uses block elements instead of statements.
1919  //
1920  // Block ::
1921  //   '{' BlockElement* '}'
1922
1923  // Construct block expecting 16 statements.
1924  Block* body =
1925      factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition);
1926  Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
1927
1928  // Parse the statements and collect escaping labels.
1929  Expect(Token::LBRACE, CHECK_OK);
1930  block_scope->set_start_position(scanner()->location().beg_pos);
1931  { BlockState block_state(&scope_, block_scope);
1932    TargetCollector collector(zone());
1933    Target target(&this->target_stack_, &collector);
1934    Target target_body(&this->target_stack_, body);
1935
1936    while (peek() != Token::RBRACE) {
1937      Statement* stat = ParseBlockElement(NULL, CHECK_OK);
1938      if (stat && !stat->IsEmpty()) {
1939        body->AddStatement(stat, zone());
1940      }
1941    }
1942  }
1943  Expect(Token::RBRACE, CHECK_OK);
1944  block_scope->set_end_position(scanner()->location().end_pos);
1945  block_scope = block_scope->FinalizeBlockScope();
1946  body->set_scope(block_scope);
1947  return body;
1948}
1949
1950
1951Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context,
1952                                      ZoneStringList* names,
1953                                      bool* ok) {
1954  // VariableStatement ::
1955  //   VariableDeclarations ';'
1956
1957  Handle<String> ignore;
1958  Block* result =
1959      ParseVariableDeclarations(var_context, NULL, names, &ignore, CHECK_OK);
1960  ExpectSemicolon(CHECK_OK);
1961  return result;
1962}
1963
1964
1965// If the variable declaration declares exactly one non-const
1966// variable, then *out is set to that variable. In all other cases,
1967// *out is untouched; in particular, it is the caller's responsibility
1968// to initialize it properly. This mechanism is used for the parsing
1969// of 'for-in' loops.
1970Block* Parser::ParseVariableDeclarations(
1971    VariableDeclarationContext var_context,
1972    VariableDeclarationProperties* decl_props,
1973    ZoneStringList* names,
1974    Handle<String>* out,
1975    bool* ok) {
1976  // VariableDeclarations ::
1977  //   ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']
1978  //
1979  // The ES6 Draft Rev3 specifies the following grammar for const declarations
1980  //
1981  // ConstDeclaration ::
1982  //   const ConstBinding (',' ConstBinding)* ';'
1983  // ConstBinding ::
1984  //   Identifier '=' AssignmentExpression
1985  //
1986  // TODO(ES6):
1987  // ConstBinding ::
1988  //   BindingPattern '=' AssignmentExpression
1989
1990  int pos = peek_position();
1991  VariableMode mode = VAR;
1992  // True if the binding needs initialization. 'let' and 'const' declared
1993  // bindings are created uninitialized by their declaration nodes and
1994  // need initialization. 'var' declared bindings are always initialized
1995  // immediately by their declaration nodes.
1996  bool needs_init = false;
1997  bool is_const = false;
1998  Token::Value init_op = Token::INIT_VAR;
1999  if (peek() == Token::VAR) {
2000    Consume(Token::VAR);
2001  } else if (peek() == Token::CONST) {
2002    // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads:
2003    //
2004    // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
2005    //
2006    // * It is a Syntax Error if the code that matches this production is not
2007    //   contained in extended code.
2008    //
2009    // However disallowing const in sloppy mode will break compatibility with
2010    // existing pages. Therefore we keep allowing const with the old
2011    // non-harmony semantics in sloppy mode.
2012    Consume(Token::CONST);
2013    switch (strict_mode()) {
2014      case SLOPPY:
2015        mode = CONST_LEGACY;
2016        init_op = Token::INIT_CONST_LEGACY;
2017        break;
2018      case STRICT:
2019        if (allow_harmony_scoping()) {
2020          if (var_context == kStatement) {
2021            // In strict mode 'const' declarations are only allowed in source
2022            // element positions.
2023            ReportMessage("unprotected_const");
2024            *ok = false;
2025            return NULL;
2026          }
2027          mode = CONST;
2028          init_op = Token::INIT_CONST;
2029        } else {
2030          ReportMessage("strict_const");
2031          *ok = false;
2032          return NULL;
2033        }
2034    }
2035    is_const = true;
2036    needs_init = true;
2037  } else if (peek() == Token::LET) {
2038    // ES6 Draft Rev4 section 12.2.1:
2039    //
2040    // LetDeclaration : let LetBindingList ;
2041    //
2042    // * It is a Syntax Error if the code that matches this production is not
2043    //   contained in extended code.
2044    //
2045    // TODO(rossberg): make 'let' a legal identifier in sloppy mode.
2046    if (!allow_harmony_scoping() || strict_mode() == SLOPPY) {
2047      ReportMessage("illegal_let");
2048      *ok = false;
2049      return NULL;
2050    }
2051    Consume(Token::LET);
2052    if (var_context == kStatement) {
2053      // Let declarations are only allowed in source element positions.
2054      ReportMessage("unprotected_let");
2055      *ok = false;
2056      return NULL;
2057    }
2058    mode = LET;
2059    needs_init = true;
2060    init_op = Token::INIT_LET;
2061  } else {
2062    UNREACHABLE();  // by current callers
2063  }
2064
2065  Scope* declaration_scope = DeclarationScope(mode);
2066
2067  // The scope of a var/const declared variable anywhere inside a function
2068  // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can
2069  // transform a source-level var/const declaration into a (Function)
2070  // Scope declaration, and rewrite the source-level initialization into an
2071  // assignment statement. We use a block to collect multiple assignments.
2072  //
2073  // We mark the block as initializer block because we don't want the
2074  // rewriter to add a '.result' assignment to such a block (to get compliant
2075  // behavior for code such as print(eval('var x = 7')), and for cosmetic
2076  // reasons when pretty-printing. Also, unless an assignment (initialization)
2077  // is inside an initializer block, it is ignored.
2078  //
2079  // Create new block with one expected declaration.
2080  Block* block = factory()->NewBlock(NULL, 1, true, pos);
2081  int nvars = 0;  // the number of variables declared
2082  Handle<String> name;
2083  do {
2084    if (fni_ != NULL) fni_->Enter();
2085
2086    // Parse variable name.
2087    if (nvars > 0) Consume(Token::COMMA);
2088    name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
2089    if (fni_ != NULL) fni_->PushVariableName(name);
2090
2091    // Declare variable.
2092    // Note that we *always* must treat the initial value via a separate init
2093    // assignment for variables and constants because the value must be assigned
2094    // when the variable is encountered in the source. But the variable/constant
2095    // is declared (and set to 'undefined') upon entering the function within
2096    // which the variable or constant is declared. Only function variables have
2097    // an initial value in the declaration (because they are initialized upon
2098    // entering the function).
2099    //
2100    // If we have a const declaration, in an inner scope, the proxy is always
2101    // bound to the declared variable (independent of possibly surrounding with
2102    // statements).
2103    // For let/const declarations in harmony mode, we can also immediately
2104    // pre-resolve the proxy because it resides in the same scope as the
2105    // declaration.
2106    Interface* interface =
2107        is_const ? Interface::NewConst() : Interface::NewValue();
2108    VariableProxy* proxy = NewUnresolved(name, mode, interface);
2109    Declaration* declaration =
2110        factory()->NewVariableDeclaration(proxy, mode, scope_, pos);
2111    Declare(declaration, mode != VAR, CHECK_OK);
2112    nvars++;
2113    if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) {
2114      ReportMessage("too_many_variables");
2115      *ok = false;
2116      return NULL;
2117    }
2118    if (names) names->Add(name, zone());
2119
2120    // Parse initialization expression if present and/or needed. A
2121    // declaration of the form:
2122    //
2123    //    var v = x;
2124    //
2125    // is syntactic sugar for:
2126    //
2127    //    var v; v = x;
2128    //
2129    // In particular, we need to re-lookup 'v' (in scope_, not
2130    // declaration_scope) as it may be a different 'v' than the 'v' in the
2131    // declaration (e.g., if we are inside a 'with' statement or 'catch'
2132    // block).
2133    //
2134    // However, note that const declarations are different! A const
2135    // declaration of the form:
2136    //
2137    //   const c = x;
2138    //
2139    // is *not* syntactic sugar for:
2140    //
2141    //   const c; c = x;
2142    //
2143    // The "variable" c initialized to x is the same as the declared
2144    // one - there is no re-lookup (see the last parameter of the
2145    // Declare() call above).
2146
2147    Scope* initialization_scope = is_const ? declaration_scope : scope_;
2148    Expression* value = NULL;
2149    int pos = -1;
2150    // Harmony consts have non-optional initializers.
2151    if (peek() == Token::ASSIGN || mode == CONST) {
2152      Expect(Token::ASSIGN, CHECK_OK);
2153      pos = position();
2154      value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
2155      // Don't infer if it is "a = function(){...}();"-like expression.
2156      if (fni_ != NULL &&
2157          value->AsCall() == NULL &&
2158          value->AsCallNew() == NULL) {
2159        fni_->Infer();
2160      } else {
2161        fni_->RemoveLastFunction();
2162      }
2163      if (decl_props != NULL) *decl_props = kHasInitializers;
2164    }
2165
2166    // Record the end position of the initializer.
2167    if (proxy->var() != NULL) {
2168      proxy->var()->set_initializer_position(position());
2169    }
2170
2171    // Make sure that 'const x' and 'let x' initialize 'x' to undefined.
2172    if (value == NULL && needs_init) {
2173      value = GetLiteralUndefined(position());
2174    }
2175
2176    // Global variable declarations must be compiled in a specific
2177    // way. When the script containing the global variable declaration
2178    // is entered, the global variable must be declared, so that if it
2179    // doesn't exist (on the global object itself, see ES5 errata) it
2180    // gets created with an initial undefined value. This is handled
2181    // by the declarations part of the function representing the
2182    // top-level global code; see Runtime::DeclareGlobalVariable. If
2183    // it already exists (in the object or in a prototype), it is
2184    // *not* touched until the variable declaration statement is
2185    // executed.
2186    //
2187    // Executing the variable declaration statement will always
2188    // guarantee to give the global object a "local" variable; a
2189    // variable defined in the global object and not in any
2190    // prototype. This way, global variable declarations can shadow
2191    // properties in the prototype chain, but only after the variable
2192    // declaration statement has been executed. This is important in
2193    // browsers where the global object (window) has lots of
2194    // properties defined in prototype objects.
2195    if (initialization_scope->is_global_scope() &&
2196        !IsLexicalVariableMode(mode)) {
2197      // Compute the arguments for the runtime call.
2198      ZoneList<Expression*>* arguments =
2199          new(zone()) ZoneList<Expression*>(3, zone());
2200      // We have at least 1 parameter.
2201      arguments->Add(factory()->NewLiteral(name, pos), zone());
2202      CallRuntime* initialize;
2203
2204      if (is_const) {
2205        arguments->Add(value, zone());
2206        value = NULL;  // zap the value to avoid the unnecessary assignment
2207
2208        // Construct the call to Runtime_InitializeConstGlobal
2209        // and add it to the initialization statement block.
2210        // Note that the function does different things depending on
2211        // the number of arguments (1 or 2).
2212        initialize = factory()->NewCallRuntime(
2213            isolate()->factory()->InitializeConstGlobal_string(),
2214            Runtime::FunctionForId(Runtime::kHiddenInitializeConstGlobal),
2215            arguments, pos);
2216      } else {
2217        // Add strict mode.
2218        // We may want to pass singleton to avoid Literal allocations.
2219        StrictMode strict_mode = initialization_scope->strict_mode();
2220        arguments->Add(factory()->NewNumberLiteral(strict_mode, pos), zone());
2221
2222        // Be careful not to assign a value to the global variable if
2223        // we're in a with. The initialization value should not
2224        // necessarily be stored in the global object in that case,
2225        // which is why we need to generate a separate assignment node.
2226        if (value != NULL && !inside_with()) {
2227          arguments->Add(value, zone());
2228          value = NULL;  // zap the value to avoid the unnecessary assignment
2229        }
2230
2231        // Construct the call to Runtime_InitializeVarGlobal
2232        // and add it to the initialization statement block.
2233        // Note that the function does different things depending on
2234        // the number of arguments (2 or 3).
2235        initialize = factory()->NewCallRuntime(
2236            isolate()->factory()->InitializeVarGlobal_string(),
2237            Runtime::FunctionForId(Runtime::kInitializeVarGlobal),
2238            arguments, pos);
2239      }
2240
2241      block->AddStatement(
2242          factory()->NewExpressionStatement(initialize, RelocInfo::kNoPosition),
2243          zone());
2244    } else if (needs_init) {
2245      // Constant initializations always assign to the declared constant which
2246      // is always at the function scope level. This is only relevant for
2247      // dynamically looked-up variables and constants (the start context for
2248      // constant lookups is always the function context, while it is the top
2249      // context for var declared variables). Sigh...
2250      // For 'let' and 'const' declared variables in harmony mode the
2251      // initialization also always assigns to the declared variable.
2252      ASSERT(proxy != NULL);
2253      ASSERT(proxy->var() != NULL);
2254      ASSERT(value != NULL);
2255      Assignment* assignment =
2256          factory()->NewAssignment(init_op, proxy, value, pos);
2257      block->AddStatement(
2258          factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition),
2259          zone());
2260      value = NULL;
2261    }
2262
2263    // Add an assignment node to the initialization statement block if we still
2264    // have a pending initialization value.
2265    if (value != NULL) {
2266      ASSERT(mode == VAR);
2267      // 'var' initializations are simply assignments (with all the consequences
2268      // if they are inside a 'with' statement - they may change a 'with' object
2269      // property).
2270      VariableProxy* proxy =
2271          initialization_scope->NewUnresolved(factory(), name, interface);
2272      Assignment* assignment =
2273          factory()->NewAssignment(init_op, proxy, value, pos);
2274      block->AddStatement(
2275          factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition),
2276          zone());
2277    }
2278
2279    if (fni_ != NULL) fni_->Leave();
2280  } while (peek() == Token::COMMA);
2281
2282  // If there was a single non-const declaration, return it in the output
2283  // parameter for possible use by for/in.
2284  if (nvars == 1 && !is_const) {
2285    *out = name;
2286  }
2287
2288  return block;
2289}
2290
2291
2292static bool ContainsLabel(ZoneStringList* labels, Handle<String> label) {
2293  ASSERT(!label.is_null());
2294  if (labels != NULL) {
2295    for (int i = labels->length(); i-- > 0; ) {
2296      if (labels->at(i).is_identical_to(label)) {
2297        return true;
2298      }
2299    }
2300  }
2301  return false;
2302}
2303
2304
2305Statement* Parser::ParseExpressionOrLabelledStatement(ZoneStringList* labels,
2306                                                      bool* ok) {
2307  // ExpressionStatement | LabelledStatement ::
2308  //   Expression ';'
2309  //   Identifier ':' Statement
2310  int pos = peek_position();
2311  bool starts_with_idenfifier = peek_any_identifier();
2312  Expression* expr = ParseExpression(true, CHECK_OK);
2313  if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL &&
2314      expr->AsVariableProxy() != NULL &&
2315      !expr->AsVariableProxy()->is_this()) {
2316    // Expression is a single identifier, and not, e.g., a parenthesized
2317    // identifier.
2318    VariableProxy* var = expr->AsVariableProxy();
2319    Handle<String> label = var->name();
2320    // TODO(1240780): We don't check for redeclaration of labels
2321    // during preparsing since keeping track of the set of active
2322    // labels requires nontrivial changes to the way scopes are
2323    // structured.  However, these are probably changes we want to
2324    // make later anyway so we should go back and fix this then.
2325    if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) {
2326      ParserTraits::ReportMessage("label_redeclaration", label);
2327      *ok = false;
2328      return NULL;
2329    }
2330    if (labels == NULL) {
2331      labels = new(zone()) ZoneStringList(4, zone());
2332    }
2333    labels->Add(label, zone());
2334    // Remove the "ghost" variable that turned out to be a label
2335    // from the top scope. This way, we don't try to resolve it
2336    // during the scope processing.
2337    scope_->RemoveUnresolved(var);
2338    Expect(Token::COLON, CHECK_OK);
2339    return ParseStatement(labels, ok);
2340  }
2341
2342  // If we have an extension, we allow a native function declaration.
2343  // A native function declaration starts with "native function" with
2344  // no line-terminator between the two words.
2345  if (extension_ != NULL &&
2346      peek() == Token::FUNCTION &&
2347      !scanner()->HasAnyLineTerminatorBeforeNext() &&
2348      expr != NULL &&
2349      expr->AsVariableProxy() != NULL &&
2350      String::Equals(isolate()->factory()->native_string(),
2351                     expr->AsVariableProxy()->name()) &&
2352      !scanner()->literal_contains_escapes()) {
2353    return ParseNativeDeclaration(ok);
2354  }
2355
2356  // Parsed expression statement, or the context-sensitive 'module' keyword.
2357  // Only expect semicolon in the former case.
2358  if (!FLAG_harmony_modules ||
2359      peek() != Token::IDENTIFIER ||
2360      scanner()->HasAnyLineTerminatorBeforeNext() ||
2361      expr->AsVariableProxy() == NULL ||
2362      !String::Equals(isolate()->factory()->module_string(),
2363                      expr->AsVariableProxy()->name()) ||
2364      scanner()->literal_contains_escapes()) {
2365    ExpectSemicolon(CHECK_OK);
2366  }
2367  return factory()->NewExpressionStatement(expr, pos);
2368}
2369
2370
2371IfStatement* Parser::ParseIfStatement(ZoneStringList* labels, bool* ok) {
2372  // IfStatement ::
2373  //   'if' '(' Expression ')' Statement ('else' Statement)?
2374
2375  int pos = peek_position();
2376  Expect(Token::IF, CHECK_OK);
2377  Expect(Token::LPAREN, CHECK_OK);
2378  Expression* condition = ParseExpression(true, CHECK_OK);
2379  Expect(Token::RPAREN, CHECK_OK);
2380  Statement* then_statement = ParseStatement(labels, CHECK_OK);
2381  Statement* else_statement = NULL;
2382  if (peek() == Token::ELSE) {
2383    Next();
2384    else_statement = ParseStatement(labels, CHECK_OK);
2385  } else {
2386    else_statement = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
2387  }
2388  return factory()->NewIfStatement(
2389      condition, then_statement, else_statement, pos);
2390}
2391
2392
2393Statement* Parser::ParseContinueStatement(bool* ok) {
2394  // ContinueStatement ::
2395  //   'continue' Identifier? ';'
2396
2397  int pos = peek_position();
2398  Expect(Token::CONTINUE, CHECK_OK);
2399  Handle<String> label = Handle<String>::null();
2400  Token::Value tok = peek();
2401  if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
2402      tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) {
2403    // ECMA allows "eval" or "arguments" as labels even in strict mode.
2404    label = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
2405  }
2406  IterationStatement* target = NULL;
2407  target = LookupContinueTarget(label, CHECK_OK);
2408  if (target == NULL) {
2409    // Illegal continue statement.
2410    const char* message = "illegal_continue";
2411    if (!label.is_null()) {
2412      message = "unknown_label";
2413    }
2414    ParserTraits::ReportMessage(message, label);
2415    *ok = false;
2416    return NULL;
2417  }
2418  ExpectSemicolon(CHECK_OK);
2419  return factory()->NewContinueStatement(target, pos);
2420}
2421
2422
2423Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) {
2424  // BreakStatement ::
2425  //   'break' Identifier? ';'
2426
2427  int pos = peek_position();
2428  Expect(Token::BREAK, CHECK_OK);
2429  Handle<String> label;
2430  Token::Value tok = peek();
2431  if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
2432      tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) {
2433    // ECMA allows "eval" or "arguments" as labels even in strict mode.
2434    label = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
2435  }
2436  // Parse labeled break statements that target themselves into
2437  // empty statements, e.g. 'l1: l2: l3: break l2;'
2438  if (!label.is_null() && ContainsLabel(labels, label)) {
2439    ExpectSemicolon(CHECK_OK);
2440    return factory()->NewEmptyStatement(pos);
2441  }
2442  BreakableStatement* target = NULL;
2443  target = LookupBreakTarget(label, CHECK_OK);
2444  if (target == NULL) {
2445    // Illegal break statement.
2446    const char* message = "illegal_break";
2447    if (!label.is_null()) {
2448      message = "unknown_label";
2449    }
2450    ParserTraits::ReportMessage(message, label);
2451    *ok = false;
2452    return NULL;
2453  }
2454  ExpectSemicolon(CHECK_OK);
2455  return factory()->NewBreakStatement(target, pos);
2456}
2457
2458
2459Statement* Parser::ParseReturnStatement(bool* ok) {
2460  // ReturnStatement ::
2461  //   'return' Expression? ';'
2462
2463  // Consume the return token. It is necessary to do that before
2464  // reporting any errors on it, because of the way errors are
2465  // reported (underlining).
2466  Expect(Token::RETURN, CHECK_OK);
2467  Scanner::Location loc = scanner()->location();
2468
2469  Token::Value tok = peek();
2470  Statement* result;
2471  Expression* return_value;
2472  if (scanner()->HasAnyLineTerminatorBeforeNext() ||
2473      tok == Token::SEMICOLON ||
2474      tok == Token::RBRACE ||
2475      tok == Token::EOS) {
2476    return_value = GetLiteralUndefined(position());
2477  } else {
2478    return_value = ParseExpression(true, CHECK_OK);
2479  }
2480  ExpectSemicolon(CHECK_OK);
2481  if (is_generator()) {
2482    Expression* generator = factory()->NewVariableProxy(
2483        function_state_->generator_object_variable());
2484    Expression* yield = factory()->NewYield(
2485        generator, return_value, Yield::FINAL, loc.beg_pos);
2486    result = factory()->NewExpressionStatement(yield, loc.beg_pos);
2487  } else {
2488    result = factory()->NewReturnStatement(return_value, loc.beg_pos);
2489  }
2490
2491  Scope* decl_scope = scope_->DeclarationScope();
2492  if (decl_scope->is_global_scope() || decl_scope->is_eval_scope()) {
2493    ReportMessageAt(loc, "illegal_return");
2494    *ok = false;
2495    return NULL;
2496  }
2497  return result;
2498}
2499
2500
2501Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) {
2502  // WithStatement ::
2503  //   'with' '(' Expression ')' Statement
2504
2505  Expect(Token::WITH, CHECK_OK);
2506  int pos = position();
2507
2508  if (strict_mode() == STRICT) {
2509    ReportMessage("strict_mode_with");
2510    *ok = false;
2511    return NULL;
2512  }
2513
2514  Expect(Token::LPAREN, CHECK_OK);
2515  Expression* expr = ParseExpression(true, CHECK_OK);
2516  Expect(Token::RPAREN, CHECK_OK);
2517
2518  scope_->DeclarationScope()->RecordWithStatement();
2519  Scope* with_scope = NewScope(scope_, WITH_SCOPE);
2520  Statement* stmt;
2521  { BlockState block_state(&scope_, with_scope);
2522    with_scope->set_start_position(scanner()->peek_location().beg_pos);
2523    stmt = ParseStatement(labels, CHECK_OK);
2524    with_scope->set_end_position(scanner()->location().end_pos);
2525  }
2526  return factory()->NewWithStatement(with_scope, expr, stmt, pos);
2527}
2528
2529
2530CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) {
2531  // CaseClause ::
2532  //   'case' Expression ':' Statement*
2533  //   'default' ':' Statement*
2534
2535  Expression* label = NULL;  // NULL expression indicates default case
2536  if (peek() == Token::CASE) {
2537    Expect(Token::CASE, CHECK_OK);
2538    label = ParseExpression(true, CHECK_OK);
2539  } else {
2540    Expect(Token::DEFAULT, CHECK_OK);
2541    if (*default_seen_ptr) {
2542      ReportMessage("multiple_defaults_in_switch");
2543      *ok = false;
2544      return NULL;
2545    }
2546    *default_seen_ptr = true;
2547  }
2548  Expect(Token::COLON, CHECK_OK);
2549  int pos = position();
2550  ZoneList<Statement*>* statements =
2551      new(zone()) ZoneList<Statement*>(5, zone());
2552  while (peek() != Token::CASE &&
2553         peek() != Token::DEFAULT &&
2554         peek() != Token::RBRACE) {
2555    Statement* stat = ParseStatement(NULL, CHECK_OK);
2556    statements->Add(stat, zone());
2557  }
2558
2559  return factory()->NewCaseClause(label, statements, pos);
2560}
2561
2562
2563SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels,
2564                                              bool* ok) {
2565  // SwitchStatement ::
2566  //   'switch' '(' Expression ')' '{' CaseClause* '}'
2567
2568  SwitchStatement* statement =
2569      factory()->NewSwitchStatement(labels, peek_position());
2570  Target target(&this->target_stack_, statement);
2571
2572  Expect(Token::SWITCH, CHECK_OK);
2573  Expect(Token::LPAREN, CHECK_OK);
2574  Expression* tag = ParseExpression(true, CHECK_OK);
2575  Expect(Token::RPAREN, CHECK_OK);
2576
2577  bool default_seen = false;
2578  ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4, zone());
2579  Expect(Token::LBRACE, CHECK_OK);
2580  while (peek() != Token::RBRACE) {
2581    CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK);
2582    cases->Add(clause, zone());
2583  }
2584  Expect(Token::RBRACE, CHECK_OK);
2585
2586  if (statement) statement->Initialize(tag, cases);
2587  return statement;
2588}
2589
2590
2591Statement* Parser::ParseThrowStatement(bool* ok) {
2592  // ThrowStatement ::
2593  //   'throw' Expression ';'
2594
2595  Expect(Token::THROW, CHECK_OK);
2596  int pos = position();
2597  if (scanner()->HasAnyLineTerminatorBeforeNext()) {
2598    ReportMessage("newline_after_throw");
2599    *ok = false;
2600    return NULL;
2601  }
2602  Expression* exception = ParseExpression(true, CHECK_OK);
2603  ExpectSemicolon(CHECK_OK);
2604
2605  return factory()->NewExpressionStatement(
2606      factory()->NewThrow(exception, pos), pos);
2607}
2608
2609
2610TryStatement* Parser::ParseTryStatement(bool* ok) {
2611  // TryStatement ::
2612  //   'try' Block Catch
2613  //   'try' Block Finally
2614  //   'try' Block Catch Finally
2615  //
2616  // Catch ::
2617  //   'catch' '(' Identifier ')' Block
2618  //
2619  // Finally ::
2620  //   'finally' Block
2621
2622  Expect(Token::TRY, CHECK_OK);
2623  int pos = position();
2624
2625  TargetCollector try_collector(zone());
2626  Block* try_block;
2627
2628  { Target target(&this->target_stack_, &try_collector);
2629    try_block = ParseBlock(NULL, CHECK_OK);
2630  }
2631
2632  Token::Value tok = peek();
2633  if (tok != Token::CATCH && tok != Token::FINALLY) {
2634    ReportMessage("no_catch_or_finally");
2635    *ok = false;
2636    return NULL;
2637  }
2638
2639  // If we can break out from the catch block and there is a finally block,
2640  // then we will need to collect escaping targets from the catch
2641  // block. Since we don't know yet if there will be a finally block, we
2642  // always collect the targets.
2643  TargetCollector catch_collector(zone());
2644  Scope* catch_scope = NULL;
2645  Variable* catch_variable = NULL;
2646  Block* catch_block = NULL;
2647  Handle<String> name;
2648  if (tok == Token::CATCH) {
2649    Consume(Token::CATCH);
2650
2651    Expect(Token::LPAREN, CHECK_OK);
2652    catch_scope = NewScope(scope_, CATCH_SCOPE);
2653    catch_scope->set_start_position(scanner()->location().beg_pos);
2654    name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
2655
2656    Expect(Token::RPAREN, CHECK_OK);
2657
2658    Target target(&this->target_stack_, &catch_collector);
2659    VariableMode mode =
2660        allow_harmony_scoping() && strict_mode() == STRICT ? LET : VAR;
2661    catch_variable =
2662        catch_scope->DeclareLocal(name, mode, kCreatedInitialized);
2663
2664    BlockState block_state(&scope_, catch_scope);
2665    catch_block = ParseBlock(NULL, CHECK_OK);
2666
2667    catch_scope->set_end_position(scanner()->location().end_pos);
2668    tok = peek();
2669  }
2670
2671  Block* finally_block = NULL;
2672  ASSERT(tok == Token::FINALLY || catch_block != NULL);
2673  if (tok == Token::FINALLY) {
2674    Consume(Token::FINALLY);
2675    finally_block = ParseBlock(NULL, CHECK_OK);
2676  }
2677
2678  // Simplify the AST nodes by converting:
2679  //   'try B0 catch B1 finally B2'
2680  // to:
2681  //   'try { try B0 catch B1 } finally B2'
2682
2683  if (catch_block != NULL && finally_block != NULL) {
2684    // If we have both, create an inner try/catch.
2685    ASSERT(catch_scope != NULL && catch_variable != NULL);
2686    int index = function_state_->NextHandlerIndex();
2687    TryCatchStatement* statement = factory()->NewTryCatchStatement(
2688        index, try_block, catch_scope, catch_variable, catch_block,
2689        RelocInfo::kNoPosition);
2690    statement->set_escaping_targets(try_collector.targets());
2691    try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition);
2692    try_block->AddStatement(statement, zone());
2693    catch_block = NULL;  // Clear to indicate it's been handled.
2694  }
2695
2696  TryStatement* result = NULL;
2697  if (catch_block != NULL) {
2698    ASSERT(finally_block == NULL);
2699    ASSERT(catch_scope != NULL && catch_variable != NULL);
2700    int index = function_state_->NextHandlerIndex();
2701    result = factory()->NewTryCatchStatement(
2702        index, try_block, catch_scope, catch_variable, catch_block, pos);
2703  } else {
2704    ASSERT(finally_block != NULL);
2705    int index = function_state_->NextHandlerIndex();
2706    result = factory()->NewTryFinallyStatement(
2707        index, try_block, finally_block, pos);
2708    // Combine the jump targets of the try block and the possible catch block.
2709    try_collector.targets()->AddAll(*catch_collector.targets(), zone());
2710  }
2711
2712  result->set_escaping_targets(try_collector.targets());
2713  return result;
2714}
2715
2716
2717DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels,
2718                                                bool* ok) {
2719  // DoStatement ::
2720  //   'do' Statement 'while' '(' Expression ')' ';'
2721
2722  DoWhileStatement* loop =
2723      factory()->NewDoWhileStatement(labels, peek_position());
2724  Target target(&this->target_stack_, loop);
2725
2726  Expect(Token::DO, CHECK_OK);
2727  Statement* body = ParseStatement(NULL, CHECK_OK);
2728  Expect(Token::WHILE, CHECK_OK);
2729  Expect(Token::LPAREN, CHECK_OK);
2730
2731  Expression* cond = ParseExpression(true, CHECK_OK);
2732  Expect(Token::RPAREN, CHECK_OK);
2733
2734  // Allow do-statements to be terminated with and without
2735  // semi-colons. This allows code such as 'do;while(0)return' to
2736  // parse, which would not be the case if we had used the
2737  // ExpectSemicolon() functionality here.
2738  if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON);
2739
2740  if (loop != NULL) loop->Initialize(cond, body);
2741  return loop;
2742}
2743
2744
2745WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) {
2746  // WhileStatement ::
2747  //   'while' '(' Expression ')' Statement
2748
2749  WhileStatement* loop = factory()->NewWhileStatement(labels, peek_position());
2750  Target target(&this->target_stack_, loop);
2751
2752  Expect(Token::WHILE, CHECK_OK);
2753  Expect(Token::LPAREN, CHECK_OK);
2754  Expression* cond = ParseExpression(true, CHECK_OK);
2755  Expect(Token::RPAREN, CHECK_OK);
2756  Statement* body = ParseStatement(NULL, CHECK_OK);
2757
2758  if (loop != NULL) loop->Initialize(cond, body);
2759  return loop;
2760}
2761
2762
2763bool Parser::CheckInOrOf(bool accept_OF,
2764                         ForEachStatement::VisitMode* visit_mode) {
2765  if (Check(Token::IN)) {
2766    *visit_mode = ForEachStatement::ENUMERATE;
2767    return true;
2768  } else if (allow_for_of() && accept_OF &&
2769             CheckContextualKeyword(CStrVector("of"))) {
2770    *visit_mode = ForEachStatement::ITERATE;
2771    return true;
2772  }
2773  return false;
2774}
2775
2776
2777void Parser::InitializeForEachStatement(ForEachStatement* stmt,
2778                                        Expression* each,
2779                                        Expression* subject,
2780                                        Statement* body) {
2781  ForOfStatement* for_of = stmt->AsForOfStatement();
2782
2783  if (for_of != NULL) {
2784    Factory* heap_factory = isolate()->factory();
2785    Variable* iterable = scope_->DeclarationScope()->NewTemporary(
2786        heap_factory->dot_iterable_string());
2787    Variable* iterator = scope_->DeclarationScope()->NewTemporary(
2788        heap_factory->dot_iterator_string());
2789    Variable* result = scope_->DeclarationScope()->NewTemporary(
2790        heap_factory->dot_result_string());
2791
2792    Expression* assign_iterable;
2793    Expression* assign_iterator;
2794    Expression* next_result;
2795    Expression* result_done;
2796    Expression* assign_each;
2797
2798    // var iterable = subject;
2799    {
2800      Expression* iterable_proxy = factory()->NewVariableProxy(iterable);
2801      assign_iterable = factory()->NewAssignment(
2802          Token::ASSIGN, iterable_proxy, subject, subject->position());
2803    }
2804
2805    // var iterator = iterable[Symbol.iterator]();
2806    {
2807      Expression* iterable_proxy = factory()->NewVariableProxy(iterable);
2808      Handle<Symbol> iterator_symbol(
2809          isolate()->native_context()->iterator_symbol(), isolate());
2810      Expression* iterator_symbol_literal = factory()->NewLiteral(
2811          iterator_symbol, RelocInfo::kNoPosition);
2812      // FIXME(wingo): Unhappily, it will be a common error that the RHS of a
2813      // for-of doesn't have a Symbol.iterator property.  We should do better
2814      // than informing the user that "undefined is not a function".
2815      int pos = subject->position();
2816      Expression* iterator_property = factory()->NewProperty(
2817          iterable_proxy, iterator_symbol_literal, pos);
2818      ZoneList<Expression*>* iterator_arguments =
2819          new(zone()) ZoneList<Expression*>(0, zone());
2820      Expression* iterator_call = factory()->NewCall(
2821          iterator_property, iterator_arguments, pos);
2822      Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
2823      assign_iterator = factory()->NewAssignment(
2824          Token::ASSIGN, iterator_proxy, iterator_call, RelocInfo::kNoPosition);
2825    }
2826
2827    // var result = iterator.next();
2828    {
2829      Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
2830      Expression* next_literal = factory()->NewLiteral(
2831          heap_factory->next_string(), RelocInfo::kNoPosition);
2832      Expression* next_property = factory()->NewProperty(
2833          iterator_proxy, next_literal, RelocInfo::kNoPosition);
2834      ZoneList<Expression*>* next_arguments =
2835          new(zone()) ZoneList<Expression*>(0, zone());
2836      Expression* next_call = factory()->NewCall(
2837          next_property, next_arguments, RelocInfo::kNoPosition);
2838      Expression* result_proxy = factory()->NewVariableProxy(result);
2839      next_result = factory()->NewAssignment(
2840          Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition);
2841    }
2842
2843    // result.done
2844    {
2845      Expression* done_literal = factory()->NewLiteral(
2846          heap_factory->done_string(), RelocInfo::kNoPosition);
2847      Expression* result_proxy = factory()->NewVariableProxy(result);
2848      result_done = factory()->NewProperty(
2849          result_proxy, done_literal, RelocInfo::kNoPosition);
2850    }
2851
2852    // each = result.value
2853    {
2854      Expression* value_literal = factory()->NewLiteral(
2855          heap_factory->value_string(), RelocInfo::kNoPosition);
2856      Expression* result_proxy = factory()->NewVariableProxy(result);
2857      Expression* result_value = factory()->NewProperty(
2858          result_proxy, value_literal, RelocInfo::kNoPosition);
2859      assign_each = factory()->NewAssignment(
2860          Token::ASSIGN, each, result_value, RelocInfo::kNoPosition);
2861    }
2862
2863    for_of->Initialize(each, subject, body,
2864                       assign_iterable,
2865                       assign_iterator,
2866                       next_result,
2867                       result_done,
2868                       assign_each);
2869  } else {
2870    stmt->Initialize(each, subject, body);
2871  }
2872}
2873
2874
2875Statement* Parser::DesugarLetBindingsInForStatement(
2876    Scope* inner_scope, ZoneStringList* names, ForStatement* loop,
2877    Statement* init, Expression* cond, Statement* next, Statement* body,
2878    bool* ok) {
2879  // ES6 13.6.3.4 specifies that on each loop iteration the let variables are
2880  // copied into a new environment. After copying, the "next" statement of the
2881  // loop is executed to update the loop variables. The loop condition is
2882  // checked and the loop body is executed.
2883  //
2884  // We rewrite a for statement of the form
2885  //
2886  //  for (let x = i; cond; next) body
2887  //
2888  // into
2889  //
2890  //  {
2891  //     let x = i;
2892  //     temp_x = x;
2893  //     flag = 1;
2894  //     for (;;) {
2895  //        let x = temp_x;
2896  //        if (flag == 1) {
2897  //          flag = 0;
2898  //        } else {
2899  //          next;
2900  //        }
2901  //        if (cond) {
2902  //          <empty>
2903  //        } else {
2904  //          break;
2905  //        }
2906  //        b
2907  //        temp_x = x;
2908  //     }
2909  //  }
2910
2911  ASSERT(names->length() > 0);
2912  Scope* for_scope = scope_;
2913  ZoneList<Variable*> temps(names->length(), zone());
2914
2915  Block* outer_block = factory()->NewBlock(NULL, names->length() + 3, false,
2916                                           RelocInfo::kNoPosition);
2917  outer_block->AddStatement(init, zone());
2918
2919  Handle<String> temp_name = isolate()->factory()->dot_for_string();
2920  Handle<Smi> smi0 = handle(Smi::FromInt(0), isolate());
2921  Handle<Smi> smi1 = handle(Smi::FromInt(1), isolate());
2922
2923
2924  // For each let variable x:
2925  //   make statement: temp_x = x.
2926  for (int i = 0; i < names->length(); i++) {
2927    VariableProxy* proxy =
2928        NewUnresolved(names->at(i), LET, Interface::NewValue());
2929    Variable* temp = scope_->DeclarationScope()->NewTemporary(temp_name);
2930    VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
2931    Assignment* assignment = factory()->NewAssignment(
2932        Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition);
2933    Statement* assignment_statement = factory()->NewExpressionStatement(
2934        assignment, RelocInfo::kNoPosition);
2935    outer_block->AddStatement(assignment_statement, zone());
2936    temps.Add(temp, zone());
2937  }
2938
2939  Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name);
2940  // Make statement: flag = 1.
2941  {
2942    VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2943    Expression* const1 = factory()->NewLiteral(smi1, RelocInfo::kNoPosition);
2944    Assignment* assignment = factory()->NewAssignment(
2945        Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition);
2946    Statement* assignment_statement = factory()->NewExpressionStatement(
2947        assignment, RelocInfo::kNoPosition);
2948    outer_block->AddStatement(assignment_statement, zone());
2949  }
2950
2951  outer_block->AddStatement(loop, zone());
2952  outer_block->set_scope(for_scope);
2953  scope_ = inner_scope;
2954
2955  Block* inner_block = factory()->NewBlock(NULL, 2 * names->length() + 3,
2956                                           false, RelocInfo::kNoPosition);
2957  int pos = scanner()->location().beg_pos;
2958  ZoneList<Variable*> inner_vars(names->length(), zone());
2959
2960  // For each let variable x:
2961  //    make statement: let x = temp_x.
2962  for (int i = 0; i < names->length(); i++) {
2963    VariableProxy* proxy =
2964        NewUnresolved(names->at(i), LET, Interface::NewValue());
2965    Declaration* declaration =
2966        factory()->NewVariableDeclaration(proxy, LET, scope_, pos);
2967    Declare(declaration, true, CHECK_OK);
2968    inner_vars.Add(declaration->proxy()->var(), zone());
2969    VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i));
2970    Assignment* assignment = factory()->NewAssignment(
2971        Token::INIT_LET, proxy, temp_proxy, pos);
2972    Statement* assignment_statement = factory()->NewExpressionStatement(
2973        assignment, pos);
2974    proxy->var()->set_initializer_position(pos);
2975    inner_block->AddStatement(assignment_statement, zone());
2976  }
2977
2978  // Make statement: if (flag == 1) { flag = 0; } else { next; }.
2979  {
2980    Expression* compare = NULL;
2981    // Make compare expresion: flag == 1.
2982    {
2983      Expression* const1 = factory()->NewLiteral(smi1, RelocInfo::kNoPosition);
2984      VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2985      compare = factory()->NewCompareOperation(
2986          Token::EQ, flag_proxy, const1, pos);
2987    }
2988    Statement* clear_flag = NULL;
2989    // Make statement: flag = 0.
2990    {
2991      VariableProxy* flag_proxy = factory()->NewVariableProxy(flag);
2992      Expression* const0 = factory()->NewLiteral(smi0, RelocInfo::kNoPosition);
2993      Assignment* assignment = factory()->NewAssignment(
2994          Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition);
2995      clear_flag = factory()->NewExpressionStatement(assignment, pos);
2996    }
2997    Statement* clear_flag_or_next = factory()->NewIfStatement(
2998        compare, clear_flag, next, RelocInfo::kNoPosition);
2999    inner_block->AddStatement(clear_flag_or_next, zone());
3000  }
3001
3002
3003  // Make statement: if (cond) { } else { break; }.
3004  {
3005    Statement* empty = factory()->NewEmptyStatement(RelocInfo::kNoPosition);
3006    BreakableStatement* t = LookupBreakTarget(Handle<String>(), CHECK_OK);
3007    Statement* stop = factory()->NewBreakStatement(t, RelocInfo::kNoPosition);
3008    Statement* if_not_cond_break = factory()->NewIfStatement(
3009        cond, empty, stop, cond->position());
3010    inner_block->AddStatement(if_not_cond_break, zone());
3011  }
3012
3013  inner_block->AddStatement(body, zone());
3014
3015  // For each let variable x:
3016  //   make statement: temp_x = x;
3017  for (int i = 0; i < names->length(); i++) {
3018    VariableProxy* temp_proxy = factory()->NewVariableProxy(temps.at(i));
3019    int pos = scanner()->location().end_pos;
3020    VariableProxy* proxy = factory()->NewVariableProxy(inner_vars.at(i), pos);
3021    Assignment* assignment = factory()->NewAssignment(
3022        Token::ASSIGN, temp_proxy, proxy, RelocInfo::kNoPosition);
3023    Statement* assignment_statement = factory()->NewExpressionStatement(
3024        assignment, RelocInfo::kNoPosition);
3025    inner_block->AddStatement(assignment_statement, zone());
3026  }
3027
3028  inner_scope->set_end_position(scanner()->location().end_pos);
3029  inner_block->set_scope(inner_scope);
3030  scope_ = for_scope;
3031
3032  loop->Initialize(NULL, NULL, NULL, inner_block);
3033  return outer_block;
3034}
3035
3036
3037Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
3038  // ForStatement ::
3039  //   'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
3040
3041  int pos = peek_position();
3042  Statement* init = NULL;
3043  ZoneStringList let_bindings(1, zone());
3044
3045  // Create an in-between scope for let-bound iteration variables.
3046  Scope* saved_scope = scope_;
3047  Scope* for_scope = NewScope(scope_, BLOCK_SCOPE);
3048  scope_ = for_scope;
3049
3050  Expect(Token::FOR, CHECK_OK);
3051  Expect(Token::LPAREN, CHECK_OK);
3052  for_scope->set_start_position(scanner()->location().beg_pos);
3053  if (peek() != Token::SEMICOLON) {
3054    if (peek() == Token::VAR || peek() == Token::CONST) {
3055      bool is_const = peek() == Token::CONST;
3056      Handle<String> name;
3057      VariableDeclarationProperties decl_props = kHasNoInitializers;
3058      Block* variable_statement =
3059          ParseVariableDeclarations(kForStatement, &decl_props, NULL, &name,
3060                                    CHECK_OK);
3061      bool accept_OF = decl_props == kHasNoInitializers;
3062      ForEachStatement::VisitMode mode;
3063
3064      if (!name.is_null() && CheckInOrOf(accept_OF, &mode)) {
3065        Interface* interface =
3066            is_const ? Interface::NewConst() : Interface::NewValue();
3067        ForEachStatement* loop =
3068            factory()->NewForEachStatement(mode, labels, pos);
3069        Target target(&this->target_stack_, loop);
3070
3071        Expression* enumerable = ParseExpression(true, CHECK_OK);
3072        Expect(Token::RPAREN, CHECK_OK);
3073
3074        VariableProxy* each =
3075            scope_->NewUnresolved(factory(), name, interface);
3076        Statement* body = ParseStatement(NULL, CHECK_OK);
3077        InitializeForEachStatement(loop, each, enumerable, body);
3078        Block* result =
3079            factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition);
3080        result->AddStatement(variable_statement, zone());
3081        result->AddStatement(loop, zone());
3082        scope_ = saved_scope;
3083        for_scope->set_end_position(scanner()->location().end_pos);
3084        for_scope = for_scope->FinalizeBlockScope();
3085        ASSERT(for_scope == NULL);
3086        // Parsed for-in loop w/ variable/const declaration.
3087        return result;
3088      } else {
3089        init = variable_statement;
3090      }
3091    } else if (peek() == Token::LET) {
3092      Handle<String> name;
3093      VariableDeclarationProperties decl_props = kHasNoInitializers;
3094      Block* variable_statement =
3095         ParseVariableDeclarations(kForStatement, &decl_props, &let_bindings,
3096                                   &name, CHECK_OK);
3097      bool accept_IN = !name.is_null() && decl_props != kHasInitializers;
3098      bool accept_OF = decl_props == kHasNoInitializers;
3099      ForEachStatement::VisitMode mode;
3100
3101      if (accept_IN && CheckInOrOf(accept_OF, &mode)) {
3102        // Rewrite a for-in statement of the form
3103        //
3104        //   for (let x in e) b
3105        //
3106        // into
3107        //
3108        //   <let x' be a temporary variable>
3109        //   for (x' in e) {
3110        //     let x;
3111        //     x = x';
3112        //     b;
3113        //   }
3114
3115        // TODO(keuchel): Move the temporary variable to the block scope, after
3116        // implementing stack allocated block scoped variables.
3117        Factory* heap_factory = isolate()->factory();
3118        Handle<String> tempstr;
3119        ASSIGN_RETURN_ON_EXCEPTION_VALUE(
3120            isolate(), tempstr,
3121            heap_factory->NewConsString(heap_factory->dot_for_string(), name),
3122            0);
3123        Handle<String> tempname = heap_factory->InternalizeString(tempstr);
3124        Variable* temp = scope_->DeclarationScope()->NewTemporary(tempname);
3125        VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
3126        ForEachStatement* loop =
3127            factory()->NewForEachStatement(mode, labels, pos);
3128        Target target(&this->target_stack_, loop);
3129
3130        // The expression does not see the loop variable.
3131        scope_ = saved_scope;
3132        Expression* enumerable = ParseExpression(true, CHECK_OK);
3133        scope_ = for_scope;
3134        Expect(Token::RPAREN, CHECK_OK);
3135
3136        VariableProxy* each =
3137            scope_->NewUnresolved(factory(), name, Interface::NewValue());
3138        Statement* body = ParseStatement(NULL, CHECK_OK);
3139        Block* body_block =
3140            factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition);
3141        Assignment* assignment = factory()->NewAssignment(
3142            Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition);
3143        Statement* assignment_statement = factory()->NewExpressionStatement(
3144            assignment, RelocInfo::kNoPosition);
3145        body_block->AddStatement(variable_statement, zone());
3146        body_block->AddStatement(assignment_statement, zone());
3147        body_block->AddStatement(body, zone());
3148        InitializeForEachStatement(loop, temp_proxy, enumerable, body_block);
3149        scope_ = saved_scope;
3150        for_scope->set_end_position(scanner()->location().end_pos);
3151        for_scope = for_scope->FinalizeBlockScope();
3152        body_block->set_scope(for_scope);
3153        // Parsed for-in loop w/ let declaration.
3154        return loop;
3155
3156      } else {
3157        init = variable_statement;
3158      }
3159    } else {
3160      Scanner::Location lhs_location = scanner()->peek_location();
3161      Expression* expression = ParseExpression(false, CHECK_OK);
3162      ForEachStatement::VisitMode mode;
3163      bool accept_OF = expression->AsVariableProxy();
3164
3165      if (CheckInOrOf(accept_OF, &mode)) {
3166        expression = this->CheckAndRewriteReferenceExpression(
3167            expression, lhs_location, "invalid_lhs_in_for", CHECK_OK);
3168
3169        ForEachStatement* loop =
3170            factory()->NewForEachStatement(mode, labels, pos);
3171        Target target(&this->target_stack_, loop);
3172
3173        Expression* enumerable = ParseExpression(true, CHECK_OK);
3174        Expect(Token::RPAREN, CHECK_OK);
3175
3176        Statement* body = ParseStatement(NULL, CHECK_OK);
3177        InitializeForEachStatement(loop, expression, enumerable, body);
3178        scope_ = saved_scope;
3179        for_scope->set_end_position(scanner()->location().end_pos);
3180        for_scope = for_scope->FinalizeBlockScope();
3181        ASSERT(for_scope == NULL);
3182        // Parsed for-in loop.
3183        return loop;
3184
3185      } else {
3186        init = factory()->NewExpressionStatement(
3187            expression, RelocInfo::kNoPosition);
3188      }
3189    }
3190  }
3191
3192  // Standard 'for' loop
3193  ForStatement* loop = factory()->NewForStatement(labels, pos);
3194  Target target(&this->target_stack_, loop);
3195
3196  // Parsed initializer at this point.
3197  Expect(Token::SEMICOLON, CHECK_OK);
3198
3199  // If there are let bindings, then condition and the next statement of the
3200  // for loop must be parsed in a new scope.
3201  Scope* inner_scope = NULL;
3202  if (let_bindings.length() > 0) {
3203    inner_scope = NewScope(for_scope, BLOCK_SCOPE);
3204    inner_scope->set_start_position(scanner()->location().beg_pos);
3205    scope_ = inner_scope;
3206  }
3207
3208  Expression* cond = NULL;
3209  if (peek() != Token::SEMICOLON) {
3210    cond = ParseExpression(true, CHECK_OK);
3211  }
3212  Expect(Token::SEMICOLON, CHECK_OK);
3213
3214  Statement* next = NULL;
3215  if (peek() != Token::RPAREN) {
3216    Expression* exp = ParseExpression(true, CHECK_OK);
3217    next = factory()->NewExpressionStatement(exp, RelocInfo::kNoPosition);
3218  }
3219  Expect(Token::RPAREN, CHECK_OK);
3220
3221  Statement* body = ParseStatement(NULL, CHECK_OK);
3222
3223  Statement* result = NULL;
3224  if (let_bindings.length() > 0) {
3225    scope_ = for_scope;
3226    result = DesugarLetBindingsInForStatement(inner_scope, &let_bindings, loop,
3227                                              init, cond, next, body, CHECK_OK);
3228    scope_ = saved_scope;
3229    for_scope->set_end_position(scanner()->location().end_pos);
3230  } else {
3231    loop->Initialize(init, cond, next, body);
3232    result = loop;
3233    scope_ = saved_scope;
3234    for_scope->set_end_position(scanner()->location().end_pos);
3235    for_scope->FinalizeBlockScope();
3236  }
3237  return result;
3238}
3239
3240
3241DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) {
3242  // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
3243  // contexts this is used as a statement which invokes the debugger as i a
3244  // break point is present.
3245  // DebuggerStatement ::
3246  //   'debugger' ';'
3247
3248  int pos = peek_position();
3249  Expect(Token::DEBUGGER, CHECK_OK);
3250  ExpectSemicolon(CHECK_OK);
3251  return factory()->NewDebuggerStatement(pos);
3252}
3253
3254
3255void Parser::ReportInvalidCachedData(Handle<String> name, bool* ok) {
3256  ParserTraits::ReportMessage("invalid_cached_data_function", name);
3257  *ok = false;
3258}
3259
3260
3261bool CompileTimeValue::IsCompileTimeValue(Expression* expression) {
3262  if (expression->IsLiteral()) return true;
3263  MaterializedLiteral* lit = expression->AsMaterializedLiteral();
3264  return lit != NULL && lit->is_simple();
3265}
3266
3267
3268Handle<FixedArray> CompileTimeValue::GetValue(Isolate* isolate,
3269                                              Expression* expression) {
3270  Factory* factory = isolate->factory();
3271  ASSERT(IsCompileTimeValue(expression));
3272  Handle<FixedArray> result = factory->NewFixedArray(2, TENURED);
3273  ObjectLiteral* object_literal = expression->AsObjectLiteral();
3274  if (object_literal != NULL) {
3275    ASSERT(object_literal->is_simple());
3276    if (object_literal->fast_elements()) {
3277      result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS));
3278    } else {
3279      result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS));
3280    }
3281    result->set(kElementsSlot, *object_literal->constant_properties());
3282  } else {
3283    ArrayLiteral* array_literal = expression->AsArrayLiteral();
3284    ASSERT(array_literal != NULL && array_literal->is_simple());
3285    result->set(kLiteralTypeSlot, Smi::FromInt(ARRAY_LITERAL));
3286    result->set(kElementsSlot, *array_literal->constant_elements());
3287  }
3288  return result;
3289}
3290
3291
3292CompileTimeValue::LiteralType CompileTimeValue::GetLiteralType(
3293    Handle<FixedArray> value) {
3294  Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot));
3295  return static_cast<LiteralType>(literal_type->value());
3296}
3297
3298
3299Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) {
3300  return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot)));
3301}
3302
3303
3304FunctionLiteral* Parser::ParseFunctionLiteral(
3305    Handle<String> function_name,
3306    Scanner::Location function_name_location,
3307    bool name_is_strict_reserved,
3308    bool is_generator,
3309    int function_token_pos,
3310    FunctionLiteral::FunctionType function_type,
3311    FunctionLiteral::ArityRestriction arity_restriction,
3312    bool* ok) {
3313  // Function ::
3314  //   '(' FormalParameterList? ')' '{' FunctionBody '}'
3315  //
3316  // Getter ::
3317  //   '(' ')' '{' FunctionBody '}'
3318  //
3319  // Setter ::
3320  //   '(' PropertySetParameterList ')' '{' FunctionBody '}'
3321
3322  int pos = function_token_pos == RelocInfo::kNoPosition
3323      ? peek_position() : function_token_pos;
3324
3325  // Anonymous functions were passed either the empty symbol or a null
3326  // handle as the function name.  Remember if we were passed a non-empty
3327  // handle to decide whether to invoke function name inference.
3328  bool should_infer_name = function_name.is_null();
3329
3330  // We want a non-null handle as the function name.
3331  if (should_infer_name) {
3332    function_name = isolate()->factory()->empty_string();
3333  }
3334
3335  int num_parameters = 0;
3336  // Function declarations are function scoped in normal mode, so they are
3337  // hoisted. In harmony block scoping mode they are block scoped, so they
3338  // are not hoisted.
3339  //
3340  // One tricky case are function declarations in a local sloppy-mode eval:
3341  // their declaration is hoisted, but they still see the local scope. E.g.,
3342  //
3343  // function() {
3344  //   var x = 0
3345  //   try { throw 1 } catch (x) { eval("function g() { return x }") }
3346  //   return g()
3347  // }
3348  //
3349  // needs to return 1. To distinguish such cases, we need to detect
3350  // (1) whether a function stems from a sloppy eval, and
3351  // (2) whether it actually hoists across the eval.
3352  // Unfortunately, we do not represent sloppy eval scopes, so we do not have
3353  // either information available directly, especially not when lazily compiling
3354  // a function like 'g'. We hence rely on the following invariants:
3355  // - (1) is the case iff the innermost scope of the deserialized scope chain
3356  //   under which we compile is _not_ a declaration scope. This holds because
3357  //   in all normal cases, function declarations are fully hoisted to a
3358  //   declaration scope and compiled relative to that.
3359  // - (2) is the case iff the current declaration scope is still the original
3360  //   one relative to the deserialized scope chain. Otherwise we must be
3361  //   compiling a function in an inner declaration scope in the eval, e.g. a
3362  //   nested function, and hoisting works normally relative to that.
3363  Scope* declaration_scope = scope_->DeclarationScope();
3364  Scope* original_declaration_scope = original_scope_->DeclarationScope();
3365  Scope* scope =
3366      function_type == FunctionLiteral::DECLARATION &&
3367      (!allow_harmony_scoping() || strict_mode() == SLOPPY) &&
3368      (original_scope_ == original_declaration_scope ||
3369       declaration_scope != original_declaration_scope)
3370          ? NewScope(declaration_scope, FUNCTION_SCOPE)
3371          : NewScope(scope_, FUNCTION_SCOPE);
3372  ZoneList<Statement*>* body = NULL;
3373  int materialized_literal_count = -1;
3374  int expected_property_count = -1;
3375  int handler_count = 0;
3376  FunctionLiteral::ParameterFlag duplicate_parameters =
3377      FunctionLiteral::kNoDuplicateParameters;
3378  FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_
3379      ? FunctionLiteral::kIsParenthesized
3380      : FunctionLiteral::kNotParenthesized;
3381  AstProperties ast_properties;
3382  BailoutReason dont_optimize_reason = kNoReason;
3383  // Parse function body.
3384  { FunctionState function_state(&function_state_, &scope_, scope, zone());
3385    scope_->SetScopeName(function_name);
3386
3387    if (is_generator) {
3388      // For generators, allocating variables in contexts is currently a win
3389      // because it minimizes the work needed to suspend and resume an
3390      // activation.
3391      scope_->ForceContextAllocation();
3392
3393      // Calling a generator returns a generator object.  That object is stored
3394      // in a temporary variable, a definition that is used by "yield"
3395      // expressions. This also marks the FunctionState as a generator.
3396      Variable* temp = scope_->DeclarationScope()->NewTemporary(
3397          isolate()->factory()->dot_generator_object_string());
3398      function_state.set_generator_object_variable(temp);
3399    }
3400
3401    //  FormalParameterList ::
3402    //    '(' (Identifier)*[','] ')'
3403    Expect(Token::LPAREN, CHECK_OK);
3404    scope->set_start_position(scanner()->location().beg_pos);
3405
3406    // We don't yet know if the function will be strict, so we cannot yet
3407    // produce errors for parameter names or duplicates. However, we remember
3408    // the locations of these errors if they occur and produce the errors later.
3409    Scanner::Location eval_args_error_log = Scanner::Location::invalid();
3410    Scanner::Location dupe_error_loc = Scanner::Location::invalid();
3411    Scanner::Location reserved_loc = Scanner::Location::invalid();
3412
3413    bool done = arity_restriction == FunctionLiteral::GETTER_ARITY ||
3414        (peek() == Token::RPAREN &&
3415         arity_restriction != FunctionLiteral::SETTER_ARITY);
3416    while (!done) {
3417      bool is_strict_reserved = false;
3418      Handle<String> param_name =
3419          ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
3420
3421      // Store locations for possible future error reports.
3422      if (!eval_args_error_log.IsValid() && IsEvalOrArguments(param_name)) {
3423        eval_args_error_log = scanner()->location();
3424      }
3425      if (!reserved_loc.IsValid() && is_strict_reserved) {
3426        reserved_loc = scanner()->location();
3427      }
3428      if (!dupe_error_loc.IsValid() && scope_->IsDeclared(param_name)) {
3429        duplicate_parameters = FunctionLiteral::kHasDuplicateParameters;
3430        dupe_error_loc = scanner()->location();
3431      }
3432
3433      scope_->DeclareParameter(param_name, VAR);
3434      num_parameters++;
3435      if (num_parameters > Code::kMaxArguments) {
3436        ReportMessage("too_many_parameters");
3437        *ok = false;
3438        return NULL;
3439      }
3440      if (arity_restriction == FunctionLiteral::SETTER_ARITY) break;
3441      done = (peek() == Token::RPAREN);
3442      if (!done) Expect(Token::COMMA, CHECK_OK);
3443    }
3444    Expect(Token::RPAREN, CHECK_OK);
3445
3446    Expect(Token::LBRACE, CHECK_OK);
3447
3448    // If we have a named function expression, we add a local variable
3449    // declaration to the body of the function with the name of the
3450    // function and let it refer to the function itself (closure).
3451    // NOTE: We create a proxy and resolve it here so that in the
3452    // future we can change the AST to only refer to VariableProxies
3453    // instead of Variables and Proxis as is the case now.
3454    Variable* fvar = NULL;
3455    Token::Value fvar_init_op = Token::INIT_CONST_LEGACY;
3456    if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
3457      if (allow_harmony_scoping() && strict_mode() == STRICT) {
3458        fvar_init_op = Token::INIT_CONST;
3459      }
3460      VariableMode fvar_mode =
3461          allow_harmony_scoping() && strict_mode() == STRICT ? CONST
3462                                                             : CONST_LEGACY;
3463      fvar = new(zone()) Variable(scope_,
3464         function_name, fvar_mode, true /* is valid LHS */,
3465         Variable::NORMAL, kCreatedInitialized, Interface::NewConst());
3466      VariableProxy* proxy = factory()->NewVariableProxy(fvar);
3467      VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration(
3468          proxy, fvar_mode, scope_, RelocInfo::kNoPosition);
3469      scope_->DeclareFunctionVar(fvar_declaration);
3470    }
3471
3472    // Determine if the function can be parsed lazily. Lazy parsing is different
3473    // from lazy compilation; we need to parse more eagerly than we compile.
3474
3475    // We can only parse lazily if we also compile lazily. The heuristics for
3476    // lazy compilation are:
3477    // - It must not have been prohibited by the caller to Parse (some callers
3478    //   need a full AST).
3479    // - The outer scope must allow lazy compilation of inner functions.
3480    // - The function mustn't be a function expression with an open parenthesis
3481    //   before; we consider that a hint that the function will be called
3482    //   immediately, and it would be a waste of time to make it lazily
3483    //   compiled.
3484    // These are all things we can know at this point, without looking at the
3485    // function itself.
3486
3487    // In addition, we need to distinguish between these cases:
3488    // (function foo() {
3489    //   bar = function() { return 1; }
3490    //  })();
3491    // and
3492    // (function foo() {
3493    //   var a = 1;
3494    //   bar = function() { return a; }
3495    //  })();
3496
3497    // Now foo will be parsed eagerly and compiled eagerly (optimization: assume
3498    // parenthesis before the function means that it will be called
3499    // immediately). The inner function *must* be parsed eagerly to resolve the
3500    // possible reference to the variable in foo's scope. However, it's possible
3501    // that it will be compiled lazily.
3502
3503    // To make this additional case work, both Parser and PreParser implement a
3504    // logic where only top-level functions will be parsed lazily.
3505    bool is_lazily_parsed = (mode() == PARSE_LAZILY &&
3506                             scope_->AllowsLazyCompilation() &&
3507                             !parenthesized_function_);
3508    parenthesized_function_ = false;  // The bit was set for this function only.
3509
3510    if (is_lazily_parsed) {
3511      SkipLazyFunctionBody(function_name, &materialized_literal_count,
3512                           &expected_property_count, CHECK_OK);
3513    } else {
3514      body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op,
3515                                    is_generator, CHECK_OK);
3516      materialized_literal_count = function_state.materialized_literal_count();
3517      expected_property_count = function_state.expected_property_count();
3518      handler_count = function_state.handler_count();
3519    }
3520
3521    // Validate strict mode. We can do this only after parsing the function,
3522    // since the function can declare itself strict.
3523    if (strict_mode() == STRICT) {
3524      if (IsEvalOrArguments(function_name)) {
3525        ReportMessageAt(function_name_location, "strict_eval_arguments");
3526        *ok = false;
3527        return NULL;
3528      }
3529      if (name_is_strict_reserved) {
3530        ReportMessageAt(function_name_location, "unexpected_strict_reserved");
3531        *ok = false;
3532        return NULL;
3533      }
3534      if (eval_args_error_log.IsValid()) {
3535        ReportMessageAt(eval_args_error_log, "strict_eval_arguments");
3536        *ok = false;
3537        return NULL;
3538      }
3539      if (dupe_error_loc.IsValid()) {
3540        ReportMessageAt(dupe_error_loc, "strict_param_dupe");
3541        *ok = false;
3542        return NULL;
3543      }
3544      if (reserved_loc.IsValid()) {
3545        ReportMessageAt(reserved_loc, "unexpected_strict_reserved");
3546        *ok = false;
3547        return NULL;
3548      }
3549      CheckOctalLiteral(scope->start_position(),
3550                        scope->end_position(),
3551                        CHECK_OK);
3552    }
3553    ast_properties = *factory()->visitor()->ast_properties();
3554    dont_optimize_reason = factory()->visitor()->dont_optimize_reason();
3555  }
3556
3557  if (allow_harmony_scoping() && strict_mode() == STRICT) {
3558    CheckConflictingVarDeclarations(scope, CHECK_OK);
3559  }
3560
3561  FunctionLiteral::IsGeneratorFlag generator = is_generator
3562      ? FunctionLiteral::kIsGenerator
3563      : FunctionLiteral::kNotGenerator;
3564  FunctionLiteral* function_literal =
3565      factory()->NewFunctionLiteral(function_name,
3566                                    scope,
3567                                    body,
3568                                    materialized_literal_count,
3569                                    expected_property_count,
3570                                    handler_count,
3571                                    num_parameters,
3572                                    duplicate_parameters,
3573                                    function_type,
3574                                    FunctionLiteral::kIsFunction,
3575                                    parenthesized,
3576                                    generator,
3577                                    pos);
3578  function_literal->set_function_token_position(function_token_pos);
3579  function_literal->set_ast_properties(&ast_properties);
3580  function_literal->set_dont_optimize_reason(dont_optimize_reason);
3581
3582  if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal);
3583  return function_literal;
3584}
3585
3586
3587void Parser::SkipLazyFunctionBody(Handle<String> function_name,
3588                                  int* materialized_literal_count,
3589                                  int* expected_property_count,
3590                                  bool* ok) {
3591  int function_block_pos = position();
3592  if (cached_data_mode_ == CONSUME_CACHED_DATA) {
3593    // If we have cached data, we use it to skip parsing the function body. The
3594    // data contains the information we need to construct the lazy function.
3595    FunctionEntry entry =
3596        (*cached_data())->GetFunctionEntry(function_block_pos);
3597    if (entry.is_valid()) {
3598      if (entry.end_pos() <= function_block_pos) {
3599        // End position greater than end of stream is safe, and hard to check.
3600        ReportInvalidCachedData(function_name, ok);
3601        if (!*ok) {
3602          return;
3603        }
3604      }
3605      scanner()->SeekForward(entry.end_pos() - 1);
3606
3607      scope_->set_end_position(entry.end_pos());
3608      Expect(Token::RBRACE, ok);
3609      if (!*ok) {
3610        return;
3611      }
3612      isolate()->counters()->total_preparse_skipped()->Increment(
3613          scope_->end_position() - function_block_pos);
3614      *materialized_literal_count = entry.literal_count();
3615      *expected_property_count = entry.property_count();
3616      scope_->SetStrictMode(entry.strict_mode());
3617    } else {
3618      // This case happens when we have preparse data but it doesn't contain an
3619      // entry for the function. Fail the compilation.
3620      ReportInvalidCachedData(function_name, ok);
3621      return;
3622    }
3623  } else {
3624    // With no cached data, we partially parse the function, without building an
3625    // AST. This gathers the data needed to build a lazy function.
3626    SingletonLogger logger;
3627    PreParser::PreParseResult result =
3628        ParseLazyFunctionBodyWithPreParser(&logger);
3629    if (result == PreParser::kPreParseStackOverflow) {
3630      // Propagate stack overflow.
3631      set_stack_overflow();
3632      *ok = false;
3633      return;
3634    }
3635    if (logger.has_error()) {
3636      ParserTraits::ReportMessageAt(
3637          Scanner::Location(logger.start(), logger.end()),
3638          logger.message(), logger.argument_opt(), logger.is_reference_error());
3639      *ok = false;
3640      return;
3641    }
3642    scope_->set_end_position(logger.end());
3643    Expect(Token::RBRACE, ok);
3644    if (!*ok) {
3645      return;
3646    }
3647    isolate()->counters()->total_preparse_skipped()->Increment(
3648        scope_->end_position() - function_block_pos);
3649    *materialized_literal_count = logger.literals();
3650    *expected_property_count = logger.properties();
3651    scope_->SetStrictMode(logger.strict_mode());
3652    if (cached_data_mode_ == PRODUCE_CACHED_DATA) {
3653      ASSERT(log_);
3654      // Position right after terminal '}'.
3655      int body_end = scanner()->location().end_pos;
3656      log_->LogFunction(function_block_pos, body_end,
3657                        *materialized_literal_count,
3658                        *expected_property_count,
3659                        scope_->strict_mode());
3660    }
3661  }
3662}
3663
3664
3665ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
3666    Handle<String> function_name, int pos, Variable* fvar,
3667    Token::Value fvar_init_op, bool is_generator, bool* ok) {
3668  // Everything inside an eagerly parsed function will be parsed eagerly
3669  // (see comment above).
3670  ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
3671  ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone());
3672  if (fvar != NULL) {
3673    VariableProxy* fproxy = scope_->NewUnresolved(
3674        factory(), function_name, Interface::NewConst());
3675    fproxy->BindTo(fvar);
3676    body->Add(factory()->NewExpressionStatement(
3677        factory()->NewAssignment(fvar_init_op,
3678                                 fproxy,
3679                                 factory()->NewThisFunction(pos),
3680                                 RelocInfo::kNoPosition),
3681        RelocInfo::kNoPosition), zone());
3682  }
3683
3684  // For generators, allocate and yield an iterator on function entry.
3685  if (is_generator) {
3686    ZoneList<Expression*>* arguments =
3687        new(zone()) ZoneList<Expression*>(0, zone());
3688    CallRuntime* allocation = factory()->NewCallRuntime(
3689        isolate()->factory()->empty_string(),
3690        Runtime::FunctionForId(Runtime::kHiddenCreateJSGeneratorObject),
3691        arguments, pos);
3692    VariableProxy* init_proxy = factory()->NewVariableProxy(
3693        function_state_->generator_object_variable());
3694    Assignment* assignment = factory()->NewAssignment(
3695        Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition);
3696    VariableProxy* get_proxy = factory()->NewVariableProxy(
3697        function_state_->generator_object_variable());
3698    Yield* yield = factory()->NewYield(
3699        get_proxy, assignment, Yield::INITIAL, RelocInfo::kNoPosition);
3700    body->Add(factory()->NewExpressionStatement(
3701        yield, RelocInfo::kNoPosition), zone());
3702  }
3703
3704  ParseSourceElements(body, Token::RBRACE, false, false, CHECK_OK);
3705
3706  if (is_generator) {
3707    VariableProxy* get_proxy = factory()->NewVariableProxy(
3708        function_state_->generator_object_variable());
3709    Expression *undefined = factory()->NewLiteral(
3710        isolate()->factory()->undefined_value(), RelocInfo::kNoPosition);
3711    Yield* yield = factory()->NewYield(
3712        get_proxy, undefined, Yield::FINAL, RelocInfo::kNoPosition);
3713    body->Add(factory()->NewExpressionStatement(
3714        yield, RelocInfo::kNoPosition), zone());
3715  }
3716
3717  Expect(Token::RBRACE, CHECK_OK);
3718  scope_->set_end_position(scanner()->location().end_pos);
3719
3720  return body;
3721}
3722
3723
3724PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
3725    SingletonLogger* logger) {
3726  HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse());
3727  ASSERT_EQ(Token::LBRACE, scanner()->current_token());
3728
3729  if (reusable_preparser_ == NULL) {
3730    intptr_t stack_limit = isolate()->stack_guard()->real_climit();
3731    reusable_preparser_ = new PreParser(&scanner_, NULL, stack_limit);
3732    reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping());
3733    reusable_preparser_->set_allow_modules(allow_modules());
3734    reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax());
3735    reusable_preparser_->set_allow_lazy(true);
3736    reusable_preparser_->set_allow_generators(allow_generators());
3737    reusable_preparser_->set_allow_for_of(allow_for_of());
3738    reusable_preparser_->set_allow_harmony_numeric_literals(
3739        allow_harmony_numeric_literals());
3740  }
3741  PreParser::PreParseResult result =
3742      reusable_preparser_->PreParseLazyFunction(strict_mode(),
3743                                                is_generator(),
3744                                                logger);
3745  return result;
3746}
3747
3748
3749Expression* Parser::ParseV8Intrinsic(bool* ok) {
3750  // CallRuntime ::
3751  //   '%' Identifier Arguments
3752
3753  int pos = peek_position();
3754  Expect(Token::MOD, CHECK_OK);
3755  // Allow "eval" or "arguments" for backward compatibility.
3756  Handle<String> name = ParseIdentifier(kAllowEvalOrArguments, CHECK_OK);
3757  ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
3758
3759  if (extension_ != NULL) {
3760    // The extension structures are only accessible while parsing the
3761    // very first time not when reparsing because of lazy compilation.
3762    scope_->DeclarationScope()->ForceEagerCompilation();
3763  }
3764
3765  const Runtime::Function* function = Runtime::FunctionForName(name);
3766
3767  // Check for built-in IS_VAR macro.
3768  if (function != NULL &&
3769      function->intrinsic_type == Runtime::RUNTIME &&
3770      function->function_id == Runtime::kIS_VAR) {
3771    // %IS_VAR(x) evaluates to x if x is a variable,
3772    // leads to a parse error otherwise.  Could be implemented as an
3773    // inline function %_IS_VAR(x) to eliminate this special case.
3774    if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) {
3775      return args->at(0);
3776    } else {
3777      ReportMessage("not_isvar");
3778      *ok = false;
3779      return NULL;
3780    }
3781  }
3782
3783  // Check that the expected number of arguments are being passed.
3784  if (function != NULL &&
3785      function->nargs != -1 &&
3786      function->nargs != args->length()) {
3787    ReportMessage("illegal_access");
3788    *ok = false;
3789    return NULL;
3790  }
3791
3792  // Check that the function is defined if it's an inline runtime call.
3793  if (function == NULL && name->Get(0) == '_') {
3794    ParserTraits::ReportMessage("not_defined", name);
3795    *ok = false;
3796    return NULL;
3797  }
3798
3799  // We have a valid intrinsics call or a call to a builtin.
3800  return factory()->NewCallRuntime(name, function, args, pos);
3801}
3802
3803
3804Literal* Parser::GetLiteralUndefined(int position) {
3805  return factory()->NewLiteral(
3806      isolate()->factory()->undefined_value(), position);
3807}
3808
3809
3810void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
3811  Declaration* decl = scope->CheckConflictingVarDeclarations();
3812  if (decl != NULL) {
3813    // In harmony mode we treat conflicting variable bindinds as early
3814    // errors. See ES5 16 for a definition of early errors.
3815    Handle<String> name = decl->proxy()->name();
3816    int position = decl->proxy()->position();
3817    Scanner::Location location = position == RelocInfo::kNoPosition
3818        ? Scanner::Location::invalid()
3819        : Scanner::Location(position, position + 1);
3820    ParserTraits::ReportMessageAt(location, "var_redeclaration", name);
3821    *ok = false;
3822  }
3823}
3824
3825
3826// ----------------------------------------------------------------------------
3827// Parser support
3828
3829
3830bool Parser::TargetStackContainsLabel(Handle<String> label) {
3831  for (Target* t = target_stack_; t != NULL; t = t->previous()) {
3832    BreakableStatement* stat = t->node()->AsBreakableStatement();
3833    if (stat != NULL && ContainsLabel(stat->labels(), label))
3834      return true;
3835  }
3836  return false;
3837}
3838
3839
3840BreakableStatement* Parser::LookupBreakTarget(Handle<String> label, bool* ok) {
3841  bool anonymous = label.is_null();
3842  for (Target* t = target_stack_; t != NULL; t = t->previous()) {
3843    BreakableStatement* stat = t->node()->AsBreakableStatement();
3844    if (stat == NULL) continue;
3845    if ((anonymous && stat->is_target_for_anonymous()) ||
3846        (!anonymous && ContainsLabel(stat->labels(), label))) {
3847      RegisterTargetUse(stat->break_target(), t->previous());
3848      return stat;
3849    }
3850  }
3851  return NULL;
3852}
3853
3854
3855IterationStatement* Parser::LookupContinueTarget(Handle<String> label,
3856                                                 bool* ok) {
3857  bool anonymous = label.is_null();
3858  for (Target* t = target_stack_; t != NULL; t = t->previous()) {
3859    IterationStatement* stat = t->node()->AsIterationStatement();
3860    if (stat == NULL) continue;
3861
3862    ASSERT(stat->is_target_for_anonymous());
3863    if (anonymous || ContainsLabel(stat->labels(), label)) {
3864      RegisterTargetUse(stat->continue_target(), t->previous());
3865      return stat;
3866    }
3867  }
3868  return NULL;
3869}
3870
3871
3872void Parser::RegisterTargetUse(Label* target, Target* stop) {
3873  // Register that a break target found at the given stop in the
3874  // target stack has been used from the top of the target stack. Add
3875  // the break target to any TargetCollectors passed on the stack.
3876  for (Target* t = target_stack_; t != stop; t = t->previous()) {
3877    TargetCollector* collector = t->node()->AsTargetCollector();
3878    if (collector != NULL) collector->AddTarget(target, zone());
3879  }
3880}
3881
3882
3883void Parser::ThrowPendingError() {
3884  if (has_pending_error_) {
3885    MessageLocation location(script_,
3886                             pending_error_location_.beg_pos,
3887                             pending_error_location_.end_pos);
3888    Factory* factory = isolate()->factory();
3889    bool has_arg =
3890        !pending_error_arg_.is_null() || pending_error_char_arg_ != NULL;
3891    Handle<FixedArray> elements = factory->NewFixedArray(has_arg ? 1 : 0);
3892    if (!pending_error_arg_.is_null()) {
3893      elements->set(0, *(pending_error_arg_.ToHandleChecked()));
3894    } else if (pending_error_char_arg_ != NULL) {
3895      Handle<String> arg_string =
3896          factory->NewStringFromUtf8(CStrVector(pending_error_char_arg_))
3897          .ToHandleChecked();
3898      elements->set(0, *arg_string);
3899    }
3900    Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
3901    Handle<Object> result = pending_error_is_reference_error_
3902        ? factory->NewReferenceError(pending_error_message_, array)
3903        : factory->NewSyntaxError(pending_error_message_, array);
3904    isolate()->Throw(*result, &location);
3905  }
3906}
3907
3908
3909// ----------------------------------------------------------------------------
3910// Regular expressions
3911
3912
3913RegExpParser::RegExpParser(FlatStringReader* in,
3914                           Handle<String>* error,
3915                           bool multiline,
3916                           Zone* zone)
3917    : isolate_(zone->isolate()),
3918      zone_(zone),
3919      error_(error),
3920      captures_(NULL),
3921      in_(in),
3922      current_(kEndMarker),
3923      next_pos_(0),
3924      capture_count_(0),
3925      has_more_(true),
3926      multiline_(multiline),
3927      simple_(false),
3928      contains_anchor_(false),
3929      is_scanned_for_captures_(false),
3930      failed_(false) {
3931  Advance();
3932}
3933
3934
3935uc32 RegExpParser::Next() {
3936  if (has_next()) {
3937    return in()->Get(next_pos_);
3938  } else {
3939    return kEndMarker;
3940  }
3941}
3942
3943
3944void RegExpParser::Advance() {
3945  if (next_pos_ < in()->length()) {
3946    StackLimitCheck check(isolate());
3947    if (check.HasOverflowed()) {
3948      ReportError(CStrVector(Isolate::kStackOverflowMessage));
3949    } else if (zone()->excess_allocation()) {
3950      ReportError(CStrVector("Regular expression too large"));
3951    } else {
3952      current_ = in()->Get(next_pos_);
3953      next_pos_++;
3954    }
3955  } else {
3956    current_ = kEndMarker;
3957    has_more_ = false;
3958  }
3959}
3960
3961
3962void RegExpParser::Reset(int pos) {
3963  next_pos_ = pos;
3964  has_more_ = (pos < in()->length());
3965  Advance();
3966}
3967
3968
3969void RegExpParser::Advance(int dist) {
3970  next_pos_ += dist - 1;
3971  Advance();
3972}
3973
3974
3975bool RegExpParser::simple() {
3976  return simple_;
3977}
3978
3979
3980RegExpTree* RegExpParser::ReportError(Vector<const char> message) {
3981  failed_ = true;
3982  *error_ = isolate()->factory()->NewStringFromAscii(message).ToHandleChecked();
3983  // Zip to the end to make sure the no more input is read.
3984  current_ = kEndMarker;
3985  next_pos_ = in()->length();
3986  return NULL;
3987}
3988
3989
3990// Pattern ::
3991//   Disjunction
3992RegExpTree* RegExpParser::ParsePattern() {
3993  RegExpTree* result = ParseDisjunction(CHECK_FAILED);
3994  ASSERT(!has_more());
3995  // If the result of parsing is a literal string atom, and it has the
3996  // same length as the input, then the atom is identical to the input.
3997  if (result->IsAtom() && result->AsAtom()->length() == in()->length()) {
3998    simple_ = true;
3999  }
4000  return result;
4001}
4002
4003
4004// Disjunction ::
4005//   Alternative
4006//   Alternative | Disjunction
4007// Alternative ::
4008//   [empty]
4009//   Term Alternative
4010// Term ::
4011//   Assertion
4012//   Atom
4013//   Atom Quantifier
4014RegExpTree* RegExpParser::ParseDisjunction() {
4015  // Used to store current state while parsing subexpressions.
4016  RegExpParserState initial_state(NULL, INITIAL, 0, zone());
4017  RegExpParserState* stored_state = &initial_state;
4018  // Cache the builder in a local variable for quick access.
4019  RegExpBuilder* builder = initial_state.builder();
4020  while (true) {
4021    switch (current()) {
4022    case kEndMarker:
4023      if (stored_state->IsSubexpression()) {
4024        // Inside a parenthesized group when hitting end of input.
4025        ReportError(CStrVector("Unterminated group") CHECK_FAILED);
4026      }
4027      ASSERT_EQ(INITIAL, stored_state->group_type());
4028      // Parsing completed successfully.
4029      return builder->ToRegExp();
4030    case ')': {
4031      if (!stored_state->IsSubexpression()) {
4032        ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
4033      }
4034      ASSERT_NE(INITIAL, stored_state->group_type());
4035
4036      Advance();
4037      // End disjunction parsing and convert builder content to new single
4038      // regexp atom.
4039      RegExpTree* body = builder->ToRegExp();
4040
4041      int end_capture_index = captures_started();
4042
4043      int capture_index = stored_state->capture_index();
4044      SubexpressionType group_type = stored_state->group_type();
4045
4046      // Restore previous state.
4047      stored_state = stored_state->previous_state();
4048      builder = stored_state->builder();
4049
4050      // Build result of subexpression.
4051      if (group_type == CAPTURE) {
4052        RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index);
4053        captures_->at(capture_index - 1) = capture;
4054        body = capture;
4055      } else if (group_type != GROUPING) {
4056        ASSERT(group_type == POSITIVE_LOOKAHEAD ||
4057               group_type == NEGATIVE_LOOKAHEAD);
4058        bool is_positive = (group_type == POSITIVE_LOOKAHEAD);
4059        body = new(zone()) RegExpLookahead(body,
4060                                   is_positive,
4061                                   end_capture_index - capture_index,
4062                                   capture_index);
4063      }
4064      builder->AddAtom(body);
4065      // For compatability with JSC and ES3, we allow quantifiers after
4066      // lookaheads, and break in all cases.
4067      break;
4068    }
4069    case '|': {
4070      Advance();
4071      builder->NewAlternative();
4072      continue;
4073    }
4074    case '*':
4075    case '+':
4076    case '?':
4077      return ReportError(CStrVector("Nothing to repeat"));
4078    case '^': {
4079      Advance();
4080      if (multiline_) {
4081        builder->AddAssertion(
4082            new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE));
4083      } else {
4084        builder->AddAssertion(
4085            new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
4086        set_contains_anchor();
4087      }
4088      continue;
4089    }
4090    case '$': {
4091      Advance();
4092      RegExpAssertion::AssertionType assertion_type =
4093          multiline_ ? RegExpAssertion::END_OF_LINE :
4094                       RegExpAssertion::END_OF_INPUT;
4095      builder->AddAssertion(new(zone()) RegExpAssertion(assertion_type));
4096      continue;
4097    }
4098    case '.': {
4099      Advance();
4100      // everything except \x0a, \x0d, \u2028 and \u2029
4101      ZoneList<CharacterRange>* ranges =
4102          new(zone()) ZoneList<CharacterRange>(2, zone());
4103      CharacterRange::AddClassEscape('.', ranges, zone());
4104      RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
4105      builder->AddAtom(atom);
4106      break;
4107    }
4108    case '(': {
4109      SubexpressionType subexpr_type = CAPTURE;
4110      Advance();
4111      if (current() == '?') {
4112        switch (Next()) {
4113          case ':':
4114            subexpr_type = GROUPING;
4115            break;
4116          case '=':
4117            subexpr_type = POSITIVE_LOOKAHEAD;
4118            break;
4119          case '!':
4120            subexpr_type = NEGATIVE_LOOKAHEAD;
4121            break;
4122          default:
4123            ReportError(CStrVector("Invalid group") CHECK_FAILED);
4124            break;
4125        }
4126        Advance(2);
4127      } else {
4128        if (captures_ == NULL) {
4129          captures_ = new(zone()) ZoneList<RegExpCapture*>(2, zone());
4130        }
4131        if (captures_started() >= kMaxCaptures) {
4132          ReportError(CStrVector("Too many captures") CHECK_FAILED);
4133        }
4134        captures_->Add(NULL, zone());
4135      }
4136      // Store current state and begin new disjunction parsing.
4137      stored_state = new(zone()) RegExpParserState(stored_state, subexpr_type,
4138                                                   captures_started(), zone());
4139      builder = stored_state->builder();
4140      continue;
4141    }
4142    case '[': {
4143      RegExpTree* atom = ParseCharacterClass(CHECK_FAILED);
4144      builder->AddAtom(atom);
4145      break;
4146    }
4147    // Atom ::
4148    //   \ AtomEscape
4149    case '\\':
4150      switch (Next()) {
4151      case kEndMarker:
4152        return ReportError(CStrVector("\\ at end of pattern"));
4153      case 'b':
4154        Advance(2);
4155        builder->AddAssertion(
4156            new(zone()) RegExpAssertion(RegExpAssertion::BOUNDARY));
4157        continue;
4158      case 'B':
4159        Advance(2);
4160        builder->AddAssertion(
4161            new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY));
4162        continue;
4163      // AtomEscape ::
4164      //   CharacterClassEscape
4165      //
4166      // CharacterClassEscape :: one of
4167      //   d D s S w W
4168      case 'd': case 'D': case 's': case 'S': case 'w': case 'W': {
4169        uc32 c = Next();
4170        Advance(2);
4171        ZoneList<CharacterRange>* ranges =
4172            new(zone()) ZoneList<CharacterRange>(2, zone());
4173        CharacterRange::AddClassEscape(c, ranges, zone());
4174        RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
4175        builder->AddAtom(atom);
4176        break;
4177      }
4178      case '1': case '2': case '3': case '4': case '5': case '6':
4179      case '7': case '8': case '9': {
4180        int index = 0;
4181        if (ParseBackReferenceIndex(&index)) {
4182          RegExpCapture* capture = NULL;
4183          if (captures_ != NULL && index <= captures_->length()) {
4184            capture = captures_->at(index - 1);
4185          }
4186          if (capture == NULL) {
4187            builder->AddEmpty();
4188            break;
4189          }
4190          RegExpTree* atom = new(zone()) RegExpBackReference(capture);
4191          builder->AddAtom(atom);
4192          break;
4193        }
4194        uc32 first_digit = Next();
4195        if (first_digit == '8' || first_digit == '9') {
4196          // Treat as identity escape
4197          builder->AddCharacter(first_digit);
4198          Advance(2);
4199          break;
4200        }
4201      }
4202      // FALLTHROUGH
4203      case '0': {
4204        Advance();
4205        uc32 octal = ParseOctalLiteral();
4206        builder->AddCharacter(octal);
4207        break;
4208      }
4209      // ControlEscape :: one of
4210      //   f n r t v
4211      case 'f':
4212        Advance(2);
4213        builder->AddCharacter('\f');
4214        break;
4215      case 'n':
4216        Advance(2);
4217        builder->AddCharacter('\n');
4218        break;
4219      case 'r':
4220        Advance(2);
4221        builder->AddCharacter('\r');
4222        break;
4223      case 't':
4224        Advance(2);
4225        builder->AddCharacter('\t');
4226        break;
4227      case 'v':
4228        Advance(2);
4229        builder->AddCharacter('\v');
4230        break;
4231      case 'c': {
4232        Advance();
4233        uc32 controlLetter = Next();
4234        // Special case if it is an ASCII letter.
4235        // Convert lower case letters to uppercase.
4236        uc32 letter = controlLetter & ~('a' ^ 'A');
4237        if (letter < 'A' || 'Z' < letter) {
4238          // controlLetter is not in range 'A'-'Z' or 'a'-'z'.
4239          // This is outside the specification. We match JSC in
4240          // reading the backslash as a literal character instead
4241          // of as starting an escape.
4242          builder->AddCharacter('\\');
4243        } else {
4244          Advance(2);
4245          builder->AddCharacter(controlLetter & 0x1f);
4246        }
4247        break;
4248      }
4249      case 'x': {
4250        Advance(2);
4251        uc32 value;
4252        if (ParseHexEscape(2, &value)) {
4253          builder->AddCharacter(value);
4254        } else {
4255          builder->AddCharacter('x');
4256        }
4257        break;
4258      }
4259      case 'u': {
4260        Advance(2);
4261        uc32 value;
4262        if (ParseHexEscape(4, &value)) {
4263          builder->AddCharacter(value);
4264        } else {
4265          builder->AddCharacter('u');
4266        }
4267        break;
4268      }
4269      default:
4270        // Identity escape.
4271        builder->AddCharacter(Next());
4272        Advance(2);
4273        break;
4274      }
4275      break;
4276    case '{': {
4277      int dummy;
4278      if (ParseIntervalQuantifier(&dummy, &dummy)) {
4279        ReportError(CStrVector("Nothing to repeat") CHECK_FAILED);
4280      }
4281      // fallthrough
4282    }
4283    default:
4284      builder->AddCharacter(current());
4285      Advance();
4286      break;
4287    }  // end switch(current())
4288
4289    int min;
4290    int max;
4291    switch (current()) {
4292    // QuantifierPrefix ::
4293    //   *
4294    //   +
4295    //   ?
4296    //   {
4297    case '*':
4298      min = 0;
4299      max = RegExpTree::kInfinity;
4300      Advance();
4301      break;
4302    case '+':
4303      min = 1;
4304      max = RegExpTree::kInfinity;
4305      Advance();
4306      break;
4307    case '?':
4308      min = 0;
4309      max = 1;
4310      Advance();
4311      break;
4312    case '{':
4313      if (ParseIntervalQuantifier(&min, &max)) {
4314        if (max < min) {
4315          ReportError(CStrVector("numbers out of order in {} quantifier.")
4316                      CHECK_FAILED);
4317        }
4318        break;
4319      } else {
4320        continue;
4321      }
4322    default:
4323      continue;
4324    }
4325    RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY;
4326    if (current() == '?') {
4327      quantifier_type = RegExpQuantifier::NON_GREEDY;
4328      Advance();
4329    } else if (FLAG_regexp_possessive_quantifier && current() == '+') {
4330      // FLAG_regexp_possessive_quantifier is a debug-only flag.
4331      quantifier_type = RegExpQuantifier::POSSESSIVE;
4332      Advance();
4333    }
4334    builder->AddQuantifierToAtom(min, max, quantifier_type);
4335  }
4336}
4337
4338
4339#ifdef DEBUG
4340// Currently only used in an ASSERT.
4341static bool IsSpecialClassEscape(uc32 c) {
4342  switch (c) {
4343    case 'd': case 'D':
4344    case 's': case 'S':
4345    case 'w': case 'W':
4346      return true;
4347    default:
4348      return false;
4349  }
4350}
4351#endif
4352
4353
4354// In order to know whether an escape is a backreference or not we have to scan
4355// the entire regexp and find the number of capturing parentheses.  However we
4356// don't want to scan the regexp twice unless it is necessary.  This mini-parser
4357// is called when needed.  It can see the difference between capturing and
4358// noncapturing parentheses and can skip character classes and backslash-escaped
4359// characters.
4360void RegExpParser::ScanForCaptures() {
4361  // Start with captures started previous to current position
4362  int capture_count = captures_started();
4363  // Add count of captures after this position.
4364  int n;
4365  while ((n = current()) != kEndMarker) {
4366    Advance();
4367    switch (n) {
4368      case '\\':
4369        Advance();
4370        break;
4371      case '[': {
4372        int c;
4373        while ((c = current()) != kEndMarker) {
4374          Advance();
4375          if (c == '\\') {
4376            Advance();
4377          } else {
4378            if (c == ']') break;
4379          }
4380        }
4381        break;
4382      }
4383      case '(':
4384        if (current() != '?') capture_count++;
4385        break;
4386    }
4387  }
4388  capture_count_ = capture_count;
4389  is_scanned_for_captures_ = true;
4390}
4391
4392
4393bool RegExpParser::ParseBackReferenceIndex(int* index_out) {
4394  ASSERT_EQ('\\', current());
4395  ASSERT('1' <= Next() && Next() <= '9');
4396  // Try to parse a decimal literal that is no greater than the total number
4397  // of left capturing parentheses in the input.
4398  int start = position();
4399  int value = Next() - '0';
4400  Advance(2);
4401  while (true) {
4402    uc32 c = current();
4403    if (IsDecimalDigit(c)) {
4404      value = 10 * value + (c - '0');
4405      if (value > kMaxCaptures) {
4406        Reset(start);
4407        return false;
4408      }
4409      Advance();
4410    } else {
4411      break;
4412    }
4413  }
4414  if (value > captures_started()) {
4415    if (!is_scanned_for_captures_) {
4416      int saved_position = position();
4417      ScanForCaptures();
4418      Reset(saved_position);
4419    }
4420    if (value > capture_count_) {
4421      Reset(start);
4422      return false;
4423    }
4424  }
4425  *index_out = value;
4426  return true;
4427}
4428
4429
4430// QuantifierPrefix ::
4431//   { DecimalDigits }
4432//   { DecimalDigits , }
4433//   { DecimalDigits , DecimalDigits }
4434//
4435// Returns true if parsing succeeds, and set the min_out and max_out
4436// values. Values are truncated to RegExpTree::kInfinity if they overflow.
4437bool RegExpParser::ParseIntervalQuantifier(int* min_out, int* max_out) {
4438  ASSERT_EQ(current(), '{');
4439  int start = position();
4440  Advance();
4441  int min = 0;
4442  if (!IsDecimalDigit(current())) {
4443    Reset(start);
4444    return false;
4445  }
4446  while (IsDecimalDigit(current())) {
4447    int next = current() - '0';
4448    if (min > (RegExpTree::kInfinity - next) / 10) {
4449      // Overflow. Skip past remaining decimal digits and return -1.
4450      do {
4451        Advance();
4452      } while (IsDecimalDigit(current()));
4453      min = RegExpTree::kInfinity;
4454      break;
4455    }
4456    min = 10 * min + next;
4457    Advance();
4458  }
4459  int max = 0;
4460  if (current() == '}') {
4461    max = min;
4462    Advance();
4463  } else if (current() == ',') {
4464    Advance();
4465    if (current() == '}') {
4466      max = RegExpTree::kInfinity;
4467      Advance();
4468    } else {
4469      while (IsDecimalDigit(current())) {
4470        int next = current() - '0';
4471        if (max > (RegExpTree::kInfinity - next) / 10) {
4472          do {
4473            Advance();
4474          } while (IsDecimalDigit(current()));
4475          max = RegExpTree::kInfinity;
4476          break;
4477        }
4478        max = 10 * max + next;
4479        Advance();
4480      }
4481      if (current() != '}') {
4482        Reset(start);
4483        return false;
4484      }
4485      Advance();
4486    }
4487  } else {
4488    Reset(start);
4489    return false;
4490  }
4491  *min_out = min;
4492  *max_out = max;
4493  return true;
4494}
4495
4496
4497uc32 RegExpParser::ParseOctalLiteral() {
4498  ASSERT(('0' <= current() && current() <= '7') || current() == kEndMarker);
4499  // For compatibility with some other browsers (not all), we parse
4500  // up to three octal digits with a value below 256.
4501  uc32 value = current() - '0';
4502  Advance();
4503  if ('0' <= current() && current() <= '7') {
4504    value = value * 8 + current() - '0';
4505    Advance();
4506    if (value < 32 && '0' <= current() && current() <= '7') {
4507      value = value * 8 + current() - '0';
4508      Advance();
4509    }
4510  }
4511  return value;
4512}
4513
4514
4515bool RegExpParser::ParseHexEscape(int length, uc32 *value) {
4516  int start = position();
4517  uc32 val = 0;
4518  bool done = false;
4519  for (int i = 0; !done; i++) {
4520    uc32 c = current();
4521    int d = HexValue(c);
4522    if (d < 0) {
4523      Reset(start);
4524      return false;
4525    }
4526    val = val * 16 + d;
4527    Advance();
4528    if (i == length - 1) {
4529      done = true;
4530    }
4531  }
4532  *value = val;
4533  return true;
4534}
4535
4536
4537uc32 RegExpParser::ParseClassCharacterEscape() {
4538  ASSERT(current() == '\\');
4539  ASSERT(has_next() && !IsSpecialClassEscape(Next()));
4540  Advance();
4541  switch (current()) {
4542    case 'b':
4543      Advance();
4544      return '\b';
4545    // ControlEscape :: one of
4546    //   f n r t v
4547    case 'f':
4548      Advance();
4549      return '\f';
4550    case 'n':
4551      Advance();
4552      return '\n';
4553    case 'r':
4554      Advance();
4555      return '\r';
4556    case 't':
4557      Advance();
4558      return '\t';
4559    case 'v':
4560      Advance();
4561      return '\v';
4562    case 'c': {
4563      uc32 controlLetter = Next();
4564      uc32 letter = controlLetter & ~('A' ^ 'a');
4565      // For compatibility with JSC, inside a character class
4566      // we also accept digits and underscore as control characters.
4567      if ((controlLetter >= '0' && controlLetter <= '9') ||
4568          controlLetter == '_' ||
4569          (letter >= 'A' && letter <= 'Z')) {
4570        Advance(2);
4571        // Control letters mapped to ASCII control characters in the range
4572        // 0x00-0x1f.
4573        return controlLetter & 0x1f;
4574      }
4575      // We match JSC in reading the backslash as a literal
4576      // character instead of as starting an escape.
4577      return '\\';
4578    }
4579    case '0': case '1': case '2': case '3': case '4': case '5':
4580    case '6': case '7':
4581      // For compatibility, we interpret a decimal escape that isn't
4582      // a back reference (and therefore either \0 or not valid according
4583      // to the specification) as a 1..3 digit octal character code.
4584      return ParseOctalLiteral();
4585    case 'x': {
4586      Advance();
4587      uc32 value;
4588      if (ParseHexEscape(2, &value)) {
4589        return value;
4590      }
4591      // If \x is not followed by a two-digit hexadecimal, treat it
4592      // as an identity escape.
4593      return 'x';
4594    }
4595    case 'u': {
4596      Advance();
4597      uc32 value;
4598      if (ParseHexEscape(4, &value)) {
4599        return value;
4600      }
4601      // If \u is not followed by a four-digit hexadecimal, treat it
4602      // as an identity escape.
4603      return 'u';
4604    }
4605    default: {
4606      // Extended identity escape. We accept any character that hasn't
4607      // been matched by a more specific case, not just the subset required
4608      // by the ECMAScript specification.
4609      uc32 result = current();
4610      Advance();
4611      return result;
4612    }
4613  }
4614  return 0;
4615}
4616
4617
4618CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) {
4619  ASSERT_EQ(0, *char_class);
4620  uc32 first = current();
4621  if (first == '\\') {
4622    switch (Next()) {
4623      case 'w': case 'W': case 'd': case 'D': case 's': case 'S': {
4624        *char_class = Next();
4625        Advance(2);
4626        return CharacterRange::Singleton(0);  // Return dummy value.
4627      }
4628      case kEndMarker:
4629        return ReportError(CStrVector("\\ at end of pattern"));
4630      default:
4631        uc32 c = ParseClassCharacterEscape(CHECK_FAILED);
4632        return CharacterRange::Singleton(c);
4633    }
4634  } else {
4635    Advance();
4636    return CharacterRange::Singleton(first);
4637  }
4638}
4639
4640
4641static const uc16 kNoCharClass = 0;
4642
4643// Adds range or pre-defined character class to character ranges.
4644// If char_class is not kInvalidClass, it's interpreted as a class
4645// escape (i.e., 's' means whitespace, from '\s').
4646static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges,
4647                                    uc16 char_class,
4648                                    CharacterRange range,
4649                                    Zone* zone) {
4650  if (char_class != kNoCharClass) {
4651    CharacterRange::AddClassEscape(char_class, ranges, zone);
4652  } else {
4653    ranges->Add(range, zone);
4654  }
4655}
4656
4657
4658RegExpTree* RegExpParser::ParseCharacterClass() {
4659  static const char* kUnterminated = "Unterminated character class";
4660  static const char* kRangeOutOfOrder = "Range out of order in character class";
4661
4662  ASSERT_EQ(current(), '[');
4663  Advance();
4664  bool is_negated = false;
4665  if (current() == '^') {
4666    is_negated = true;
4667    Advance();
4668  }
4669  ZoneList<CharacterRange>* ranges =
4670      new(zone()) ZoneList<CharacterRange>(2, zone());
4671  while (has_more() && current() != ']') {
4672    uc16 char_class = kNoCharClass;
4673    CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
4674    if (current() == '-') {
4675      Advance();
4676      if (current() == kEndMarker) {
4677        // If we reach the end we break out of the loop and let the
4678        // following code report an error.
4679        break;
4680      } else if (current() == ']') {
4681        AddRangeOrEscape(ranges, char_class, first, zone());
4682        ranges->Add(CharacterRange::Singleton('-'), zone());
4683        break;
4684      }
4685      uc16 char_class_2 = kNoCharClass;
4686      CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED);
4687      if (char_class != kNoCharClass || char_class_2 != kNoCharClass) {
4688        // Either end is an escaped character class. Treat the '-' verbatim.
4689        AddRangeOrEscape(ranges, char_class, first, zone());
4690        ranges->Add(CharacterRange::Singleton('-'), zone());
4691        AddRangeOrEscape(ranges, char_class_2, next, zone());
4692        continue;
4693      }
4694      if (first.from() > next.to()) {
4695        return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED);
4696      }
4697      ranges->Add(CharacterRange::Range(first.from(), next.to()), zone());
4698    } else {
4699      AddRangeOrEscape(ranges, char_class, first, zone());
4700    }
4701  }
4702  if (!has_more()) {
4703    return ReportError(CStrVector(kUnterminated) CHECK_FAILED);
4704  }
4705  Advance();
4706  if (ranges->length() == 0) {
4707    ranges->Add(CharacterRange::Everything(), zone());
4708    is_negated = !is_negated;
4709  }
4710  return new(zone()) RegExpCharacterClass(ranges, is_negated);
4711}
4712
4713
4714// ----------------------------------------------------------------------------
4715// The Parser interface.
4716
4717ScriptData::~ScriptData() {
4718  if (owns_store_) store_.Dispose();
4719}
4720
4721
4722int ScriptData::Length() {
4723  return store_.length() * sizeof(unsigned);
4724}
4725
4726
4727const char* ScriptData::Data() {
4728  return reinterpret_cast<const char*>(store_.start());
4729}
4730
4731
4732bool ScriptData::HasError() {
4733  return has_error();
4734}
4735
4736
4737void ScriptData::Initialize() {
4738  // Prepares state for use.
4739  if (store_.length() >= PreparseDataConstants::kHeaderSize) {
4740    function_index_ = PreparseDataConstants::kHeaderSize;
4741    int symbol_data_offset = PreparseDataConstants::kHeaderSize
4742        + store_[PreparseDataConstants::kFunctionsSizeOffset];
4743    if (store_.length() > symbol_data_offset) {
4744      symbol_data_ = reinterpret_cast<byte*>(&store_[symbol_data_offset]);
4745    } else {
4746      // Partial preparse causes no symbol information.
4747      symbol_data_ = reinterpret_cast<byte*>(&store_[0] + store_.length());
4748    }
4749    symbol_data_end_ = reinterpret_cast<byte*>(&store_[0] + store_.length());
4750  }
4751}
4752
4753
4754int ScriptData::ReadNumber(byte** source) {
4755  // Reads a number from symbol_data_ in base 128. The most significant
4756  // bit marks that there are more digits.
4757  // If the first byte is 0x80 (kNumberTerminator), it would normally
4758  // represent a leading zero. Since that is useless, and therefore won't
4759  // appear as the first digit of any actual value, it is used to
4760  // mark the end of the input stream.
4761  byte* data = *source;
4762  if (data >= symbol_data_end_) return -1;
4763  byte input = *data;
4764  if (input == PreparseDataConstants::kNumberTerminator) {
4765    // End of stream marker.
4766    return -1;
4767  }
4768  int result = input & 0x7f;
4769  data++;
4770  while ((input & 0x80u) != 0) {
4771    if (data >= symbol_data_end_) return -1;
4772    input = *data;
4773    result = (result << 7) | (input & 0x7f);
4774    data++;
4775  }
4776  *source = data;
4777  return result;
4778}
4779
4780
4781bool RegExpParser::ParseRegExp(FlatStringReader* input,
4782                               bool multiline,
4783                               RegExpCompileData* result,
4784                               Zone* zone) {
4785  ASSERT(result != NULL);
4786  RegExpParser parser(input, &result->error, multiline, zone);
4787  RegExpTree* tree = parser.ParsePattern();
4788  if (parser.failed()) {
4789    ASSERT(tree == NULL);
4790    ASSERT(!result->error.is_null());
4791  } else {
4792    ASSERT(tree != NULL);
4793    ASSERT(result->error.is_null());
4794    result->tree = tree;
4795    int capture_count = parser.captures_started();
4796    result->simple = tree->IsAtom() && parser.simple() && capture_count == 0;
4797    result->contains_anchor = parser.contains_anchor();
4798    result->capture_count = capture_count;
4799  }
4800  return !parser.failed();
4801}
4802
4803
4804bool Parser::Parse() {
4805  ASSERT(info()->function() == NULL);
4806  FunctionLiteral* result = NULL;
4807  if (info()->is_lazy()) {
4808    ASSERT(!info()->is_eval());
4809    if (info()->shared_info()->is_function()) {
4810      result = ParseLazy();
4811    } else {
4812      result = ParseProgram();
4813    }
4814  } else {
4815    SetCachedData(info()->cached_data(), info()->cached_data_mode());
4816    if (info()->cached_data_mode() == CONSUME_CACHED_DATA &&
4817        (*info()->cached_data())->has_error()) {
4818      ScriptData* cached_data = *(info()->cached_data());
4819      Scanner::Location loc = cached_data->MessageLocation();
4820      const char* message = cached_data->BuildMessage();
4821      const char* arg = cached_data->BuildArg();
4822      ParserTraits::ReportMessageAt(loc, message, arg,
4823                                    cached_data->IsReferenceError());
4824      DeleteArray(message);
4825      DeleteArray(arg);
4826      ASSERT(info()->isolate()->has_pending_exception());
4827    } else {
4828      result = ParseProgram();
4829    }
4830  }
4831  info()->SetFunction(result);
4832  return (result != NULL);
4833}
4834
4835} }  // namespace v8::internal
4836