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
45528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#if V8_CC_MSVC && (_MSC_VER < 1800)
4677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.orgnamespace std {
4777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org
48528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org// Usually defined in math.h, but not in MSVC until VS2013+.
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 {
56a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgnamespace internal {
57beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgPreParser::PreParseResult PreParser::PreParseLazyFunction(
59b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    LanguageMode mode, bool is_generator, ParserRecorder* log) {
601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_ = log;
611b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Lazy functions always have trivial outer scopes (no with/catch scopes).
621b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  Scope top_scope(&scope_, kTopLevelScope);
631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  set_language_mode(mode);
641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  Scope function_scope(&scope_, kFunctionScope);
65f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  function_scope.set_is_generator(is_generator);
66b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  ASSERT_EQ(Token::LBRACE, scanner()->current_token());
671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  bool ok = true;
68b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  int start_position = peek_position();
691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  ParseLazyFunctionLiteralBody(&ok);
70a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (stack_overflow()) return kPreParseStackOverflow;
711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!ok) {
72a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    ReportUnexpectedToken(scanner()->current_token());
731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  } else {
74b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    ASSERT_EQ(Token::RBRACE, scanner()->peek());
751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode()) {
76a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      int end_pos = scanner()->location().end_pos;
771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      CheckOctalLiteral(start_position, end_pos, &ok);
781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (ok) {
791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        CheckDelayedStrictModeViolation(start_position, end_pos, &ok);
801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      }
811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    }
821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return kPreParseSuccess;
841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
87beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Preparsing checks a JavaScript program and emits preparse-data that helps
88beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// a later parsing to be faster.
89beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// See preparser-data.h for the data.
90beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
91beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// The PreParser checks that the syntax follows the grammar for JavaScript,
92beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// and collects some information about the program along the way.
93beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// The grammar check is only performed in order to understand the program
94beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// sufficiently to deduce some information about it, that can be used
95beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// to speed up later parsing. Finding errors is not the goal of pre-parsing,
96beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// rather it is to speed up properly written and correct programs.
97beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// That means that contextual checks (like a label being declared where
98beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// it is used) are generally omitted.
99beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
100b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvoid PreParser::ReportUnexpectedToken(Token::Value token) {
101beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // We don't report stack overflows here, to avoid increasing the
102beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // stack depth even further.  Instead we report it after parsing is
103beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // over, in ParseProgram.
104b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (token == Token::ILLEGAL && stack_overflow()) {
105beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return;
106beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
107b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Scanner::Location source_location = scanner()->location();
108beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
109beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Four of the tokens are treated specially
110beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  switch (token) {
111b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  case Token::EOS:
11255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_eos", NULL);
113b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  case Token::NUMBER:
11455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_token_number", NULL);
115b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  case Token::STRING:
11655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_token_string", NULL);
117b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  case Token::IDENTIFIER:
11855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location,
119beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org                           "unexpected_token_identifier", NULL);
120b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  case Token::FUTURE_RESERVED_WORD:
12155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location, "unexpected_reserved", NULL);
122b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  case Token::FUTURE_STRICT_RESERVED_WORD:
12355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    return ReportMessageAt(source_location,
12404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                           "unexpected_strict_reserved", NULL);
125beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  default:
126b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    const char* name = Token::String(token);
12755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(source_location, "unexpected_token", name);
128beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
129beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
130beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
131beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
132ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define CHECK_OK  ok);                      \
133ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return kUnknownSourceElements;  \
134ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ((void)0
135ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define DUMMY )  // to make indentation work
136ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef DUMMY
137ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
138ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
139b645116853c677aca8a316381b87441ba6004f67danno@chromium.orgPreParser::Statement PreParser::ParseSourceElement(bool* ok) {
140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // (Ecma 262 5th Edition, clause 14):
141c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // SourceElement:
142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //    Statement
143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //    FunctionDeclaration
144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //
145c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // In harmony mode we allow additionally the following productions
146c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // SourceElement:
147c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  //    LetDeclaration
148394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //    ConstDeclaration
149f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //    GeneratorDeclaration
150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
151b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  switch (peek()) {
152b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FUNCTION:
153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return ParseFunctionDeclaration(ok);
154b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::LET:
155b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::CONST:
156b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return ParseVariableStatement(kSourceElement, ok);
157b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    default:
158b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return ParseStatement(ok);
159b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  }
160b645116853c677aca8a316381b87441ba6004f67danno@chromium.org}
161b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
162b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::SourceElements PreParser::ParseSourceElements(int end_token,
164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                         bool* ok) {
165beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // SourceElements ::
166beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   (Statement)* <end_token>
167beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1681c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  bool allow_directive_prologue = true;
169beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (peek() != end_token) {
170b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    Statement statement = ParseSourceElement(CHECK_OK);
1711c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    if (allow_directive_prologue) {
172ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      if (statement.IsUseStrictLiteral()) {
173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        set_language_mode(allow_harmony_scoping() ?
174b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                          EXTENDED_MODE : STRICT_MODE);
175ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      } else if (!statement.IsStringLiteral()) {
1761c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org        allow_directive_prologue = false;
1771c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      }
1781c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    }
179beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
180beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return kUnknownSourceElements;
181beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
182beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
183beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
184ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
185ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define CHECK_OK  ok);                   \
186ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return Statement::Default();  \
187ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ((void)0
188ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define DUMMY )  // to make indentation work
189ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef DUMMY
190ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
191ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseStatement(bool* ok) {
193beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Statement ::
194beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Block
195beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   VariableStatement
196beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   EmptyStatement
197beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ExpressionStatement
198beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   IfStatement
199beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   IterationStatement
200beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ContinueStatement
201beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   BreakStatement
202beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ReturnStatement
203beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   WithStatement
204beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LabelledStatement
205beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   SwitchStatement
206beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ThrowStatement
207beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   TryStatement
208beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   DebuggerStatement
209beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
210beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Note: Since labels can only be used by 'break' and 'continue'
211beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // statements, which themselves are only valid within blocks,
212beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // iterations or 'switch' statements (i.e., BreakableStatements),
213beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // labels can be simply ignored in all other cases; except for
214beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // trivial labeled break statements 'label: break label' which is
215beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // parsed into an empty statement.
216beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
217beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Keep the source position of the statement
218beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  switch (peek()) {
219b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::LBRACE:
220beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseBlock(ok);
221beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
222b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::CONST:
223b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::LET:
224b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::VAR:
225b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return ParseVariableStatement(kStatement, ok);
226beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
227b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::SEMICOLON:
228beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
229ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Statement::Default();
230beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
231b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::IF:
232ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return ParseIfStatement(ok);
233beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
234b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::DO:
235beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseDoWhileStatement(ok);
236beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
237b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::WHILE:
238beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseWhileStatement(ok);
239beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
240b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FOR:
241beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseForStatement(ok);
242beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
243b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::CONTINUE:
244beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseContinueStatement(ok);
245beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
246b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::BREAK:
247beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseBreakStatement(ok);
248beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
249b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::RETURN:
250beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseReturnStatement(ok);
251beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
252b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::WITH:
253beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseWithStatement(ok);
254beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
255b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::SWITCH:
256beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseSwitchStatement(ok);
257beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
258b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::THROW:
259beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseThrowStatement(ok);
260beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
261b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::TRY:
262beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseTryStatement(ok);
263beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
264b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FUNCTION: {
265b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location start_location = scanner()->peek_location();
266c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      Statement statement = ParseFunctionDeclaration(CHECK_OK);
267b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location end_location = scanner()->location();
2681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (!is_classic_mode()) {
269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        ReportMessageAt(start_location.beg_pos, end_location.end_pos,
270c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        "strict_function", NULL);
271c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        *ok = false;
272c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        return Statement::Default();
273c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      } else {
274c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        return statement;
275c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
276c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
277beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
278b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::DEBUGGER:
279beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseDebuggerStatement(ok);
280beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
281beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    default:
282beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      return ParseExpressionOrLabelledStatement(ok);
283beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
284beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
285beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
286beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
287a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
288beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // FunctionDeclaration ::
289beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
290f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // GeneratorDeclaration ::
291f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //   'function' '*' Identifier '(' FormalParameterListopt ')'
292f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //      '{' FunctionBody '}'
293b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::FUNCTION, CHECK_OK);
294ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
295b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  bool is_generator = allow_generators() && Check(Token::MUL);
296ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Identifier identifier = ParseIdentifier(CHECK_OK);
297b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Scanner::Location location = scanner()->location();
298ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
299f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Expression function_value = ParseFunctionLiteral(is_generator, CHECK_OK);
300ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
301ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (function_value.IsStrictFunction() &&
302ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      !identifier.IsValidStrictVariable()) {
303ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // Strict mode violation, using either reserved word or eval/arguments
304ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // as name of strict function.
305ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    const char* type = "strict_function_name";
306f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    if (identifier.IsFutureStrictReserved() || identifier.IsYield()) {
307ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      type = "strict_reserved_word";
308ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
30955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, type, NULL);
310ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
311ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
31240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  return Statement::FunctionDeclaration();
313beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
314beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
315beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseBlock(bool* ok) {
317beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Block ::
318beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '{' Statement* '}'
319beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
320beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Note that a Block does not introduce a new execution scope!
321beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // (ECMA-262, 3rd, 12.2)
322beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //
323b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LBRACE, CHECK_OK);
324b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  while (peek() != Token::RBRACE) {
3251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (is_extended_mode()) {
326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ParseSourceElement(CHECK_OK);
327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    } else {
328c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ParseStatement(CHECK_OK);
32940cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org    }
330beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
331b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RBRACE, ok);
332ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
333beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
334beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
335beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
336b645116853c677aca8a316381b87441ba6004f67danno@chromium.orgPreParser::Statement PreParser::ParseVariableStatement(
337b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    VariableDeclarationContext var_context,
338b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    bool* ok) {
339beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // VariableStatement ::
340beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   VariableDeclarations ';'
341beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
342b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  Statement result = ParseVariableDeclarations(var_context,
343b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                                               NULL,
344394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                                               NULL,
345b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                                               CHECK_OK);
346beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
347beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
348beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
349beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
350beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
351beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// If the variable declaration declares exactly one non-const
352beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// variable, then *var is set to that variable. In all other cases,
353beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// *var is untouched; in particular, it is the caller's responsibility
354beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// to initialize it properly. This mechanism is also used for the parsing
355beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// of 'for-in' loops.
356b645116853c677aca8a316381b87441ba6004f67danno@chromium.orgPreParser::Statement PreParser::ParseVariableDeclarations(
357b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    VariableDeclarationContext var_context,
358394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    VariableDeclarationProperties* decl_props,
359b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    int* num_decl,
360b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    bool* ok) {
361beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // VariableDeclarations ::
362beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
363394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //
364394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // The ES6 Draft Rev3 specifies the following grammar for const declarations
365394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //
366394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // ConstDeclaration ::
367394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //   const ConstBinding (',' ConstBinding)* ';'
368394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // ConstBinding ::
369394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //   Identifier '=' AssignmentExpression
370394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //
371394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // TODO(ES6):
372394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // ConstBinding ::
373394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  //   BindingPattern '=' AssignmentExpression
374394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  bool require_initializer = false;
375b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::VAR) {
376b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::VAR);
377b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } else if (peek() == Token::CONST) {
3781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads:
3791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
3801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
3811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
3821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // * It is a Syntax Error if the code that matches this production is not
3831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //   contained in extended code.
3841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
3851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // However disallowing const in classic mode will break compatibility with
3861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // existing pages. Therefore we keep allowing const with the old
3871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // non-harmony semantics in classic mode.
388b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::CONST);
3891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    switch (language_mode()) {
390b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case CLASSIC_MODE:
3911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        break;
392b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case STRICT_MODE: {
393b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Scanner::Location location = scanner()->peek_location();
3941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        ReportMessageAt(location, "strict_const", NULL);
395394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        *ok = false;
396394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        return Statement::Default();
397394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      }
398b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case EXTENDED_MODE:
3991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        if (var_context != kSourceElement &&
4001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org            var_context != kForStatement) {
401b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org          Scanner::Location location = scanner()->peek_location();
4021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          ReportMessageAt(location.beg_pos, location.end_pos,
4031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                          "unprotected_const", NULL);
4041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          *ok = false;
4051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          return Statement::Default();
4061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        }
4071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        require_initializer = true;
4081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        break;
4091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    }
410b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } else if (peek() == Token::LET) {
4111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // ES6 Draft Rev4 section 12.2.1:
4121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
4131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // LetDeclaration : let LetBindingList ;
4141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //
4151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    // * It is a Syntax Error if the code that matches this production is not
4161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    //   contained in extended code.
4171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_extended_mode()) {
418b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location location = scanner()->peek_location();
4191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      ReportMessageAt(location.beg_pos, location.end_pos,
4201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      "illegal_let", NULL);
42140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      *ok = false;
42240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      return Statement::Default();
42340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org    }
424b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::LET);
425b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    if (var_context != kSourceElement &&
426b645116853c677aca8a316381b87441ba6004f67danno@chromium.org        var_context != kForStatement) {
427b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location location = scanner()->peek_location();
428b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      ReportMessageAt(location.beg_pos, location.end_pos,
429b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                      "unprotected_let", NULL);
430b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      *ok = false;
431b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      return Statement::Default();
432b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    }
433beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
434beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
435ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Statement::Default();
436beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
437beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
438b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // The scope of a var/const declared variable anywhere inside a function
439b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). The scope
440b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // of a let declared variable is the scope of the immediately enclosing
441b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // block.
442beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  int nvars = 0;  // the number of variables declared
443beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  do {
444beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // Parse variable name.
445b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (nvars > 0) Consume(Token::COMMA);
446ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier identifier  = ParseIdentifier(CHECK_OK);
4471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() && !identifier.IsValidStrictVariable()) {
448a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      StrictModeIdentifierViolation(scanner()->location(),
449ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_var_name",
450ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    identifier,
451ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    ok);
452ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Statement::Default();
453ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
454beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    nvars++;
455b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (peek() == Token::ASSIGN || require_initializer) {
456b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::ASSIGN, CHECK_OK);
457b645116853c677aca8a316381b87441ba6004f67danno@chromium.org      ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
458394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      if (decl_props != NULL) *decl_props = kHasInitializers;
459beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
460b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } while (peek() == Token::COMMA);
461beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
462beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (num_decl != NULL) *num_decl = nvars;
463ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
464beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
465beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
466beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
467ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgPreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) {
468beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ExpressionStatement | LabelledStatement ::
469beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Expression ';'
470beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Identifier ':' Statement
471beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
472beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expr = ParseExpression(true, CHECK_OK);
4737b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  if (expr.IsRawIdentifier()) {
474c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    ASSERT(!expr.AsIdentifier().IsFutureReserved());
475f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    ASSERT(is_classic_mode() ||
476f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org           (!expr.AsIdentifier().IsFutureStrictReserved() &&
477f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org            !expr.AsIdentifier().IsYield()));
478b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (peek() == Token::COLON) {
479b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Consume(Token::COLON);
480c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return ParseStatement(ok);
48140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org    }
4827b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    // Preparsing is disabled for extensions (because the extension details
4837b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    // aren't passed to lazily compiled functions), so we don't
4847b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org    // accept "native function" in the preparser.
485beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
486beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parsed expression statement.
487beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
488ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::ExpressionStatement(expr);
489beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
490beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
491beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseIfStatement(bool* ok) {
493beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // IfStatement ::
494beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'if' '(' Expression ')' Statement ('else' Statement)?
495beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
496b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::IF, CHECK_OK);
497b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
498beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
499b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, CHECK_OK);
500beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseStatement(CHECK_OK);
501b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::ELSE) {
502beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
503beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseStatement(CHECK_OK);
504beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
505ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
506beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
507beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
508beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseContinueStatement(bool* ok) {
510beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ContinueStatement ::
511beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'continue' [no line terminator] Identifier? ';'
512beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
513b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::CONTINUE, CHECK_OK);
514b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value tok = peek();
515a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
516b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::SEMICOLON &&
517b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::RBRACE &&
518b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::EOS) {
519beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseIdentifier(CHECK_OK);
520beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
521beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
522ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
523beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
524beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
525beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseBreakStatement(bool* ok) {
527beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // BreakStatement ::
528beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'break' [no line terminator] Identifier? ';'
529beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
530b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::BREAK, CHECK_OK);
531b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value tok = peek();
532a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
533b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::SEMICOLON &&
534b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::RBRACE &&
535b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::EOS) {
536beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseIdentifier(CHECK_OK);
537beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
538beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
539ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
540beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
541beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
542beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseReturnStatement(bool* ok) {
544beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ReturnStatement ::
545beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'return' [no line terminator] Expression? ';'
546beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
547beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Consume the return token. It is necessary to do the before
548beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // reporting any errors on it, because of the way errors are
549beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // reported (underlining).
550b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RETURN, CHECK_OK);
551beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
552beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // An ECMAScript program is considered syntactically incorrect if it
553beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // contains a return statement that is not within the body of a
554beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // function. See ECMA-262, section 12.9, page 67.
555beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // This is not handled during preparsing.
556beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
557b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value tok = peek();
558a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
559b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::SEMICOLON &&
560b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::RBRACE &&
561b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      tok != Token::EOS) {
562beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseExpression(true, CHECK_OK);
563beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
564beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ExpectSemicolon(CHECK_OK);
565ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
566beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
567beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
568beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
569a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseWithStatement(bool* ok) {
570beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // WithStatement ::
571beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'with' '(' Expression ')' Statement
572b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::WITH, CHECK_OK);
5731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
574b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Scanner::Location location = scanner()->location();
57555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, "strict_mode_with", NULL);
576ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
577ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Statement::Default();
578ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
579b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
580beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
581b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, CHECK_OK);
582beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
5832c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  Scope::InsideWith iw(scope_);
584beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseStatement(CHECK_OK);
585ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
586beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
587beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
588beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseSwitchStatement(bool* ok) {
590beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // SwitchStatement ::
591beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'switch' '(' Expression ')' '{' CaseClause* '}'
592beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
593b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::SWITCH, CHECK_OK);
594b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
595beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
596b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, CHECK_OK);
597beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
598b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LBRACE, CHECK_OK);
599b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value token = peek();
600b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  while (token != Token::RBRACE) {
601b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (token == Token::CASE) {
602b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::CASE, CHECK_OK);
603beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      ParseExpression(true, CHECK_OK);
604beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    } else {
605b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::DEFAULT, CHECK_OK);
606beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
607b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Expect(Token::COLON, CHECK_OK);
608beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    token = peek();
609b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    while (token != Token::CASE &&
610b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org           token != Token::DEFAULT &&
611b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org           token != Token::RBRACE) {
612657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org      ParseStatement(CHECK_OK);
613657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org      token = peek();
614657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    }
615beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
616b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RBRACE, ok);
617ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
618beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
619beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
620beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseDoWhileStatement(bool* ok) {
622beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // DoStatement ::
623beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'do' Statement 'while' '(' Expression ')' ';'
624beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
625b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::DO, CHECK_OK);
626beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseStatement(CHECK_OK);
627b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::WHILE, CHECK_OK);
628b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
629beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
630b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, ok);
631b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON);
632ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
633beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
634beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
635beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
636a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseWhileStatement(bool* ok) {
637beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // WhileStatement ::
638beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'while' '(' Expression ')' Statement
639beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
640b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::WHILE, CHECK_OK);
641b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
642beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
643b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, CHECK_OK);
644ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ParseStatement(ok);
645ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
646beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
647beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
648beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
64941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgbool PreParser::CheckInOrOf(bool accept_OF) {
650b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (Check(Token::IN) ||
651b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      (allow_for_of() && accept_OF &&
652b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org       CheckContextualKeyword(CStrVector("of")))) {
6531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return true;
6541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
6551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return false;
6561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
6571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
6581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseForStatement(bool* ok) {
660beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ForStatement ::
661beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
662beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
663b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::FOR, CHECK_OK);
664b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
665b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() != Token::SEMICOLON) {
666b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (peek() == Token::VAR || peek() == Token::CONST ||
667b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        peek() == Token::LET) {
668b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      bool is_let = peek() == Token::LET;
669beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      int decl_count;
670394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      VariableDeclarationProperties decl_props = kHasNoInitializers;
671394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      ParseVariableDeclarations(
672394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com          kForStatement, &decl_props, &decl_count, CHECK_OK);
67341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      bool has_initializers = decl_props == kHasInitializers;
67441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      bool accept_IN = decl_count == 1 && !(is_let && has_initializers);
67541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      bool accept_OF = !has_initializers;
67641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      if (accept_IN && CheckInOrOf(accept_OF)) {
677beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
678b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Expect(Token::RPAREN, CHECK_OK);
679beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
680beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseStatement(CHECK_OK);
681ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        return Statement::Default();
682beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
683beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    } else {
68441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      Expression lhs = ParseExpression(false, CHECK_OK);
68541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      if (CheckInOrOf(lhs.IsIdentifier())) {
686beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
687b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Expect(Token::RPAREN, CHECK_OK);
688beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
689beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseStatement(CHECK_OK);
690ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        return Statement::Default();
691beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
692beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
693beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
694beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
695beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parsed initializer at this point.
696b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::SEMICOLON, CHECK_OK);
697beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
698b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() != Token::SEMICOLON) {
699beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseExpression(true, CHECK_OK);
700beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
701b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::SEMICOLON, CHECK_OK);
702beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
703b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() != Token::RPAREN) {
704beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseExpression(true, CHECK_OK);
705beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
706b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, CHECK_OK);
707beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
708ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ParseStatement(ok);
709ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
710beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
711beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
712beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseThrowStatement(bool* ok) {
714beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ThrowStatement ::
715beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'throw' [no line terminator] Expression ';'
716beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
717b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::THROW, CHECK_OK);
718a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (scanner()->HasAnyLineTerminatorBeforeNext()) {
719b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Scanner::Location pos = scanner()->location();
72055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(pos, "newline_after_throw", NULL);
721beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
722ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Statement::Default();
723beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
724beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseExpression(true, CHECK_OK);
725ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ExpectSemicolon(ok);
726ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
727beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
728beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
729beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
730a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseTryStatement(bool* ok) {
731beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // TryStatement ::
732beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'try' Block Catch
733beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'try' Block Finally
734beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'try' Block Catch Finally
735beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //
736beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Catch ::
737beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'catch' '(' Identifier ')' Block
738beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //
739beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Finally ::
740beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'finally' Block
741beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
742beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // In preparsing, allow any number of catch/finally blocks, including zero
743beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // of both.
744beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
745b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::TRY, CHECK_OK);
746beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
747beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseBlock(CHECK_OK);
748beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
749beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool catch_or_finally_seen = false;
750b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::CATCH) {
751b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::CATCH);
752b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Expect(Token::LPAREN, CHECK_OK);
753ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier id = ParseIdentifier(CHECK_OK);
7541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() && !id.IsValidStrictVariable()) {
755a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      StrictModeIdentifierViolation(scanner()->location(),
756ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_catch_variable",
757ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    id,
758ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    ok);
759ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Statement::Default();
760ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
761b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Expect(Token::RPAREN, CHECK_OK);
7622c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    { Scope::InsideWith iw(scope_);
7632c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org      ParseBlock(CHECK_OK);
7642c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    }
765beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    catch_or_finally_seen = true;
766beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
767b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::FINALLY) {
768b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::FINALLY);
769beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseBlock(CHECK_OK);
770beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    catch_or_finally_seen = true;
771beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
772beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (!catch_or_finally_seen) {
773beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
774beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
775ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
776beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
777beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
778beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Statement PreParser::ParseDebuggerStatement(bool* ok) {
780beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
781beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // contexts this is used as a statement which invokes the debugger as if a
782beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // break point is present.
783beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // DebuggerStatement ::
784beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'debugger' ';'
785beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
786b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::DEBUGGER, CHECK_OK);
787ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ExpectSemicolon(ok);
788ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Statement::Default();
789beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
790beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
791beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
792ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
793ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define CHECK_OK  ok);                     \
794ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return Expression::Default();  \
795ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ((void)0
796ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#define DUMMY )  // to make indentation work
797ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef DUMMY
798ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
799ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
800beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence = 1
801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseExpression(bool accept_IN, bool* ok) {
802beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Expression ::
803beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   AssignmentExpression
804beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Expression ',' AssignmentExpression
805beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
806beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression result = ParseAssignmentExpression(accept_IN, CHECK_OK);
807b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  while (peek() == Token::COMMA) {
808b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Expect(Token::COMMA, CHECK_OK);
809beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseAssignmentExpression(accept_IN, CHECK_OK);
810ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    result = Expression::Default();
811beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
812beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
813beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
814beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
815beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
816beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence = 2
817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN,
818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                           bool* ok) {
819beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // AssignmentExpression ::
820beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ConditionalExpression
821f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //   YieldExpression
822beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LeftHandSideExpression AssignmentOperator AssignmentExpression
823beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
824b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (scope_->is_generator() && peek() == Token::YIELD) {
825f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return ParseYieldExpression(ok);
826f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
827f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
828b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Scanner::Location before = scanner()->peek_location();
829beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK);
830beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
831b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (!Token::IsAssignmentOp(peek())) {
832beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // Parsed conditional expression only (no assignment).
833beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return expression;
834beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
835beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
8361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode() &&
8371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      expression.IsIdentifier() &&
838ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      expression.AsIdentifier().IsEvalOrArguments()) {
839b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Scanner::Location after = scanner()->location();
840ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    ReportMessageAt(before.beg_pos, after.end_pos,
841ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                    "strict_lhs_assignment", NULL);
842ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
843ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
844ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
845ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
846b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value op = Next();  // Get assignment operator.
847beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseAssignmentExpression(accept_IN, CHECK_OK);
848beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
849b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if ((op == Token::ASSIGN) && expression.IsThisProperty()) {
850beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    scope_->AddProperty();
851beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
852beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
853ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
854beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
855beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
856beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
857beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence = 3
858f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgPreParser::Expression PreParser::ParseYieldExpression(bool* ok) {
859f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // YieldExpression ::
860f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //   'yield' '*'? AssignmentExpression
861b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Consume(Token::YIELD);
862b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Check(Token::MUL);
863f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
864f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ParseAssignmentExpression(false, CHECK_OK);
865f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
866f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return Expression::Default();
867f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
868f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
869f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
870f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// Precedence = 3
871a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseConditionalExpression(bool accept_IN,
872a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                            bool* ok) {
873beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ConditionalExpression ::
874beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LogicalOrExpression
875beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
876beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
877beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // We start using the binary expression parser for prec >= 4 only!
878beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expression = ParseBinaryExpression(4, accept_IN, CHECK_OK);
879b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() != Token::CONDITIONAL) return expression;
880b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Consume(Token::CONDITIONAL);
881beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // In parsing the first assignment expression in conditional
882beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // expressions we always accept the 'in' keyword; see ECMA-262,
883beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // section 11.12, page 58.
884beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseAssignmentExpression(true, CHECK_OK);
885b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::COLON, CHECK_OK);
886beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseAssignmentExpression(accept_IN, CHECK_OK);
887ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
888beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
889beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
890beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
891beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// Precedence >= 4
892a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseBinaryExpression(int prec,
893a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                       bool accept_IN,
894a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                       bool* ok) {
895beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression result = ParseUnaryExpression(CHECK_OK);
896beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
897beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // prec1 >= 4
898beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    while (Precedence(peek(), accept_IN) == prec1) {
899beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
900beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
901ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = Expression::Default();
902beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
903beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
904beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
905beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
906beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
907beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
908a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseUnaryExpression(bool* ok) {
909beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // UnaryExpression ::
910beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   PostfixExpression
911beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'delete' UnaryExpression
912beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'void' UnaryExpression
913beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'typeof' UnaryExpression
914beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '++' UnaryExpression
915beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '--' UnaryExpression
916beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '+' UnaryExpression
917beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '-' UnaryExpression
918beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '~' UnaryExpression
919beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '!' UnaryExpression
920beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
921b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value op = peek();
922b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (Token::IsUnaryOp(op)) {
923beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    op = Next();
924beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseUnaryExpression(ok);
925ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
926b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } else if (Token::IsCountOp(op)) {
927ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    op = Next();
928b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Scanner::Location before = scanner()->peek_location();
929ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Expression expression = ParseUnaryExpression(CHECK_OK);
9301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() &&
9311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        expression.IsIdentifier() &&
932ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        expression.AsIdentifier().IsEvalOrArguments()) {
933b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location after = scanner()->location();
934ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      ReportMessageAt(before.beg_pos, after.end_pos,
935ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                      "strict_lhs_prefix", NULL);
936ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      *ok = false;
937ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
938ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
939beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
940beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return ParsePostfixExpression(ok);
941beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
942beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
943beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
944beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
945a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParsePostfixExpression(bool* ok) {
946beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // PostfixExpression ::
947beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   LeftHandSideExpression ('++' | '--')?
948beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
949b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Scanner::Location before = scanner()->peek_location();
950beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Expression expression = ParseLeftHandSideExpression(CHECK_OK);
951a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
952b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Token::IsCountOp(peek())) {
9531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!is_classic_mode() &&
9541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        expression.IsIdentifier() &&
955ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        expression.AsIdentifier().IsEvalOrArguments()) {
956b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location after = scanner()->location();
957ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      ReportMessageAt(before.beg_pos, after.end_pos,
958ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                      "strict_lhs_postfix", NULL);
959ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      *ok = false;
960ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Expression::Default();
961ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
962beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
963ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
964beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
965beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return expression;
966beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
967beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
968beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseLeftHandSideExpression(bool* ok) {
970beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // LeftHandSideExpression ::
971beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   (NewExpression | MemberExpression) ...
972beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
973ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expression result = Expression::Default();
974b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::NEW) {
975beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    result = ParseNewExpression(CHECK_OK);
976beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
977beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    result = ParseMemberExpression(CHECK_OK);
978beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
979beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
980beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (true) {
981beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    switch (peek()) {
982b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::LBRACK: {
983b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Consume(Token::LBRACK);
984beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
985b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Expect(Token::RBRACK, CHECK_OK);
986ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
987ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
988beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
989ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
990beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
991beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
992beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
993beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
994b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::LPAREN: {
995beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseArguments(CHECK_OK);
996ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        result = Expression::Default();
997beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
998beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
999beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1000b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::PERIOD: {
1001b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Consume(Token::PERIOD);
1002beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseIdentifierName(CHECK_OK);
1003ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1004ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1005beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1006ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1007beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1008beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1009beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1010beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1011beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      default:
1012beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        return result;
1013beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1014beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1015beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1016beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1017beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1018a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseNewExpression(bool* ok) {
1019beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // NewExpression ::
1020beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ('new')+ MemberExpression
1021beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1022beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // The grammar for new expressions is pretty warped. The keyword
1023beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // 'new' can either be a part of the new expression (where it isn't
1024beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // followed by an argument list) or a part of the member expression,
1025beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // where it must be followed by an argument list. To accommodate
1026beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // this, we parse the 'new' keywords greedily and keep track of how
1027beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // many we have parsed. This information is then passed on to the
1028beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // member expression parser, which is only allowed to match argument
1029beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // lists as long as it has 'new' prefixes left
1030beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  unsigned new_count = 0;
1031beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  do {
1032b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::NEW);
1033beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    new_count++;
1034b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } while (peek() == Token::NEW);
1035beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1036beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return ParseMemberWithNewPrefixesExpression(new_count, ok);
1037beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1038beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1039beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1040a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseMemberExpression(bool* ok) {
1041beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return ParseMemberWithNewPrefixesExpression(0, ok);
1042beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1043beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1044beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1045a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseMemberWithNewPrefixesExpression(
1046beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    unsigned new_count, bool* ok) {
1047beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // MemberExpression ::
1048beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   (PrimaryExpression | FunctionLiteral)
1049beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //     ('[' Expression ']' | '.' Identifier | Arguments)*
1050beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1051beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parse the initial primary or function expression.
1052ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expression result = Expression::Default();
1053b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (peek() == Token::FUNCTION) {
1054b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Consume(Token::FUNCTION);
1055f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
1056b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    bool is_generator = allow_generators() && Check(Token::MUL);
1057ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier identifier = Identifier::Default();
105883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    if (peek_any_identifier()) {
1059ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      identifier = ParseIdentifier(CHECK_OK);
1060beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1061f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    result = ParseFunctionLiteral(is_generator, CHECK_OK);
1062ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (result.IsStrictFunction() && !identifier.IsValidStrictVariable()) {
1063a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      StrictModeIdentifierViolation(scanner()->location(),
1064ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_function_name",
1065ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    identifier,
1066ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    ok);
1067ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Expression::Default();
1068ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
1069beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
1070beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    result = ParsePrimaryExpression(CHECK_OK);
1071beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1072beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1073beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (true) {
1074beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    switch (peek()) {
1075b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::LBRACK: {
1076b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Consume(Token::LBRACK);
1077beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseExpression(true, CHECK_OK);
1078b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Expect(Token::RBRACK, CHECK_OK);
1079ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1080ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1081beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1082ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1083beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1084beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1085beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1086b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::PERIOD: {
1087b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Consume(Token::PERIOD);
1088beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseIdentifierName(CHECK_OK);
1089ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        if (result.IsThis()) {
1090ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::ThisProperty();
1091beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1092ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          result = Expression::Default();
1093beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1094beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1095beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1096b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::LPAREN: {
1097beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        if (new_count == 0) return result;
1098beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        // Consume one of the new prefixes (already parsed).
1099beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ParseArguments(CHECK_OK);
1100beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        new_count--;
1101ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org        result = Expression::Default();
1102beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1103beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1104beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      default:
1105beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        return result;
1106beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1107beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1108beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1109beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1110beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParsePrimaryExpression(bool* ok) {
1112beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // PrimaryExpression ::
1113beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'this'
1114beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'null'
1115beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'true'
1116beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   'false'
1117beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Identifier
1118beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   Number
1119beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   String
1120beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ArrayLiteral
1121beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   ObjectLiteral
1122beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   RegExpLiteral
1123beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '(' Expression ')'
1124beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1125ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Expression result = Expression::Default();
1126beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  switch (peek()) {
1127b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::THIS: {
1128beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1129ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = Expression::This();
1130beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1131beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1132beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1133b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FUTURE_RESERVED_WORD:
1134b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FUTURE_STRICT_RESERVED_WORD:
1135b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::YIELD:
1136b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::IDENTIFIER: {
1137ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      Identifier id = ParseIdentifier(CHECK_OK);
1138ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = Expression::FromIdentifier(id);
1139beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1140beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1141beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1142b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::NULL_LITERAL:
1143b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::TRUE_LITERAL:
1144b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FALSE_LITERAL:
1145b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::NUMBER: {
1146beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1147beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1148beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1149b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::STRING: {
1150beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1151beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = GetStringSymbol();
1152beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1153beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1154beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1155b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::ASSIGN_DIV:
1156beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseRegExpLiteral(true, CHECK_OK);
1157beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1158beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1159b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::DIV:
1160beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseRegExpLiteral(false, CHECK_OK);
1161beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1162beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1163b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::LBRACK:
1164beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseArrayLiteral(CHECK_OK);
1165beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1166beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1167b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::LBRACE:
1168beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseObjectLiteral(CHECK_OK);
1169beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1170beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1171b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::LPAREN:
1172b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Consume(Token::LPAREN);
1173b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      parenthesized_function_ = (peek() == Token::FUNCTION);
1174beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseExpression(true, CHECK_OK);
1175b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::RPAREN, CHECK_OK);
1176ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      result = result.Parenthesize();
1177beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1178beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1179b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::MOD:
1180beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      result = ParseV8Intrinsic(CHECK_OK);
1181beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      break;
1182beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1183beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    default: {
1184beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      Next();
1185beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      *ok = false;
1186ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Expression::Default();
1187beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1188beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1189beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1190beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return result;
1191beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1192beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1193beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1194a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
1195beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ArrayLiteral ::
1196beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '[' Expression? (',' Expression?)* ']'
1197b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LBRACK, CHECK_OK);
1198b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  while (peek() != Token::RBRACK) {
1199b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (peek() != Token::COMMA) {
1200beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      ParseAssignmentExpression(true, CHECK_OK);
1201beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1202b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (peek() != Token::RBRACK) {
1203b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::COMMA, CHECK_OK);
1204beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1205beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1206b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RBRACK, CHECK_OK);
1207beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1208beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  scope_->NextMaterializedLiteralIndex();
1209ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1210beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1211beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1212beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
1214beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // ObjectLiteral ::
1215beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '{' (
1216beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //       ((IdentifierName | String | Number) ':' AssignmentExpression)
1217beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //     | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
1218beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //    )*[','] '}'
1219beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1220b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  ObjectLiteralChecker checker(this, language_mode());
1221dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org
1222b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LBRACE, CHECK_OK);
1223b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  while (peek() != Token::RBRACE) {
1224b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Token::Value next = peek();
1225beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    switch (next) {
1226b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::IDENTIFIER:
1227b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::FUTURE_RESERVED_WORD:
1228b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::FUTURE_STRICT_RESERVED_WORD: {
1229beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        bool is_getter = false;
1230beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        bool is_setter = false;
123104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org        ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK);
1232b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        if ((is_getter || is_setter) && peek() != Token::COLON) {
1233b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org            Token::Value name = Next();
1234b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org            bool is_keyword = Token::IsKeyword(name);
1235b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org            if (name != Token::IDENTIFIER &&
1236b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                name != Token::FUTURE_RESERVED_WORD &&
1237b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                name != Token::FUTURE_STRICT_RESERVED_WORD &&
1238b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                name != Token::NUMBER &&
1239b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                name != Token::STRING &&
12405d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org                !is_keyword) {
1241beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org              *ok = false;
1242ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org              return Expression::Default();
1243beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            }
12445d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org            if (!is_keyword) {
12455d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org              LogSymbol();
12465d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org            }
1247b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org            PropertyKind type = is_getter ? kGetterProperty : kSetterProperty;
1248dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org            checker.CheckProperty(name, type, CHECK_OK);
1249f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org            ParseFunctionLiteral(false, CHECK_OK);
1250b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org            if (peek() != Token::RBRACE) {
1251b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org              Expect(Token::COMMA, CHECK_OK);
1252beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            }
1253beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org            continue;  // restart the while
1254beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1255b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        checker.CheckProperty(next, kValueProperty, CHECK_OK);
1256beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1257beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      }
1258b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::STRING:
1259beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(next);
1260b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        checker.CheckProperty(next, kValueProperty, CHECK_OK);
1261beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        GetStringSymbol();
1262beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1263b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      case Token::NUMBER:
1264beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        Consume(next);
1265b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        checker.CheckProperty(next, kValueProperty, CHECK_OK);
1266beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        break;
1267beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org      default:
1268b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        if (Token::IsKeyword(next)) {
1269beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org          Consume(next);
1270b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org          checker.CheckProperty(next, kValueProperty, CHECK_OK);
1271beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        } else {
1272beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org          // Unexpected token.
1273beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org          *ok = false;
1274ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org          return Expression::Default();
1275beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        }
1276beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1277beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1278b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    Expect(Token::COLON, CHECK_OK);
1279beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    ParseAssignmentExpression(true, CHECK_OK);
1280beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1281beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    // TODO(1240767): Consider allowing trailing comma.
1282b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
1283beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1284b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RBRACE, CHECK_OK);
1285beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1286beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  scope_->NextMaterializedLiteralIndex();
1287ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1288beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1289beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1290beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseRegExpLiteral(bool seen_equal,
1292a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                    bool* ok) {
1293a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!scanner()->ScanRegExpPattern(seen_equal)) {
1294beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
1295a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    ReportMessageAt(scanner()->location(), "unterminated_regexp", NULL);
1296beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
1297ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
1298beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1299beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1300beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  scope_->NextMaterializedLiteralIndex();
1301beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1302a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!scanner()->ScanRegExpFlags()) {
1303beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    Next();
1304a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    ReportMessageAt(scanner()->location(), "invalid_regexp_flags", NULL);
1305beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *ok = false;
1306ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::Default();
1307beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1308beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Next();
1309ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1310beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1311beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1312beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1313a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Arguments PreParser::ParseArguments(bool* ok) {
1314beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Arguments ::
1315beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '(' (AssignmentExpression)*[','] ')'
1316beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1317b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, ok);
1318ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return -1;
1319b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  bool done = (peek() == Token::RPAREN);
1320beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  int argc = 0;
1321beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (!done) {
1322ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    ParseAssignmentExpression(true, ok);
1323ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (!*ok) return -1;
1324beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    argc++;
1325b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    done = (peek() == Token::RPAREN);
1326ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (!done) {
1327b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::COMMA, ok);
1328ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      if (!*ok) return -1;
1329ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
1330beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1331b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, ok);
1332beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  return argc;
1333beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1334beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1335beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1336f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgPreParser::Expression PreParser::ParseFunctionLiteral(bool is_generator,
1337f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org                                                      bool* ok) {
1338beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Function ::
1339beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '(' FormalParameterList? ')' '{' FunctionBody '}'
1340beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1341beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Parse function body.
1342beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ScopeType outer_scope_type = scope_->type();
1343beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool inside_with = scope_->IsInsideWith();
1344beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  Scope function_scope(&scope_, kFunctionScope);
1345f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  function_scope.set_is_generator(is_generator);
1346beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //  FormalParameterList ::
1347beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //    '(' (Identifier)*[','] ')'
1348b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LPAREN, CHECK_OK);
1349b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  int start_position = position();
1350b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  bool done = (peek() == Token::RPAREN);
1351b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  DuplicateFinder duplicate_finder(scanner()->unicode_cache());
1352beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  while (!done) {
1353ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    Identifier id = ParseIdentifier(CHECK_OK);
1354ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    if (!id.IsValidStrictVariable()) {
1355a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      StrictModeIdentifierViolation(scanner()->location(),
1356ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    "strict_param_name",
1357ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    id,
1358ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                    CHECK_OK);
1359ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
136055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    int prev_value;
1361a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    if (scanner()->is_literal_ascii()) {
136255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      prev_value =
1363a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org          duplicate_finder.AddAsciiSymbol(scanner()->literal_ascii_string(), 1);
136455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    } else {
136555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org      prev_value =
1366a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org          duplicate_finder.AddUtf16Symbol(scanner()->literal_utf16_string(), 1);
136755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    }
136855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org
136955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    if (prev_value != 0) {
1370a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      SetStrictModeViolation(scanner()->location(),
137155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                             "strict_param_dupe",
137255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org                             CHECK_OK);
137355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    }
1374b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    done = (peek() == Token::RPAREN);
1375beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    if (!done) {
1376b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Expect(Token::COMMA, CHECK_OK);
1377beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    }
1378beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1379b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RPAREN, CHECK_OK);
1380beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1381beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Determine if the function will be lazily compiled.
1382beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Currently only happens to top-level functions.
1383beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // Optimistically assume that all top-level functions are lazily compiled.
1384c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool is_lazily_compiled = (outer_scope_type == kTopLevelScope &&
1385a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org                             !inside_with && allow_lazy() &&
1386c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                             !parenthesized_function_);
1387c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  parenthesized_function_ = false;
1388beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1389b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::LBRACE, CHECK_OK);
1390beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  if (is_lazily_compiled) {
13911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ParseLazyFunctionLiteralBody(CHECK_OK);
1392beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  } else {
1393b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    ParseSourceElements(Token::RBRACE, ok);
1394beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1395b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::RBRACE, CHECK_OK);
13961c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
13971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
1398a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    int end_position = scanner()->location().end_pos;
13991c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    CheckOctalLiteral(start_position, end_position, CHECK_OK);
1400ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK);
1401ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::StrictFunction();
14021c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
14031c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
1404ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1405beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1406beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1407beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
14081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid PreParser::ParseLazyFunctionLiteralBody(bool* ok) {
1409b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  int body_start = position();
14101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_->PauseRecording();
1411b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  ParseSourceElements(Token::RBRACE, ok);
14121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_->ResumeRecording();
14131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!*ok) return;
14141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
14151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Position right after terminal '}'.
1416b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  ASSERT_EQ(Token::RBRACE, scanner()->peek());
1417a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  int body_end = scanner()->peek_location().end_pos;
14181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  log_->LogFunction(body_start, body_end,
14191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    scope_->materialized_literal_count(),
14201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    scope_->expected_properties(),
14211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    language_mode());
14221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
14231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
14241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
1425a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
1426beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  // CallRuntime ::
1427beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  //   '%' Identifier Arguments
1428b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Expect(Token::MOD, CHECK_OK);
1429a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (!allow_natives_syntax()) {
1430394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    *ok = false;
1431394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return Expression::Default();
1432394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
1433beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  ParseIdentifier(CHECK_OK);
1434ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  ParseArguments(ok);
1435beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1436ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::Default();
1437beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1438beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1439ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
1440ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1441beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
14425d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.orgvoid PreParser::LogSymbol() {
1443b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  int identifier_pos = position();
1444a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (scanner()->is_literal_ascii()) {
1445a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    log_->LogAsciiSymbol(identifier_pos, scanner()->literal_ascii_string());
14469e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  } else {
1447a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    log_->LogUtf16Symbol(identifier_pos, scanner()->literal_utf16_string());
14489e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  }
14495d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org}
14505d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org
14515d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org
1452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Expression PreParser::GetStringSymbol() {
14531c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  const int kUseStrictLength = 10;
14541c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  const char* kUseStrictChars = "use strict";
14555d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org  LogSymbol();
1456a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (scanner()->is_literal_ascii() &&
1457a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      scanner()->literal_length() == kUseStrictLength &&
1458a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      !scanner()->literal_contains_escapes() &&
1459a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      !strncmp(scanner()->literal_ascii_string().start(), kUseStrictChars,
14601c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org               kUseStrictLength)) {
1461ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Expression::UseStrictStringLiteral();
1462ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1463ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Expression::StringLiteral();
1464ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1465ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1466ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1467ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgPreParser::Identifier PreParser::GetIdentifierSymbol() {
1468ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  LogSymbol();
1469b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (scanner()->current_token() == Token::FUTURE_RESERVED_WORD) {
1470ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Identifier::FutureReserved();
1471a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  } else if (scanner()->current_token() ==
1472b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org             Token::FUTURE_STRICT_RESERVED_WORD) {
147304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    return Identifier::FutureStrictReserved();
1474b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } else if (scanner()->current_token() == Token::YIELD) {
1475f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return Identifier::Yield();
1476ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1477a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (scanner()->is_literal_ascii()) {
1478ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    // Detect strict-mode poison words.
1479a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    if (scanner()->literal_length() == 4 &&
1480a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        !strncmp(scanner()->literal_ascii_string().start(), "eval", 4)) {
1481ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Identifier::Eval();
1482ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
1483a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    if (scanner()->literal_length() == 9 &&
1484a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        !strncmp(scanner()->literal_ascii_string().start(), "arguments", 9)) {
1485ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      return Identifier::Arguments();
1486ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    }
14871c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
1488ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Identifier::Default();
1489beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1490beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1491beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Identifier PreParser::ParseIdentifier(bool* ok) {
1493b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value next = Next();
149404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  switch (next) {
1495b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FUTURE_RESERVED_WORD: {
1496b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      Scanner::Location location = scanner()->location();
149704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      ReportMessageAt(location.beg_pos, location.end_pos,
149804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                      "reserved_word", NULL);
149904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      *ok = false;
1500c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      return GetIdentifierSymbol();
150104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    }
1502b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::YIELD:
1503f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      if (scope_->is_generator()) {
1504f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        // 'yield' in a generator is only valid as part of a YieldExpression.
1505a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org        ReportMessageAt(scanner()->location(), "unexpected_token", "yield");
1506f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        *ok = false;
1507f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        return Identifier::Yield();
1508f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      }
1509f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      // FALLTHROUGH
1510b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::FUTURE_STRICT_RESERVED_WORD:
15111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (!is_classic_mode()) {
1512b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org        Scanner::Location location = scanner()->location();
1513c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        ReportMessageAt(location.beg_pos, location.end_pos,
1514c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                        "strict_reserved_word", NULL);
1515c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        *ok = false;
1516c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
1517c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      // FALLTHROUGH
1518b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    case Token::IDENTIFIER:
151904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      return GetIdentifierSymbol();
152004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    default:
152104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      *ok = false;
152204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      return Identifier::Default();
152383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
1524beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1525beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1526beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1527b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvoid PreParser::SetStrictModeViolation(Scanner::Location location,
1528ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                       const char* type,
1529ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                       bool* ok) {
15301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
153155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, type, NULL);
1532ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
1533ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return;
1534ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1535ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  // Delay report in case this later turns out to be strict code
1536ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  // (i.e., for function names and parameters prior to a "use strict"
1537ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  // directive).
153855ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // It's safe to overwrite an existing violation.
153955ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // It's either from a function that turned out to be non-strict,
154055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // or it's in the current function (and we just need to report
154155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // one error), or it's in a unclosed nesting function that wasn't
154255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org  // strict (otherwise we would already be in strict mode).
1543ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_location_ = location;
1544ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_type_ = type;
1545ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1546ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1547ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1548ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid PreParser::CheckDelayedStrictModeViolation(int beg_pos,
1549ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                                int end_pos,
1550ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                                bool* ok) {
1551b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Scanner::Location location = strict_mode_violation_location_;
1552ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (location.IsValid() &&
1553ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org      location.beg_pos > beg_pos && location.end_pos < end_pos) {
155455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, strict_mode_violation_type_, NULL);
1555ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
1556ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1557ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1558ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1559ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1560b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvoid PreParser::StrictModeIdentifierViolation(Scanner::Location location,
1561ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                              const char* eval_args_type,
1562ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                              Identifier identifier,
1563ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org                                              bool* ok) {
1564ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  const char* type = eval_args_type;
1565ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (identifier.IsFutureReserved()) {
156604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    type = "reserved_word";
1567f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  } else if (identifier.IsFutureStrictReserved() || identifier.IsYield()) {
1568ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    type = "strict_reserved_word";
1569ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
15701b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!is_classic_mode()) {
157155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org    ReportMessageAt(location, type, NULL);
1572ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    *ok = false;
1573ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return;
1574ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  }
1575ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_location_ = location;
1576ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  strict_mode_violation_type_ = type;
1577ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org}
1578ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1579ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgPreParser::Identifier PreParser::ParseIdentifierName(bool* ok) {
1581b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  Token::Value next = Next();
1582b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (Token::IsKeyword(next)) {
1583b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    int pos = position();
1584b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    const char* keyword = Token::String(next);
1585b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    log_->LogAsciiSymbol(pos, Vector<const char>(keyword, StrLength(keyword)));
1586ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org    return Identifier::Default();
1587beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1588b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (next == Token::IDENTIFIER ||
1589b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      next == Token::FUTURE_RESERVED_WORD ||
1590b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      next == Token::FUTURE_STRICT_RESERVED_WORD) {
1591beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return GetIdentifierSymbol();
1592beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
1593beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  *ok = false;
1594ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  return Identifier::Default();
1595beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org}
1596beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1597ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org#undef CHECK_OK
1598ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
1599beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org
1600beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org// This function reads an identifier and determines whether or not it
160183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// is 'get' or 'set'.
160204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.orgPreParser::Identifier PreParser::ParseIdentifierNameOrGetOrSet(bool* is_get,
160304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                                                               bool* is_set,
160404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                                                               bool* ok) {
160504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  Identifier result = ParseIdentifierName(ok);
1606ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  if (!*ok) return Identifier::Default();
1607a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (scanner()->is_literal_ascii() &&
1608a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      scanner()->literal_length() == 3) {
1609a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    const char* token = scanner()->literal_ascii_string().start();
1610beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *is_get = strncmp(token, "get", 3) == 0;
1611beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    *is_set = !*is_get && strncmp(token, "set", 3) == 0;
1612beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  }
161383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  return result;
161483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
161583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
1616e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1617b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.orgvoid PreParser::ObjectLiteralChecker::CheckProperty(Token::Value property,
1618b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                                                    PropertyKind type,
1619b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                                                    bool* ok) {
1620b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  int old;
1621b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (property == Token::NUMBER) {
1622b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    old = finder_.AddNumber(scanner()->literal_ascii_string(), type);
1623b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } else if (scanner()->is_literal_ascii()) {
1624b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    old = finder_.AddAsciiSymbol(scanner()->literal_ascii_string(), type);
1625b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  } else {
1626b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    old = finder_.AddUtf16Symbol(scanner()->literal_utf16_string(), type);
1627b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  }
1628b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  PropertyKind old_type = static_cast<PropertyKind>(old);
1629b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  if (HasConflict(old_type, type)) {
1630b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    if (IsDataDataConflict(old_type, type)) {
1631b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      // Both are data properties.
1632b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      if (language_mode_ == CLASSIC_MODE) return;
1633b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      parser()->ReportMessageAt(scanner()->location(),
1634b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                               "strict_duplicate_property");
1635b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    } else if (IsDataAccessorConflict(old_type, type)) {
1636b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      // Both a data and an accessor property with the same name.
1637b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      parser()->ReportMessageAt(scanner()->location(),
1638b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                               "accessor_data_property");
1639b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    } else {
1640b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      ASSERT(IsAccessorAccessorConflict(old_type, type));
1641b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      // Both accessors of the same type.
1642b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org      parser()->ReportMessageAt(scanner()->location(),
1643b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org                               "accessor_get_set");
1644b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    }
1645b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org    *ok = false;
1646b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org  }
1647b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org}
1648b4968bea48ba224f54110f626278e2c04649dd5bmstarzinger@chromium.org
1649a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} }  // v8::internal
1650