1ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
2beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Redistribution and use in source and binary forms, with or without
3beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// modification, are permitted provided that the following conditions are
4beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// met:
5beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//
6beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//     * Redistributions of source code must retain the above copyright
7beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//       notice, this list of conditions and the following disclaimer.
8beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//     * Redistributions in binary form must reproduce the above
9beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//       copyright notice, this list of conditions and the following
10beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//       disclaimer in the documentation and/or other materials provided
11beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//       with the distribution.
12beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//     * Neither the name of Google Inc. nor the names of its
13beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//       contributors may be used to endorse or promote products derived
14beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//       from this software without specific prior written permission.
15beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org//
16beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
2877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org#include <cmath>
2955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
30beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#include "../include/v8stdint.h"
3155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
32beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#include "allocation.h"
3355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "checks.h"
3455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "conversions.h"
3555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "conversions-inl.h"
3655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "globals.h"
3755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "hashmap.h"
38beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#include "list.h"
391c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "preparse-data-format.h"
40beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#include "preparse-data.h"
41beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#include "preparser.h"
4255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "unicode.h"
4355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "utils.h"
44ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org
4555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#ifdef _MSC_VER
4677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.orgnamespace std {
4777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org
4855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org// Usually defined in math.h, but not in MSVC.
4955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org// Abstracted to work
5055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgint isfinite(double value);
5177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org
5277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org}  // namespace std
5355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#endif
5455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
5577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.orgnamespace v8 {
5677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org
57beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.orgnamespace preparser {
58beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgPreParser::PreParseResult PreParser::PreParseLazyFunction(
60f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    i::LanguageMode mode, bool is_generator, i::ParserRecorder* log) {
611b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_ = log;
621b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Lazy functions always have trivial outer scopes (no with/catch scopes).
631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  Scope top_scope(&scope_, kTopLevelScope);
641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  set_language_mode(mode);
651b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  Scope function_scope(&scope_, kFunctionScope);
66f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  function_scope.set_is_generator(is_generator);
671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  ASSERT_EQ(i::Token::LBRACE, scanner_->current_token());
681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  bool ok = true;
691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  int start_position = scanner_->peek_location().beg_pos;
701b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  ParseLazyFunctionLiteralBody(&ok);
711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (stack_overflow_) return kPreParseStackOverflow;
721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!ok) {
731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ReportUnexpectedToken(scanner_->current_token());
741b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  } else {
751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ASSERT_EQ(i::Token::RBRACE, scanner_->peek());
761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode()) {
771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      int end_pos = scanner_->location().end_pos;
781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      CheckOctalLiteral(start_position, end_pos, &ok);
791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (ok) {
801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        CheckDelayedStrictModeViolation(start_position, end_pos, &ok);
811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      }
821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    }
831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return kPreParseSuccess;
851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
88beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Preparsing checks a JavaScript program and emits preparse-data that helps
89beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// a later parsing to be faster.
90beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// See preparser-data.h for the data.
91beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
92beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// The PreParser checks that the syntax follows the grammar for JavaScript,
93beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// and collects some information about the program along the way.
94beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// The grammar check is only performed in order to understand the program
95beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// sufficiently to deduce some information about it, that can be used
96beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// to speed up later parsing. Finding errors is not the goal of pre-parsing,
97beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// rather it is to speed up properly written and correct programs.
98beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// That means that contextual checks (like a label being declared where
99beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// it is used) are generally omitted.
100beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
101beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.orgvoid PreParser::ReportUnexpectedToken(i::Token::Value token) {
102beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // We don't report stack overflows here, to avoid increasing the
103beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // stack depth even further.  Instead we report it after parsing is
104beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // over, in ParseProgram.
105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (token == i::Token::ILLEGAL && stack_overflow_) {
106beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return;
107beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
108c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  i::Scanner::Location source_location = scanner_->location();
109beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
110beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Four of the tokens are treated specially
111beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  switch (token) {
112beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  case i::Token::EOS:
11355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_eos", NULL);
114beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  case i::Token::NUMBER:
11555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_token_number", NULL);
116beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  case i::Token::STRING:
11755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_token_string", NULL);
118beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  case i::Token::IDENTIFIER:
11955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location,
120beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org                           "unexpected_token_identifier", NULL);
12104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  case i::Token::FUTURE_RESERVED_WORD:
12255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_reserved", NULL);
12304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  case i::Token::FUTURE_STRICT_RESERVED_WORD:
12455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location,
12504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                           "unexpected_strict_reserved", NULL);
126beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  default:
127beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    const char* name = i::Token::String(token);
12855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(source_location, "unexpected_token", name);
129beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
130beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
131beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
132beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org// Checks whether octal literal last seen is between beg_pos and end_pos.
1341c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org// If so, reports an error.
1351c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgvoid PreParser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) {
1361c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  i::Scanner::Location octal = scanner_->octal_position();
1371c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  if (beg_pos <= octal.beg_pos && octal.end_pos <= end_pos) {
13855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(octal, "strict_octal_literal", NULL);
1391c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    scanner_->clear_octal_position();
1401c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    *ok = false;
1411c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
1421c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org}
1431c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
1441c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
145ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define CHECK_OK  ok);                      \
146ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return kUnknownSourceElements;  \
147ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ((void)0
148ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define DUMMY )  // to make indentation work
149ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef DUMMY
150ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
151ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
152b645116853c677aca8a316381b87441ba6004f67danno@chromium.orgPreParser::Statement PreParser::ParseSourceElement(bool* ok) {
153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // (Ecma 262 5th Edition, clause 14):
154c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // SourceElement:
155c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //    Statement
156c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //    FunctionDeclaration
157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //
158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // In harmony mode we allow additionally the following productions
159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // SourceElement:
160c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //    LetDeclaration
161394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //    ConstDeclaration
162f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //    GeneratorDeclaration
163c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
164b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  switch (peek()) {
165c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    case i::Token::FUNCTION:
166c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return ParseFunctionDeclaration(ok);
167b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    case i::Token::LET:
168394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    case i::Token::CONST:
169b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return ParseVariableStatement(kSourceElement, ok);
170b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    default:
171b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return ParseStatement(ok);
172b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  }
173b645116853c677aca8a316381b87441ba6004f67danno@chromium.org}
174b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
175b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
176a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::SourceElements PreParser::ParseSourceElements(int end_token,
177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                         bool* ok) {
178beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // SourceElements ::
179beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   (Statement)* <end_token>
180beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1811c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  bool allow_directive_prologue = true;
182beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (peek() != end_token) {
183b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    Statement statement = ParseSourceElement(CHECK_OK);
1841c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    if (allow_directive_prologue) {
185ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      if (statement.IsUseStrictLiteral()) {
186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        set_language_mode(allow_harmony_scoping() ?
1871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                          i::EXTENDED_MODE : i::STRICT_MODE);
188ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      } else if (!statement.IsStringLiteral()) {
1891c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org        allow_directive_prologue = false;
1901c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      }
1911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    }
192beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
193beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return kUnknownSourceElements;
194beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
195beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
196beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
197ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
198ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define CHECK_OK  ok);                   \
199ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return Statement::Default();  \
200ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ((void)0
201ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define DUMMY )  // to make indentation work
202ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef DUMMY
203ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
204ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
205a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseStatement(bool* ok) {
206beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Statement ::
207beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Block
208beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   VariableStatement
209beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   EmptyStatement
210beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ExpressionStatement
211beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   IfStatement
212beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   IterationStatement
213beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ContinueStatement
214beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   BreakStatement
215beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ReturnStatement
216beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   WithStatement
217beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LabelledStatement
218beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   SwitchStatement
219beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ThrowStatement
220beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   TryStatement
221beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   DebuggerStatement
222beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
223beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Note: Since labels can only be used by 'break' and 'continue'
224beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // statements, which themselves are only valid within blocks,
225beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // iterations or 'switch' statements (i.e., BreakableStatements),
226beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // labels can be simply ignored in all other cases; except for
227beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // trivial labeled break statements 'label: break label' which is
228beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // parsed into an empty statement.
229beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
230beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Keep the source position of the statement
231beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  switch (peek()) {
232beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::LBRACE:
233beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseBlock(ok);
234beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
235beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::CONST:
2361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    case i::Token::LET:
237beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::VAR:
238b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return ParseVariableStatement(kStatement, ok);
239beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
240beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::SEMICOLON:
241beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
242ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Statement::Default();
243beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
244beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::IF:
245ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return ParseIfStatement(ok);
246beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
247beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::DO:
248beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseDoWhileStatement(ok);
249beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
250beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::WHILE:
251beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseWhileStatement(ok);
252beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
253beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::FOR:
254beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseForStatement(ok);
255beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
256beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::CONTINUE:
257beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseContinueStatement(ok);
258beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
259beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::BREAK:
260beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseBreakStatement(ok);
261beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
262beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::RETURN:
263beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseReturnStatement(ok);
264beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
265beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::WITH:
266beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseWithStatement(ok);
267beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
268beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::SWITCH:
269beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseSwitchStatement(ok);
270beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
271beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::THROW:
272beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseThrowStatement(ok);
273beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
274beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::TRY:
275beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseTryStatement(ok);
276beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    case i::Token::FUNCTION: {
278c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      i::Scanner::Location start_location = scanner_->peek_location();
279c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      Statement statement = ParseFunctionDeclaration(CHECK_OK);
280c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      i::Scanner::Location end_location = scanner_->location();
2811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (!is_classic_mode()) {
282c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        ReportMessageAt(start_location.beg_pos, end_location.end_pos,
283c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        "strict_function", NULL);
284c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        *ok = false;
285c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        return Statement::Default();
286c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      } else {
287c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        return statement;
288c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
289c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
290beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
291beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::DEBUGGER:
292beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseDebuggerStatement(ok);
293beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
294beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    default:
295beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseExpressionOrLabelledStatement(ok);
296beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
297beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
298beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
299beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
301beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // FunctionDeclaration ::
302beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
303f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // GeneratorDeclaration ::
304f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //   'function' '*' Identifier '(' FormalParameterListopt ')'
305f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //      '{' FunctionBody '}'
306beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::FUNCTION, CHECK_OK);
307ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
308f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  bool is_generator = allow_generators_ && Check(i::Token::MUL);
309ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Identifier identifier = ParseIdentifier(CHECK_OK);
310ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  i::Scanner::Location location = scanner_->location();
311ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
312f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Expression function_value = ParseFunctionLiteral(is_generator, CHECK_OK);
313ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
314ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (function_value.IsStrictFunction() &&
315ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      !identifier.IsValidStrictVariable()) {
316ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // Strict mode violation, using either reserved word or eval/arguments
317ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // as name of strict function.
318ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    const char* type = "strict_function_name";
319f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    if (identifier.IsFutureStrictReserved() || identifier.IsYield()) {
320ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      type = "strict_reserved_word";
321ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
32255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, type, NULL);
323ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
324ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
32540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  return Statement::FunctionDeclaration();
326beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
327beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
328beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
329a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseBlock(bool* ok) {
330beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Block ::
331beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '{' Statement* '}'
332beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
333beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Note that a Block does not introduce a new execution scope!
334beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // (ECMA-262, 3rd, 12.2)
335beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //
336beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LBRACE, CHECK_OK);
337beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (peek() != i::Token::RBRACE) {
3381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (is_extended_mode()) {
339c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ParseSourceElement(CHECK_OK);
340c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    } else {
341c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ParseStatement(CHECK_OK);
34240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org    }
343beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
344ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expect(i::Token::RBRACE, ok);
345ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
346beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
347beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
348beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
349b645116853c677aca8a316381b87441ba6004f67danno@chromium.orgPreParser::Statement PreParser::ParseVariableStatement(
350b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    VariableDeclarationContext var_context,
351b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    bool* ok) {
352beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // VariableStatement ::
353beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   VariableDeclarations ';'
354beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
355b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  Statement result = ParseVariableDeclarations(var_context,
356b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                                               NULL,
357394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                                               NULL,
358b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                                               CHECK_OK);
359beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
360beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
361beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
362beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
363beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
364beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// If the variable declaration declares exactly one non-const
365beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// variable, then *var is set to that variable. In all other cases,
366beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// *var is untouched; in particular, it is the caller's responsibility
367beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// to initialize it properly. This mechanism is also used for the parsing
368beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// of 'for-in' loops.
369b645116853c677aca8a316381b87441ba6004f67danno@chromium.orgPreParser::Statement PreParser::ParseVariableDeclarations(
370b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    VariableDeclarationContext var_context,
371394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    VariableDeclarationProperties* decl_props,
372b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    int* num_decl,
373b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    bool* ok) {
374beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // VariableDeclarations ::
375beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
376394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //
377394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // The ES6 Draft Rev3 specifies the following grammar for const declarations
378394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //
379394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // ConstDeclaration ::
380394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //   const ConstBinding (',' ConstBinding)* ';'
381394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // ConstBinding ::
382394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //   Identifier '=' AssignmentExpression
383394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //
384394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // TODO(ES6):
385394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // ConstBinding ::
386394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //   BindingPattern '=' AssignmentExpression
387394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  bool require_initializer = false;
388beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() == i::Token::VAR) {
389beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Consume(i::Token::VAR);
390beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else if (peek() == i::Token::CONST) {
3911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads:
3921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
3931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
3941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
3951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // * It is a Syntax Error if the code that matches this production is not
3961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //   contained in extended code.
3971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
3981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // However disallowing const in classic mode will break compatibility with
3991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // existing pages. Therefore we keep allowing const with the old
4001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // non-harmony semantics in classic mode.
4011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    Consume(i::Token::CONST);
4021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    switch (language_mode()) {
4031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      case i::CLASSIC_MODE:
4041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        break;
4051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      case i::STRICT_MODE: {
406394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        i::Scanner::Location location = scanner_->peek_location();
4071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        ReportMessageAt(location, "strict_const", NULL);
408394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        *ok = false;
409394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        return Statement::Default();
410394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      }
4111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      case i::EXTENDED_MODE:
4121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        if (var_context != kSourceElement &&
4131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org            var_context != kForStatement) {
4141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          i::Scanner::Location location = scanner_->peek_location();
4151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          ReportMessageAt(location.beg_pos, location.end_pos,
4161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                          "unprotected_const", NULL);
4171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          *ok = false;
4181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          return Statement::Default();
4191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        }
4201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        require_initializer = true;
4211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        break;
4221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    }
4231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  } else if (peek() == i::Token::LET) {
4241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // ES6 Draft Rev4 section 12.2.1:
4251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
4261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // LetDeclaration : let LetBindingList ;
4271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
4281b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // * It is a Syntax Error if the code that matches this production is not
4291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //   contained in extended code.
4301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_extended_mode()) {
43140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      i::Scanner::Location location = scanner_->peek_location();
4321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      ReportMessageAt(location.beg_pos, location.end_pos,
4331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      "illegal_let", NULL);
43440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      *ok = false;
43540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      return Statement::Default();
43640cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org    }
4371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    Consume(i::Token::LET);
438b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    if (var_context != kSourceElement &&
439b645116853c677aca8a316381b87441ba6004f67danno@chromium.org        var_context != kForStatement) {
440b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      i::Scanner::Location location = scanner_->peek_location();
441b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      ReportMessageAt(location.beg_pos, location.end_pos,
442b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                      "unprotected_let", NULL);
443b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      *ok = false;
444b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return Statement::Default();
445b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    }
446beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
447beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
448ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Statement::Default();
449beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
450beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
451b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // The scope of a var/const declared variable anywhere inside a function
452b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope
453b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // of a let declared variable is the scope of the immediately enclosing
454b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // block.
455beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  int nvars = 0;  // the number of variables declared
456beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  do {
457beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // Parse variable name.
458beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (nvars > 0) Consume(i::Token::COMMA);
459ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier identifier  = ParseIdentifier(CHECK_OK);
4601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() && !identifier.IsValidStrictVariable()) {
461ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      StrictModeIdentifierViolation(scanner_->location(),
462ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_var_name",
463ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    identifier,
464ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    ok);
465ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Statement::Default();
466ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
467beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    nvars++;
468394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (peek() == i::Token::ASSIGN || require_initializer) {
469beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Expect(i::Token::ASSIGN, CHECK_OK);
470b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
471394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      if (decl_props != NULL) *decl_props = kHasInitializers;
472beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
473beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } while (peek() == i::Token::COMMA);
474beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
475beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (num_decl != NULL) *num_decl = nvars;
476ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
477beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
478beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
479beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
480ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgPreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) {
481beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ExpressionStatement | LabelledStatement ::
482beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Expression ';'
483beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Identifier ':' Statement
484beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
485beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expr = ParseExpression(true, CHECK_OK);
4867b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  if (expr.IsRawIdentifier()) {
487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    ASSERT(!expr.AsIdentifier().IsFutureReserved());
488f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    ASSERT(is_classic_mode() ||
489f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org           (!expr.AsIdentifier().IsFutureStrictReserved() &&
490f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org            !expr.AsIdentifier().IsYield()));
491c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (peek() == i::Token::COLON) {
49240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      Consume(i::Token::COLON);
493c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return ParseStatement(ok);
49440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org    }
4957b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    // Preparsing is disabled for extensions (because the extension details
4967b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    // aren't passed to lazily compiled functions), so we don't
4977b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    // accept "native function" in the preparser.
498beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
499beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parsed expression statement.
500beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
501ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::ExpressionStatement(expr);
502beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
503beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
504beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
505a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseIfStatement(bool* ok) {
506beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // IfStatement ::
507beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'if' '(' Expression ')' Statement ('else' Statement)?
508beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
509beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::IF, CHECK_OK);
510beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
511beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
512beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RPAREN, CHECK_OK);
513beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseStatement(CHECK_OK);
514beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() == i::Token::ELSE) {
515beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
516beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseStatement(CHECK_OK);
517beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
518ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
519beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
520beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
521beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
522a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseContinueStatement(bool* ok) {
523beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ContinueStatement ::
524beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'continue' [no line terminator] Identifier? ';'
525beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
526beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::CONTINUE, CHECK_OK);
527beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value tok = peek();
528df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org  if (!scanner_->HasAnyLineTerminatorBeforeNext() &&
529beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::SEMICOLON &&
530beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::RBRACE &&
531beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::EOS) {
532beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseIdentifier(CHECK_OK);
533beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
534beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
535ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
536beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
537beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
538beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseBreakStatement(bool* ok) {
540beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // BreakStatement ::
541beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'break' [no line terminator] Identifier? ';'
542beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
543beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::BREAK, CHECK_OK);
544beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value tok = peek();
545df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org  if (!scanner_->HasAnyLineTerminatorBeforeNext() &&
546beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::SEMICOLON &&
547beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::RBRACE &&
548beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::EOS) {
549beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseIdentifier(CHECK_OK);
550beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
551beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
552ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
553beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
554beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
555beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseReturnStatement(bool* ok) {
557beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ReturnStatement ::
558beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'return' [no line terminator] Expression? ';'
559beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
560beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Consume the return token. It is necessary to do the before
561beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // reporting any errors on it, because of the way errors are
562beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // reported (underlining).
563beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RETURN, CHECK_OK);
564beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
565beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // An ECMAScript program is considered syntactically incorrect if it
566beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // contains a return statement that is not within the body of a
567beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // function. See ECMA-262, section 12.9, page 67.
568beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // This is not handled during preparsing.
569beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
570beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value tok = peek();
571df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org  if (!scanner_->HasAnyLineTerminatorBeforeNext() &&
572beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::SEMICOLON &&
573beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::RBRACE &&
574beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok != i::Token::EOS) {
575beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseExpression(true, CHECK_OK);
576beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
577beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
578ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
579beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
580beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
581beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseWithStatement(bool* ok) {
583beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // WithStatement ::
584beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'with' '(' Expression ')' Statement
585beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::WITH, CHECK_OK);
5861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
587ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    i::Scanner::Location location = scanner_->location();
58855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, "strict_mode_with", NULL);
589ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
590ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Statement::Default();
591ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
592beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
593beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
594beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RPAREN, CHECK_OK);
595beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
5962c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  Scope::InsideWith iw(scope_);
597beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseStatement(CHECK_OK);
598ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
599beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
600beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
601beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseSwitchStatement(bool* ok) {
603beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // SwitchStatement ::
604beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'switch' '(' Expression ')' '{' CaseClause* '}'
605beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
606beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::SWITCH, CHECK_OK);
607beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
608beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
609beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RPAREN, CHECK_OK);
610beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
611beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LBRACE, CHECK_OK);
612beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value token = peek();
613beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (token != i::Token::RBRACE) {
614beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (token == i::Token::CASE) {
615beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Expect(i::Token::CASE, CHECK_OK);
616beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      ParseExpression(true, CHECK_OK);
617beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    } else {
618657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org      Expect(i::Token::DEFAULT, CHECK_OK);
619beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
620657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    Expect(i::Token::COLON, CHECK_OK);
621beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    token = peek();
622657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    while (token != i::Token::CASE &&
623657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org           token != i::Token::DEFAULT &&
624657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org           token != i::Token::RBRACE) {
625657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org      ParseStatement(CHECK_OK);
626657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org      token = peek();
627657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    }
628beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
629ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expect(i::Token::RBRACE, ok);
630ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
631beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
632beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
633beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseDoWhileStatement(bool* ok) {
635beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // DoStatement ::
636beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'do' Statement 'while' '(' Expression ')' ';'
637beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
638beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::DO, CHECK_OK);
639beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseStatement(CHECK_OK);
640beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::WHILE, CHECK_OK);
641beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
642beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
643ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expect(i::Token::RPAREN, ok);
64464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  if (peek() == i::Token::SEMICOLON) Consume(i::Token::SEMICOLON);
645ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
646beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
647beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
648beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseWhileStatement(bool* ok) {
650beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // WhileStatement ::
651beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'while' '(' Expression ')' Statement
652beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
653beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::WHILE, CHECK_OK);
654beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
655beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
656beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RPAREN, CHECK_OK);
657ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ParseStatement(ok);
658ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
659beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
660beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
661beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
66241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgbool PreParser::CheckInOrOf(bool accept_OF) {
6631fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  if (peek() == i::Token::IN ||
66441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      (allow_for_of() && accept_OF && peek() == i::Token::IDENTIFIER &&
6651fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org       scanner_->is_next_contextual_keyword(v8::internal::CStrVector("of")))) {
6661fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    Next();
6671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return true;
6681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
6691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return false;
6701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
6711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
6721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseForStatement(bool* ok) {
674beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ForStatement ::
675beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
676beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
677beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::FOR, CHECK_OK);
678beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
679beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() != i::Token::SEMICOLON) {
680b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    if (peek() == i::Token::VAR || peek() == i::Token::CONST ||
681b645116853c677aca8a316381b87441ba6004f67danno@chromium.org        peek() == i::Token::LET) {
682394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      bool is_let = peek() == i::Token::LET;
683beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      int decl_count;
684394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      VariableDeclarationProperties decl_props = kHasNoInitializers;
685394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      ParseVariableDeclarations(
686394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com          kForStatement, &decl_props, &decl_count, CHECK_OK);
68741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      bool has_initializers = decl_props == kHasInitializers;
68841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      bool accept_IN = decl_count == 1 && !(is_let && has_initializers);
68941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      bool accept_OF = !has_initializers;
69041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      if (accept_IN && CheckInOrOf(accept_OF)) {
691beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
692beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Expect(i::Token::RPAREN, CHECK_OK);
693beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
694beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseStatement(CHECK_OK);
695ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        return Statement::Default();
696beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
697beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    } else {
69841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      Expression lhs = ParseExpression(false, CHECK_OK);
69941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      if (CheckInOrOf(lhs.IsIdentifier())) {
700beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
701beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Expect(i::Token::RPAREN, CHECK_OK);
702beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
703beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseStatement(CHECK_OK);
704ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        return Statement::Default();
705beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
706beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
707beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
708beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
709beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parsed initializer at this point.
710beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::SEMICOLON, CHECK_OK);
711beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
712beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() != i::Token::SEMICOLON) {
713beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseExpression(true, CHECK_OK);
714beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
715beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::SEMICOLON, CHECK_OK);
716beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
717beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() != i::Token::RPAREN) {
718beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseExpression(true, CHECK_OK);
719beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
720beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RPAREN, CHECK_OK);
721beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
722ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ParseStatement(ok);
723ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
724beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
725beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
726beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
727a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseThrowStatement(bool* ok) {
728beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ThrowStatement ::
729beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'throw' [no line terminator] Expression ';'
730beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
731beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::THROW, CHECK_OK);
732df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org  if (scanner_->HasAnyLineTerminatorBeforeNext()) {
733c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    i::Scanner::Location pos = scanner_->location();
73455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(pos, "newline_after_throw", NULL);
735beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
736ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Statement::Default();
737beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
738beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
739ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ExpectSemicolon(ok);
740ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
741beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
742beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
743beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
744a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseTryStatement(bool* ok) {
745beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // TryStatement ::
746beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'try' Block Catch
747beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'try' Block Finally
748beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'try' Block Catch Finally
749beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //
750beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Catch ::
751beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'catch' '(' Identifier ')' Block
752beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //
753beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Finally ::
754beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'finally' Block
755beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
756beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // In preparsing, allow any number of catch/finally blocks, including zero
757beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // of both.
758beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
759beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::TRY, CHECK_OK);
760beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
761beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseBlock(CHECK_OK);
762beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
763beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool catch_or_finally_seen = false;
764beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() == i::Token::CATCH) {
765beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Consume(i::Token::CATCH);
766beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Expect(i::Token::LPAREN, CHECK_OK);
767ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier id = ParseIdentifier(CHECK_OK);
7681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() && !id.IsValidStrictVariable()) {
769ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      StrictModeIdentifierViolation(scanner_->location(),
770ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_catch_variable",
771ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    id,
772ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    ok);
773ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Statement::Default();
774ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
775beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Expect(i::Token::RPAREN, CHECK_OK);
7762c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    { Scope::InsideWith iw(scope_);
7772c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org      ParseBlock(CHECK_OK);
7782c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    }
779beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    catch_or_finally_seen = true;
780beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
781beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() == i::Token::FINALLY) {
782beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Consume(i::Token::FINALLY);
783beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseBlock(CHECK_OK);
784beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    catch_or_finally_seen = true;
785beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
786beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (!catch_or_finally_seen) {
787beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
788beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
789ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
790beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
791beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
792beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
793a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseDebuggerStatement(bool* ok) {
794beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
795beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // contexts this is used as a statement which invokes the debugger as if a
796beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // break point is present.
797beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // DebuggerStatement ::
798beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'debugger' ';'
799beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
800beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::DEBUGGER, CHECK_OK);
801ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ExpectSemicolon(ok);
802ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
803beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
804beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
805beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
806ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
807ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define CHECK_OK  ok);                     \
808ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return Expression::Default();  \
809ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ((void)0
810ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define DUMMY )  // to make indentation work
811ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef DUMMY
812ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
813ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
814beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence = 1
815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseExpression(bool accept_IN, bool* ok) {
816beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Expression ::
817beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   AssignmentExpression
818beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Expression ',' AssignmentExpression
819beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
820beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression result = ParseAssignmentExpression(accept_IN, CHECK_OK);
821beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (peek() == i::Token::COMMA) {
822beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Expect(i::Token::COMMA, CHECK_OK);
823beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseAssignmentExpression(accept_IN, CHECK_OK);
824ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    result = Expression::Default();
825beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
826beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
827beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
828beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
829beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
830beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence = 2
831a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN,
832a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                           bool* ok) {
833beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // AssignmentExpression ::
834beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ConditionalExpression
835f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //   YieldExpression
836beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LeftHandSideExpression AssignmentOperator AssignmentExpression
837beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
838f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (scope_->is_generator() && peek() == i::Token::YIELD) {
839f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return ParseYieldExpression(ok);
840f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
841f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
842ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  i::Scanner::Location before = scanner_->peek_location();
843beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK);
844beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
845beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (!i::Token::IsAssignmentOp(peek())) {
846beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // Parsed conditional expression only (no assignment).
847beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return expression;
848beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
849beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
8501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode() &&
8511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      expression.IsIdentifier() &&
852ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      expression.AsIdentifier().IsEvalOrArguments()) {
853ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    i::Scanner::Location after = scanner_->location();
854ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    ReportMessageAt(before.beg_pos, after.end_pos,
855ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                    "strict_lhs_assignment", NULL);
856ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
857ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
858ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
859ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
860beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value op = Next();  // Get assignment operator.
861beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseAssignmentExpression(accept_IN, CHECK_OK);
862beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
863ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if ((op == i::Token::ASSIGN) && expression.IsThisProperty()) {
864beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    scope_->AddProperty();
865beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
866beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
867ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
868beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
869beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
870beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
871beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence = 3
872f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgPreParser::Expression PreParser::ParseYieldExpression(bool* ok) {
873f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // YieldExpression ::
874f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //   'yield' '*'? AssignmentExpression
875f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Consume(i::Token::YIELD);
876f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Check(i::Token::MUL);
877f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
878f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ParseAssignmentExpression(false, CHECK_OK);
879f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
880f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return Expression::Default();
881f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
882f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
883f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
884f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// Precedence = 3
885a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseConditionalExpression(bool accept_IN,
886a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                            bool* ok) {
887beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ConditionalExpression ::
888beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LogicalOrExpression
889beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
890beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
891beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // We start using the binary expression parser for prec >= 4 only!
892beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expression = ParseBinaryExpression(4, accept_IN, CHECK_OK);
893beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() != i::Token::CONDITIONAL) return expression;
894beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Consume(i::Token::CONDITIONAL);
895beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // In parsing the first assignment expression in conditional
896beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // expressions we always accept the 'in' keyword; see ECMA-262,
897beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // section 11.12, page 58.
898beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseAssignmentExpression(true, CHECK_OK);
899beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::COLON, CHECK_OK);
900beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseAssignmentExpression(accept_IN, CHECK_OK);
901ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
902beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
903beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
904beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
905beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.orgint PreParser::Precedence(i::Token::Value tok, bool accept_IN) {
906beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (tok == i::Token::IN && !accept_IN)
907beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return 0;  // 0 precedence will terminate binary expression parsing
908beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
909beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return i::Token::Precedence(tok);
910beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
911beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
912beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
913beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence >= 4
914a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseBinaryExpression(int prec,
915a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                       bool accept_IN,
916a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                       bool* ok) {
917beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression result = ParseUnaryExpression(CHECK_OK);
918beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
919beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // prec1 >= 4
920beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    while (Precedence(peek(), accept_IN) == prec1) {
921beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
922beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
923ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = Expression::Default();
924beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
925beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
926beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
927beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
928beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
929beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
930a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseUnaryExpression(bool* ok) {
931beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // UnaryExpression ::
932beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   PostfixExpression
933beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'delete' UnaryExpression
934beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'void' UnaryExpression
935beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'typeof' UnaryExpression
936beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '++' UnaryExpression
937beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '--' UnaryExpression
938beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '+' UnaryExpression
939beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '-' UnaryExpression
940beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '~' UnaryExpression
941beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '!' UnaryExpression
942beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
943beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value op = peek();
944ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (i::Token::IsUnaryOp(op)) {
945beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    op = Next();
946beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseUnaryExpression(ok);
947ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
948ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  } else if (i::Token::IsCountOp(op)) {
949ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    op = Next();
950ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    i::Scanner::Location before = scanner_->peek_location();
951ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Expression expression = ParseUnaryExpression(CHECK_OK);
9521b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() &&
9531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        expression.IsIdentifier() &&
954ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        expression.AsIdentifier().IsEvalOrArguments()) {
955ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      i::Scanner::Location after = scanner_->location();
956ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      ReportMessageAt(before.beg_pos, after.end_pos,
957ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                      "strict_lhs_prefix", NULL);
958ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      *ok = false;
959ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
960ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
961beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
962beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return ParsePostfixExpression(ok);
963beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
964beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
965beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
966beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParsePostfixExpression(bool* ok) {
968beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // PostfixExpression ::
969beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LeftHandSideExpression ('++' | '--')?
970beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
971ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  i::Scanner::Location before = scanner_->peek_location();
972beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expression = ParseLeftHandSideExpression(CHECK_OK);
973df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org  if (!scanner_->HasAnyLineTerminatorBeforeNext() &&
974beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      i::Token::IsCountOp(peek())) {
9751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() &&
9761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        expression.IsIdentifier() &&
977ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        expression.AsIdentifier().IsEvalOrArguments()) {
978ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      i::Scanner::Location after = scanner_->location();
979ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      ReportMessageAt(before.beg_pos, after.end_pos,
980ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                      "strict_lhs_postfix", NULL);
981ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      *ok = false;
982ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Expression::Default();
983ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
984beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
985ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
986beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
987beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return expression;
988beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
989beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
990beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
991a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseLeftHandSideExpression(bool* ok) {
992beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // LeftHandSideExpression ::
993beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   (NewExpression | MemberExpression) ...
994beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
995ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expression result = Expression::Default();
996beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() == i::Token::NEW) {
997beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    result = ParseNewExpression(CHECK_OK);
998beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
999beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    result = ParseMemberExpression(CHECK_OK);
1000beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1001beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1002beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (true) {
1003beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    switch (peek()) {
1004beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::LBRACK: {
1005beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(i::Token::LBRACK);
1006beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
1007beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Expect(i::Token::RBRACK, CHECK_OK);
1008ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1009ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1010beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1011ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1012beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1013beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1014beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1015beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1016beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::LPAREN: {
1017beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseArguments(CHECK_OK);
1018ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        result = Expression::Default();
1019beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1020beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1021beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1022beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::PERIOD: {
1023beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(i::Token::PERIOD);
1024beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseIdentifierName(CHECK_OK);
1025ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1026ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1027beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1028ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1029beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1030beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1031beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1032beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1033beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      default:
1034beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        return result;
1035beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1036beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1037beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1038beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1039beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1040a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseNewExpression(bool* ok) {
1041beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // NewExpression ::
1042beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ('new')+ MemberExpression
1043beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1044beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // The grammar for new expressions is pretty warped. The keyword
1045beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // 'new' can either be a part of the new expression (where it isn't
1046beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // followed by an argument list) or a part of the member expression,
1047beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // where it must be followed by an argument list. To accommodate
1048beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // this, we parse the 'new' keywords greedily and keep track of how
1049beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // many we have parsed. This information is then passed on to the
1050beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // member expression parser, which is only allowed to match argument
1051beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // lists as long as it has 'new' prefixes left
1052beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  unsigned new_count = 0;
1053beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  do {
1054beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Consume(i::Token::NEW);
1055beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    new_count++;
1056beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } while (peek() == i::Token::NEW);
1057beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1058beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return ParseMemberWithNewPrefixesExpression(new_count, ok);
1059beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1060beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1061beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1062a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseMemberExpression(bool* ok) {
1063beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return ParseMemberWithNewPrefixesExpression(0, ok);
1064beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1065beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1066beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1067a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseMemberWithNewPrefixesExpression(
1068beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    unsigned new_count, bool* ok) {
1069beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // MemberExpression ::
1070beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   (PrimaryExpression | FunctionLiteral)
1071beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //     ('[' Expression ']' | '.' Identifier | Arguments)*
1072beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1073beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parse the initial primary or function expression.
1074ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expression result = Expression::Default();
1075beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (peek() == i::Token::FUNCTION) {
1076beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Consume(i::Token::FUNCTION);
1077f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
1078f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    bool is_generator = allow_generators_ && Check(i::Token::MUL);
1079ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier identifier = Identifier::Default();
108083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    if (peek_any_identifier()) {
1081ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      identifier = ParseIdentifier(CHECK_OK);
1082beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1083f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    result = ParseFunctionLiteral(is_generator, CHECK_OK);
1084ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (result.IsStrictFunction() && !identifier.IsValidStrictVariable()) {
1085ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      StrictModeIdentifierViolation(scanner_->location(),
1086ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_function_name",
1087ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    identifier,
1088ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    ok);
1089ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Expression::Default();
1090ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
1091beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
1092beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    result = ParsePrimaryExpression(CHECK_OK);
1093beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1094beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1095beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (true) {
1096beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    switch (peek()) {
1097beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::LBRACK: {
1098beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(i::Token::LBRACK);
1099beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
1100beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Expect(i::Token::RBRACK, CHECK_OK);
1101ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1102ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1103beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1104ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1105beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1106beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1107beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1108beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::PERIOD: {
1109beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(i::Token::PERIOD);
1110beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseIdentifierName(CHECK_OK);
1111ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1112ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1113beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1114ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1115beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1116beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1117beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1118beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::LPAREN: {
1119beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        if (new_count == 0) return result;
1120beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        // Consume one of the new prefixes (already parsed).
1121beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseArguments(CHECK_OK);
1122beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        new_count--;
1123ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        result = Expression::Default();
1124beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1125beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1126beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      default:
1127beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        return result;
1128beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1129beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1130beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1131beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1132beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParsePrimaryExpression(bool* ok) {
1134beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // PrimaryExpression ::
1135beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'this'
1136beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'null'
1137beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'true'
1138beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'false'
1139beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Identifier
1140beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Number
1141beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   String
1142beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ArrayLiteral
1143beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ObjectLiteral
1144beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   RegExpLiteral
1145beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '(' Expression ')'
1146beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1147ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expression result = Expression::Default();
1148beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  switch (peek()) {
1149beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::THIS: {
1150beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1151ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = Expression::This();
1152beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1153beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1154beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
11556e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    case i::Token::FUTURE_RESERVED_WORD:
115604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    case i::Token::FUTURE_STRICT_RESERVED_WORD:
1157f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    case i::Token::YIELD:
1158ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    case i::Token::IDENTIFIER: {
1159ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      Identifier id = ParseIdentifier(CHECK_OK);
1160ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = Expression::FromIdentifier(id);
1161beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1162beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1163beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1164beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::NULL_LITERAL:
1165beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::TRUE_LITERAL:
1166beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::FALSE_LITERAL:
1167beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::NUMBER: {
1168beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1169beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1170beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1171beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::STRING: {
1172beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1173beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = GetStringSymbol();
1174beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1175beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1176beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1177beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::ASSIGN_DIV:
1178beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseRegExpLiteral(true, CHECK_OK);
1179beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1180beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1181beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::DIV:
1182beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseRegExpLiteral(false, CHECK_OK);
1183beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1184beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1185beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::LBRACK:
1186beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseArrayLiteral(CHECK_OK);
1187beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1188beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1189beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::LBRACE:
1190beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseObjectLiteral(CHECK_OK);
1191beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1192beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1193beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::LPAREN:
1194beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Consume(i::Token::LPAREN);
1195c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      parenthesized_function_ = (peek() == i::Token::FUNCTION);
1196beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseExpression(true, CHECK_OK);
1197beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Expect(i::Token::RPAREN, CHECK_OK);
1198ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = result.Parenthesize();
1199beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1200beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1201beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    case i::Token::MOD:
1202beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseV8Intrinsic(CHECK_OK);
1203beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1204beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1205beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    default: {
1206beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1207beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      *ok = false;
1208ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Expression::Default();
1209beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1210beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1211beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1212beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
1213beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1214beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1215beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1216a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
1217beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ArrayLiteral ::
1218beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '[' Expression? (',' Expression?)* ']'
1219beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LBRACK, CHECK_OK);
1220beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (peek() != i::Token::RBRACK) {
1221beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (peek() != i::Token::COMMA) {
1222beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      ParseAssignmentExpression(true, CHECK_OK);
1223beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1224beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (peek() != i::Token::RBRACK) {
1225beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Expect(i::Token::COMMA, CHECK_OK);
1226beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1227beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1228beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RBRACK, CHECK_OK);
1229beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1230beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  scope_->NextMaterializedLiteralIndex();
1231ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1232beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1233beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
123455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgvoid PreParser::CheckDuplicate(DuplicateFinder* finder,
123555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                               i::Token::Value property,
123655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                               int type,
123755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                               bool* ok) {
123855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int old_type;
123955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (property == i::Token::NUMBER) {
124055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    old_type = finder->AddNumber(scanner_->literal_ascii_string(), type);
124155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  } else if (scanner_->is_literal_ascii()) {
124255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    old_type = finder->AddAsciiSymbol(scanner_->literal_ascii_string(),
124355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                                      type);
124455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  } else {
1245154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    old_type = finder->AddUtf16Symbol(scanner_->literal_utf16_string(), type);
124655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
124755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (HasConflict(old_type, type)) {
124855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (IsDataDataConflict(old_type, type)) {
124955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      // Both are data properties.
12501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (is_classic_mode()) return;
125155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      ReportMessageAt(scanner_->location(),
125255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                      "strict_duplicate_property", NULL);
125355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    } else if (IsDataAccessorConflict(old_type, type)) {
125455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      // Both a data and an accessor property with the same name.
125555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      ReportMessageAt(scanner_->location(),
125655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                      "accessor_data_property", NULL);
125755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    } else {
125855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      ASSERT(IsAccessorAccessorConflict(old_type, type));
125955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      // Both accessors of the same type.
126055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      ReportMessageAt(scanner_->location(),
126155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                      "accessor_get_set", NULL);
126255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    }
126355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    *ok = false;
126455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
126555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
126655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
1267beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1268a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
1269beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ObjectLiteral ::
1270beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '{' (
1271beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //       ((IdentifierName | String | Number) ':' AssignmentExpression)
1272beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //     | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
1273beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //    )*[','] '}'
1274beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1275beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LBRACE, CHECK_OK);
127655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  DuplicateFinder duplicate_finder(scanner_->unicode_cache());
1277beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (peek() != i::Token::RBRACE) {
1278beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    i::Token::Value next = peek();
1279beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    switch (next) {
128083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org      case i::Token::IDENTIFIER:
128104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      case i::Token::FUTURE_RESERVED_WORD:
128204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      case i::Token::FUTURE_STRICT_RESERVED_WORD: {
1283beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        bool is_getter = false;
1284beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        bool is_setter = false;
128504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org        ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK);
1286beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        if ((is_getter || is_setter) && peek() != i::Token::COLON) {
1287beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            i::Token::Value name = Next();
12885d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org            bool is_keyword = i::Token::IsKeyword(name);
1289beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            if (name != i::Token::IDENTIFIER &&
129083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                name != i::Token::FUTURE_RESERVED_WORD &&
129104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                name != i::Token::FUTURE_STRICT_RESERVED_WORD &&
1292beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org                name != i::Token::NUMBER &&
1293beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org                name != i::Token::STRING &&
12945d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org                !is_keyword) {
1295beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org              *ok = false;
1296ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org              return Expression::Default();
1297beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            }
12985d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org            if (!is_keyword) {
12995d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org              LogSymbol();
13005d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org            }
130155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org            PropertyType type = is_getter ? kGetterProperty : kSetterProperty;
130255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org            CheckDuplicate(&duplicate_finder, name, type, CHECK_OK);
1303f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org            ParseFunctionLiteral(false, CHECK_OK);
1304beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            if (peek() != i::Token::RBRACE) {
1305beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org              Expect(i::Token::COMMA, CHECK_OK);
1306beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            }
1307beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            continue;  // restart the while
1308beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
130955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org        CheckDuplicate(&duplicate_finder, next, kValueProperty, CHECK_OK);
1310beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1311beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1312beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::STRING:
1313beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(next);
131455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org        CheckDuplicate(&duplicate_finder, next, kValueProperty, CHECK_OK);
1315beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        GetStringSymbol();
1316beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1317beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      case i::Token::NUMBER:
1318beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(next);
131955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org        CheckDuplicate(&duplicate_finder, next, kValueProperty, CHECK_OK);
1320beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1321beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      default:
1322beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        if (i::Token::IsKeyword(next)) {
1323beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org          Consume(next);
132455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org          CheckDuplicate(&duplicate_finder, next, kValueProperty, CHECK_OK);
1325beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1326beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org          // Unexpected token.
1327beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org          *ok = false;
1328ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          return Expression::Default();
1329beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1330beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1331beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1332beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Expect(i::Token::COLON, CHECK_OK);
1333beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseAssignmentExpression(true, CHECK_OK);
1334beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1335beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // TODO(1240767): Consider allowing trailing comma.
1336beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (peek() != i::Token::RBRACE) Expect(i::Token::COMMA, CHECK_OK);
1337beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1338beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RBRACE, CHECK_OK);
1339beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1340beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  scope_->NextMaterializedLiteralIndex();
1341ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1342beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1343beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1344beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1345a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseRegExpLiteral(bool seen_equal,
1346a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                    bool* ok) {
1347beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (!scanner_->ScanRegExpPattern(seen_equal)) {
1348beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
134955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(scanner_->location(), "unterminated_regexp", NULL);
1350beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
1351ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
1352beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1353beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1354beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  scope_->NextMaterializedLiteralIndex();
1355beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1356beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (!scanner_->ScanRegExpFlags()) {
1357beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
135855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(scanner_->location(), "invalid_regexp_flags", NULL);
1359beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
1360ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
1361beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1362beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Next();
1363ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1364beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1365beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1366beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1367a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Arguments PreParser::ParseArguments(bool* ok) {
1368beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Arguments ::
1369beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '(' (AssignmentExpression)*[','] ')'
1370beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1371ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expect(i::Token::LPAREN, ok);
1372ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return -1;
1373beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool done = (peek() == i::Token::RPAREN);
1374beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  int argc = 0;
1375beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (!done) {
1376ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    ParseAssignmentExpression(true, ok);
1377ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (!*ok) return -1;
1378beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    argc++;
1379beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    done = (peek() == i::Token::RPAREN);
1380ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (!done) {
1381ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      Expect(i::Token::COMMA, ok);
1382ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      if (!*ok) return -1;
1383ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
1384beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1385ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expect(i::Token::RPAREN, ok);
1386beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return argc;
1387beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1388beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1389beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1390f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgPreParser::Expression PreParser::ParseFunctionLiteral(bool is_generator,
1391f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org                                                      bool* ok) {
1392beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Function ::
1393beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '(' FormalParameterList? ')' '{' FunctionBody '}'
1394beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1395beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parse function body.
1396beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ScopeType outer_scope_type = scope_->type();
1397beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool inside_with = scope_->IsInsideWith();
1398beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Scope function_scope(&scope_, kFunctionScope);
1399f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  function_scope.set_is_generator(is_generator);
1400beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //  FormalParameterList ::
1401beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //    '(' (Identifier)*[','] ')'
1402beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::LPAREN, CHECK_OK);
14031c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  int start_position = scanner_->location().beg_pos;
1404beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool done = (peek() == i::Token::RPAREN);
140555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  DuplicateFinder duplicate_finder(scanner_->unicode_cache());
1406beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (!done) {
1407ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier id = ParseIdentifier(CHECK_OK);
1408ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (!id.IsValidStrictVariable()) {
1409ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      StrictModeIdentifierViolation(scanner_->location(),
1410ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_param_name",
1411ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    id,
1412ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    CHECK_OK);
1413ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
141455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    int prev_value;
141555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (scanner_->is_literal_ascii()) {
141655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      prev_value =
141755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org          duplicate_finder.AddAsciiSymbol(scanner_->literal_ascii_string(), 1);
141855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    } else {
141955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      prev_value =
1420154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org          duplicate_finder.AddUtf16Symbol(scanner_->literal_utf16_string(), 1);
142155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    }
142255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
142355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (prev_value != 0) {
142455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      SetStrictModeViolation(scanner_->location(),
142555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                             "strict_param_dupe",
142655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                             CHECK_OK);
142755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    }
1428beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    done = (peek() == i::Token::RPAREN);
1429beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (!done) {
1430beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Expect(i::Token::COMMA, CHECK_OK);
1431beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1432beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1433beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::RPAREN, CHECK_OK);
1434beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1435beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Determine if the function will be lazily compiled.
1436beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Currently only happens to top-level functions.
1437beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Optimistically assume that all top-level functions are lazily compiled.
1438c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool is_lazily_compiled = (outer_scope_type == kTopLevelScope &&
1439c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                             !inside_with && allow_lazy_ &&
1440c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                             !parenthesized_function_);
1441c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  parenthesized_function_ = false;
1442beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
14431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  Expect(i::Token::LBRACE, CHECK_OK);
1444beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (is_lazily_compiled) {
14451b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ParseLazyFunctionLiteralBody(CHECK_OK);
1446beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
14471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ParseSourceElements(i::Token::RBRACE, ok);
1448beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
14491b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  Expect(i::Token::RBRACE, CHECK_OK);
14501c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
14511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
14521c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    int end_position = scanner_->location().end_pos;
14531c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    CheckOctalLiteral(start_position, end_position, CHECK_OK);
1454ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK);
1455ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::StrictFunction();
14561c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
14571c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
1458ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1459beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1460beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1461beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
14621b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid PreParser::ParseLazyFunctionLiteralBody(bool* ok) {
14631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  int body_start = scanner_->location().beg_pos;
14641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_->PauseRecording();
14651b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  ParseSourceElements(i::Token::RBRACE, ok);
14661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_->ResumeRecording();
14671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!*ok) return;
14681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
14691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Position right after terminal '}'.
14701b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  ASSERT_EQ(i::Token::RBRACE, scanner_->peek());
14711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  int body_end = scanner_->peek_location().end_pos;
14721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_->LogFunction(body_start, body_end,
14731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    scope_->materialized_literal_count(),
14741b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    scope_->expected_properties(),
14751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    language_mode());
14761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
14771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
14781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
1479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
1480beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // CallRuntime ::
1481beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '%' Identifier Arguments
1482beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::MOD, CHECK_OK);
1483394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  if (!allow_natives_syntax_) {
1484394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    *ok = false;
1485394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return Expression::Default();
1486394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
1487beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseIdentifier(CHECK_OK);
1488ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ParseArguments(ok);
1489beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1490ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1491beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1492beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1493ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
1494ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1495beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1496beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.orgvoid PreParser::ExpectSemicolon(bool* ok) {
1497beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Check for automatic semicolon insertion according to
1498beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // the rules given in ECMA-262, section 7.9, page 21.
1499beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value tok = peek();
1500beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (tok == i::Token::SEMICOLON) {
1501beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
1502beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return;
1503beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1504df8c03c138809b385f3cca5d424d7b2f8ad92527whesse@chromium.org  if (scanner_->HasAnyLineTerminatorBeforeNext() ||
1505beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok == i::Token::RBRACE ||
1506beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      tok == i::Token::EOS) {
1507beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return;
1508beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1509beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expect(i::Token::SEMICOLON, ok);
1510beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1511beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1512beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
15135d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.orgvoid PreParser::LogSymbol() {
1514beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  int identifier_pos = scanner_->location().beg_pos;
15159e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  if (scanner_->is_literal_ascii()) {
15169e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    log_->LogAsciiSymbol(identifier_pos, scanner_->literal_ascii_string());
15179e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  } else {
1518154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    log_->LogUtf16Symbol(identifier_pos, scanner_->literal_utf16_string());
15199e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  }
15205d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org}
15215d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org
15225d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org
1523a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::GetStringSymbol() {
15241c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  const int kUseStrictLength = 10;
15251c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  const char* kUseStrictChars = "use strict";
15265d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org  LogSymbol();
15271c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  if (scanner_->is_literal_ascii() &&
15281c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      scanner_->literal_length() == kUseStrictLength &&
15291c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      !scanner_->literal_contains_escapes() &&
15301c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      !strncmp(scanner_->literal_ascii_string().start(), kUseStrictChars,
15311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org               kUseStrictLength)) {
1532ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::UseStrictStringLiteral();
1533ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1534ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::StringLiteral();
1535ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1536ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1537ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1538ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgPreParser::Identifier PreParser::GetIdentifierSymbol() {
1539ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  LogSymbol();
1540ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (scanner_->current_token() == i::Token::FUTURE_RESERVED_WORD) {
1541ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Identifier::FutureReserved();
154204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  } else if (scanner_->current_token() ==
154304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org             i::Token::FUTURE_STRICT_RESERVED_WORD) {
154404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    return Identifier::FutureStrictReserved();
1545f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  } else if (scanner_->current_token() == i::Token::YIELD) {
1546f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return Identifier::Yield();
1547ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1548ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (scanner_->is_literal_ascii()) {
1549ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // Detect strict-mode poison words.
1550ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (scanner_->literal_length() == 4 &&
1551ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        !strncmp(scanner_->literal_ascii_string().start(), "eval", 4)) {
1552ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Identifier::Eval();
1553ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
1554ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (scanner_->literal_length() == 9 &&
1555ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        !strncmp(scanner_->literal_ascii_string().start(), "arguments", 9)) {
1556ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Identifier::Arguments();
1557ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
15581c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
1559ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Identifier::Default();
1560beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1561beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1562beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Identifier PreParser::ParseIdentifier(bool* ok) {
156404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  i::Token::Value next = Next();
156504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  switch (next) {
156604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    case i::Token::FUTURE_RESERVED_WORD: {
156704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      i::Scanner::Location location = scanner_->location();
156804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      ReportMessageAt(location.beg_pos, location.end_pos,
156904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                      "reserved_word", NULL);
157004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      *ok = false;
1571c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return GetIdentifierSymbol();
157204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    }
1573f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    case i::Token::YIELD:
1574f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      if (scope_->is_generator()) {
1575f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        // 'yield' in a generator is only valid as part of a YieldExpression.
1576f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        ReportMessageAt(scanner_->location(), "unexpected_token", "yield");
1577f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        *ok = false;
1578f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        return Identifier::Yield();
1579f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      }
1580f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // FALLTHROUGH
158104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    case i::Token::FUTURE_STRICT_RESERVED_WORD:
15821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (!is_classic_mode()) {
1583c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        i::Scanner::Location location = scanner_->location();
1584c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        ReportMessageAt(location.beg_pos, location.end_pos,
1585c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        "strict_reserved_word", NULL);
1586c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        *ok = false;
1587c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
1588c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      // FALLTHROUGH
158904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    case i::Token::IDENTIFIER:
159004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      return GetIdentifierSymbol();
159104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    default:
159204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      *ok = false;
159304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      return Identifier::Default();
159483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
1595beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1596beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1597beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1598ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid PreParser::SetStrictModeViolation(i::Scanner::Location location,
1599ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                       const char* type,
1600ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                       bool* ok) {
16011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
160255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, type, NULL);
1603ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
1604ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return;
1605ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1606ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  // Delay report in case this later turns out to be strict code
1607ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  // (i.e., for function names and parameters prior to a "use strict"
1608ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  // directive).
160955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // It's safe to overwrite an existing violation.
161055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // It's either from a function that turned out to be non-strict,
161155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // or it's in the current function (and we just need to report
161255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // one error), or it's in a unclosed nesting function that wasn't
161355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // strict (otherwise we would already be in strict mode).
1614ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_location_ = location;
1615ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_type_ = type;
1616ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1617ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1618ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1619ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid PreParser::CheckDelayedStrictModeViolation(int beg_pos,
1620ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                                int end_pos,
1621ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                                bool* ok) {
1622ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  i::Scanner::Location location = strict_mode_violation_location_;
1623ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (location.IsValid() &&
1624ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      location.beg_pos > beg_pos && location.end_pos < end_pos) {
162555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, strict_mode_violation_type_, NULL);
1626ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
1627ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1628ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1629ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1630ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1631ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid PreParser::StrictModeIdentifierViolation(i::Scanner::Location location,
1632ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                              const char* eval_args_type,
1633ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                              Identifier identifier,
1634ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                              bool* ok) {
1635ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  const char* type = eval_args_type;
1636ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (identifier.IsFutureReserved()) {
163704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    type = "reserved_word";
1638f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  } else if (identifier.IsFutureStrictReserved() || identifier.IsYield()) {
1639ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    type = "strict_reserved_word";
1640ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
16411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
164255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, type, NULL);
1643ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
1644ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return;
1645ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1646ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_location_ = location;
1647ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_type_ = type;
1648ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1649ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1650ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Identifier PreParser::ParseIdentifierName(bool* ok) {
1652beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  i::Token::Value next = Next();
1653beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (i::Token::IsKeyword(next)) {
1654beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    int pos = scanner_->location().beg_pos;
1655beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    const char* keyword = i::Token::String(next);
16569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    log_->LogAsciiSymbol(pos, i::Vector<const char>(keyword,
16579e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org                                                    i::StrLength(keyword)));
1658ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Identifier::Default();
1659beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
166083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  if (next == i::Token::IDENTIFIER ||
166104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      next == i::Token::FUTURE_RESERVED_WORD ||
166204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      next == i::Token::FUTURE_STRICT_RESERVED_WORD) {
1663beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return GetIdentifierSymbol();
1664beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1665beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  *ok = false;
1666ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Identifier::Default();
1667beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1668beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1669ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
1670ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1671beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1672beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// This function reads an identifier and determines whether or not it
167383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// is 'get' or 'set'.
167404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgPreParser::Identifier PreParser::ParseIdentifierNameOrGetOrSet(bool* is_get,
167504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                                                               bool* is_set,
167604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                                                               bool* ok) {
167704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  Identifier result = ParseIdentifierName(ok);
1678ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return Identifier::Default();
1679ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (scanner_->is_literal_ascii() &&
1680ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      scanner_->literal_length() == 3) {
16819e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    const char* token = scanner_->literal_ascii_string().start();
1682beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *is_get = strncmp(token, "get", 3) == 0;
1683beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *is_set = !*is_get && strncmp(token, "set", 3) == 0;
1684beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
168583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  return result;
168683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
168783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
1688e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
168983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgbool PreParser::peek_any_identifier() {
169083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  i::Token::Value next = peek();
169183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  return next == i::Token::IDENTIFIER ||
169204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org         next == i::Token::FUTURE_RESERVED_WORD ||
1693f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org         next == i::Token::FUTURE_STRICT_RESERVED_WORD ||
1694f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org         next == i::Token::YIELD;
1695beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
169655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
169755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
169855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgint DuplicateFinder::AddAsciiSymbol(i::Vector<const char> key, int value) {
169955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return AddSymbol(i::Vector<const byte>::cast(key), true, value);
170055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
170155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
1702e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1703154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgint DuplicateFinder::AddUtf16Symbol(i::Vector<const uint16_t> key, int value) {
170455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return AddSymbol(i::Vector<const byte>::cast(key), false, value);
170555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
170655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
170755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgint DuplicateFinder::AddSymbol(i::Vector<const byte> key,
170855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                               bool is_ascii,
170955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                               int value) {
171055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  uint32_t hash = Hash(key, is_ascii);
171155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  byte* encoding = BackupKey(key, is_ascii);
171255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  i::HashMap::Entry* entry = map_.Lookup(encoding, hash, true);
171355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int old_value = static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
171455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  entry->value =
171555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    reinterpret_cast<void*>(static_cast<intptr_t>(value | old_value));
171655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return old_value;
171755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
171855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
171955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
172055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgint DuplicateFinder::AddNumber(i::Vector<const char> key, int value) {
172155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  ASSERT(key.length() > 0);
172255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // Quick check for already being in canonical form.
172355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (IsNumberCanonical(key)) {
172455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return AddAsciiSymbol(key, value);
172555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
172655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
1727ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  int flags = i::ALLOW_HEX | i::ALLOW_OCTAL | i::ALLOW_IMPLICIT_OCTAL |
1728ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      i::ALLOW_BINARY;
172955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  double double_value = StringToDouble(unicode_constants_, key, flags, 0.0);
173055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int length;
173155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  const char* string;
173277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  if (!std::isfinite(double_value)) {
173355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    string = "Infinity";
173455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    length = 8;  // strlen("Infinity");
173555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  } else {
173655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    string = DoubleToCString(double_value,
173755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                             i::Vector<char>(number_buffer_, kBufferSize));
173855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    length = i::StrLength(string);
173955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
174055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return AddSymbol(i::Vector<const byte>(reinterpret_cast<const byte*>(string),
174155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                                         length), true, value);
174255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
174355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
174455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
174555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgbool DuplicateFinder::IsNumberCanonical(i::Vector<const char> number) {
174655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // Test for a safe approximation of number literals that are already
174755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // in canonical form: max 15 digits, no leading zeroes, except an
174855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // integer part that is a single zero, and no trailing zeros below
174955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // the decimal point.
175055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int pos = 0;
175155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int length = number.length();
175255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (number.length() > 15) return false;
175355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (number[pos] == '0') {
175455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    pos++;
175555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  } else {
175655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    while (pos < length &&
175755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org           static_cast<unsigned>(number[pos] - '0') <= ('9' - '0')) pos++;
175855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
175955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (length == pos) return true;
176055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (number[pos] != '.') return false;
176155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  pos++;
176255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  bool invalid_last_digit = true;
176355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  while (pos < length) {
176455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    byte digit = number[pos] - '0';
176555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (digit > '9' - '0') return false;
176655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    invalid_last_digit = (digit == 0);
176755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    pos++;
176855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
176955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return !invalid_last_digit;
177055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
177155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
177255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
177355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orguint32_t DuplicateFinder::Hash(i::Vector<const byte> key, bool is_ascii) {
177455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // Primitive hash function, almost identical to the one used
177555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // for strings (except that it's seeded by the length and ASCII-ness).
177655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int length = key.length();
177755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  uint32_t hash = (length << 1) | (is_ascii ? 1 : 0) ;
177855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  for (int i = 0; i < length; i++) {
177955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    uint32_t c = key[i];
178055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    hash = (hash + c) * 1025;
178155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    hash ^= (hash >> 6);
178255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
178355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return hash;
178455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
178555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
178655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
178755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgbool DuplicateFinder::Match(void* first, void* second) {
178855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // Decode lengths.
178955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // Length + ASCII-bit is encoded as base 128, most significant heptet first,
179055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // with a 8th bit being non-zero while there are more heptets.
179155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // The value encodes the number of bytes following, and whether the original
179255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // was ASCII.
179355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  byte* s1 = reinterpret_cast<byte*>(first);
179455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  byte* s2 = reinterpret_cast<byte*>(second);
179555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  uint32_t length_ascii_field = 0;
179655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  byte c1;
179755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  do {
179855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    c1 = *s1;
179955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (c1 != *s2) return false;
180055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    length_ascii_field = (length_ascii_field << 7) | (c1 & 0x7f);
180155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    s1++;
180255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    s2++;
180355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  } while ((c1 & 0x80) != 0);
180455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  int length = static_cast<int>(length_ascii_field >> 1);
180555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return memcmp(s1, s2, length) == 0;
180655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
180755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
180855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
180955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.orgbyte* DuplicateFinder::BackupKey(i::Vector<const byte> bytes,
181055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                                 bool is_ascii) {
181155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  uint32_t ascii_length = (bytes.length() << 1) | (is_ascii ? 1 : 0);
181255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  backing_store_.StartSequence();
181355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // Emit ascii_length as base-128 encoded number, with the 7th bit set
181455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // on the byte of every heptet except the last, least significant, one.
181555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  if (ascii_length >= (1 << 7)) {
181655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (ascii_length >= (1 << 14)) {
181755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      if (ascii_length >= (1 << 21)) {
181855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org        if (ascii_length >= (1 << 28)) {
181955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org          backing_store_.Add(static_cast<byte>((ascii_length >> 28) | 0x80));
182055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org        }
182155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org        backing_store_.Add(static_cast<byte>((ascii_length >> 21) | 0x80u));
182255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      }
182355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u));
182455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    }
182555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u));
182655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  }
182755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  backing_store_.Add(static_cast<byte>(ascii_length & 0x7f));
182855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
182955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  backing_store_.AddBlock(bytes);
183055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  return backing_store_.EndSequence().start();
183155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org}
1832beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org} }  // v8::preparser
1833