1b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_PARSER_H_
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_PARSER_H_
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org#include "allocation.h"
32eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org#include "ast.h"
331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "preparse-data-format.h"
34beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org#include "preparse-data.h"
3555ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org#include "scopes.h"
36394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com#include "preparser.h"
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgclass CompilationInfo;
42eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgclass FuncNameInferrer;
43eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgclass ParserLog;
44eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgclass PositionStack;
45eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgclass Target;
46eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
47eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.orgtemplate <typename T> class ZoneListWrapper;
48eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ParserMessage : public Malloced {
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ParserMessage(Scanner::Location loc, const char* message,
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                Vector<const char*> args)
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : loc_(loc),
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        message_(message),
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        args_(args) { }
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ~ParserMessage();
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Scanner::Location location() { return loc_; }
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* message() { return message_; }
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Vector<const char*> args() { return args_; }
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Scanner::Location loc_;
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* message_;
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Vector<const char*> args_;
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass FunctionEntry BASE_EMBEDDED {
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
70c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  enum {
71c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    kStartPositionIndex,
72c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    kEndPositionIndex,
73c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    kLiteralCountIndex,
74c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    kPropertyCountIndex,
751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    kLanguageModeIndex,
76c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    kSize
77c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  };
78c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  explicit FunctionEntry(Vector<unsigned> backing)
801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    : backing_(backing) { }
811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  FunctionEntry() : backing_() { }
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int start_pos() { return backing_[kStartPositionIndex]; }
85c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int end_pos() { return backing_[kEndPositionIndex]; }
86c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int literal_count() { return backing_[kLiteralCountIndex]; }
87c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int property_count() { return backing_[kPropertyCountIndex]; }
881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  LanguageMode language_mode() {
891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ASSERT(backing_[kLanguageModeIndex] == CLASSIC_MODE ||
901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org           backing_[kLanguageModeIndex] == STRICT_MODE ||
911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org           backing_[kLanguageModeIndex] == EXTENDED_MODE);
921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    return static_cast<LanguageMode>(backing_[kLanguageModeIndex]);
936e28b5694dd5a29d2f37d56d5a005e7cfdd952d1erik.corry@gmail.com  }
94d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
95c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  bool is_valid() { return !backing_.is_empty(); }
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Vector<unsigned> backing_;
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass ScriptDataImpl : public ScriptData {
10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit ScriptDataImpl(Vector<unsigned> store)
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : store_(store),
106c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        owns_store_(true) { }
1075b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
1085b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  // Create an empty ScriptDataImpl that is guaranteed to not satisfy
1095b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  // a SanityCheck.
11004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  ScriptDataImpl() : owns_store_(false) { }
1115b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~ScriptDataImpl();
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual int Length();
1149155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  virtual const char* Data();
1150c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  virtual bool HasError();
1165b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
117d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  void Initialize();
118d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  void ReadNextSymbolPosition();
119d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com
120d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  FunctionEntry GetFunctionEntry(int start);
121d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  int GetSymbolIdentifier();
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool SanityCheck();
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Scanner::Location MessageLocation();
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* BuildMessage();
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Vector<const char*> BuildArgs();
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1285b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  int symbol_count() {
129beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org    return (store_.length() > PreparseDataConstants::kHeaderSize)
130beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        ? store_[PreparseDataConstants::kSymbolCountOffset]
131beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org        : 0;
1325b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  }
1335b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  // The following functions should only be called if SanityCheck has
1345b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  // returned true.
135beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  bool has_error() { return store_[PreparseDataConstants::kHasErrorOffset]; }
136beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  unsigned magic() { return store_[PreparseDataConstants::kMagicOffset]; }
137beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org  unsigned version() { return store_[PreparseDataConstants::kVersionOffset]; }
138d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
140d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  Vector<unsigned> store_;
141d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  unsigned char* symbol_data_;
142d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  unsigned char* symbol_data_end_;
1435b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  int function_index_;
1445b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  bool owns_store_;
145d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  unsigned Read(int position);
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  unsigned* ReadAddress(int position);
148d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  // Reads a number from the current symbols
149d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com  int ReadNumber(byte** source);
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1515b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  ScriptDataImpl(const char* backing_store, int length)
1525b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org      : store_(reinterpret_cast<unsigned*>(const_cast<char*>(backing_store)),
153f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org               length / static_cast<int>(sizeof(unsigned))),
1545b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org        owns_store_(false) {
155f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    ASSERT_EQ(0, static_cast<int>(
156f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org        reinterpret_cast<intptr_t>(backing_store) % sizeof(unsigned)));
1575b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  }
1585b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
15965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  // Read strings written by ParserRecorder::WriteString.
16065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  static const char* ReadString(unsigned* start, int* chars);
1615b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
1625b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  friend class ScriptData;
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass PreParserApi {
167eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org public:
168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Pre-parse a character stream and return full preparse data.
169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  //
170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // This interface is here instead of in preparser.h because it instantiates a
171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // preparser recorder object that is suited to the parser's purposes.  Also,
172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // the preparser doesn't know about ScriptDataImpl.
173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static ScriptDataImpl* PreParse(Utf16CharacterStream* source);
174e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org};
175e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
177fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org// ----------------------------------------------------------------------------
178fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org// REGEXP PARSING
179e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
1802efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// A BufferedZoneList is an automatically growing list, just like (and backed
181e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// by) a ZoneList, that is optimized for the case of adding and removing
182e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// a single element. The last element added is stored outside the backing list,
183e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// and if no more than one element is ever added, the ZoneList isn't even
184e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// allocated.
185e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// Elements must not be NULL pointers.
186e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgtemplate <typename T, int initial_size>
187e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgclass BufferedZoneList {
188e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org public:
189e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  BufferedZoneList() : list_(NULL), last_(NULL) {}
190e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
191e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Adds element at end of list. This element is buffered and can
192e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // be read using last() or removed using RemoveLast until a new Add or until
193e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // RemoveLast or GetList has been called.
1947028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void Add(T* value, Zone* zone) {
195e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    if (last_ != NULL) {
196e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      if (list_ == NULL) {
1977028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        list_ = new(zone) ZoneList<T*>(initial_size, zone);
198e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      }
1997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      list_->Add(last_, zone);
200e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    }
201e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    last_ = value;
202e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
203e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
204e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  T* last() {
205e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    ASSERT(last_ != NULL);
206e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    return last_;
207e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
208e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
209e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  T* RemoveLast() {
210e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    ASSERT(last_ != NULL);
211e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    T* result = last_;
212e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    if ((list_ != NULL) && (list_->length() > 0))
213e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      last_ = list_->RemoveLast();
214e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    else
215e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      last_ = NULL;
216e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    return result;
217e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
218e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
219e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  T* Get(int i) {
220e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    ASSERT((0 <= i) && (i < length()));
221e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    if (list_ == NULL) {
222e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      ASSERT_EQ(0, i);
223e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      return last_;
224e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    } else {
225e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      if (i == list_->length()) {
226e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org        ASSERT(last_ != NULL);
227e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org        return last_;
228e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      } else {
229e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org        return list_->at(i);
230e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      }
231e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    }
232e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
233e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
234e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void Clear() {
235e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    list_ = NULL;
236e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    last_ = NULL;
237e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
238e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
239e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  int length() {
240e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    int length = (list_ == NULL) ? 0 : list_->length();
241e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    return length + ((last_ == NULL) ? 0 : 1);
242e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
243e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
2447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ZoneList<T*>* GetList(Zone* zone) {
245e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    if (list_ == NULL) {
2467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      list_ = new(zone) ZoneList<T*>(initial_size, zone);
247e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    }
248e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    if (last_ != NULL) {
2497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      list_->Add(last_, zone);
250e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org      last_ = NULL;
251e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    }
252e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    return list_;
253e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
254e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
255e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org private:
256e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  ZoneList<T*>* list_;
257e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  T* last_;
258e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org};
259e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
260e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
261e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// Accumulates RegExp atoms and assertions into lists of terms and alternatives.
262e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgclass RegExpBuilder: public ZoneObject {
263e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org public:
264400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  explicit RegExpBuilder(Zone* zone);
265e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void AddCharacter(uc16 character);
266e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // "Adds" an empty expression. Does nothing except consume a
267e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // following quantifier
268e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void AddEmpty();
269e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void AddAtom(RegExpTree* tree);
270e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void AddAssertion(RegExpTree* tree);
271e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void NewAlternative();  // '|'
272dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  void AddQuantifierToAtom(
273dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org      int min, int max, RegExpQuantifier::QuantifierType type);
274e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpTree* ToRegExp();
275e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
276e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org private:
277e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void FlushCharacters();
278e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void FlushText();
279e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void FlushTerms();
2807028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Zone* zone() const { return zone_; }
281c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
282c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Zone* zone_;
283e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool pending_empty_;
284e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  ZoneList<uc16>* characters_;
285e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  BufferedZoneList<RegExpTree, 2> terms_;
286e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  BufferedZoneList<RegExpTree, 2> text_;
287e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  BufferedZoneList<RegExpTree, 2> alternatives_;
288e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org#ifdef DEBUG
289e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_;
290e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org#define LAST(x) last_added_ = x;
291e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org#else
292e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org#define LAST(x)
293e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org#endif
294e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org};
295e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
296e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
297e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass RegExpParser BASE_EMBEDDED {
298e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org public:
299e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpParser(FlatStringReader* in,
300e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org               Handle<String>* error,
3015a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               bool multiline_mode,
3025a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               Zone* zone);
303eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
304eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  static bool ParseRegExp(FlatStringReader* input,
305eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                          bool multiline,
3065a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org                          RegExpCompileData* result,
3075a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org                          Zone* zone);
308eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
309e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpTree* ParsePattern();
310e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpTree* ParseDisjunction();
311e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpTree* ParseGroup();
312e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpTree* ParseCharacterClass();
313e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
314e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Parses a {...,...} quantifier and stores the range in the given
315e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // out parameters.
316e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool ParseIntervalQuantifier(int* min_out, int* max_out);
317e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
318e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Parses and returns a single escaped character.  The character
319e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // must not be 'b' or 'B' since they are usually handle specially.
320e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  uc32 ParseClassCharacterEscape();
321e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
322e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Checks whether the following is a length-digit hexadecimal number,
323e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // and sets the value if it is.
324e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool ParseHexEscape(int length, uc32* value);
325e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
326e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  uc32 ParseOctalLiteral();
327e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
328e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Tries to parse the input as a back reference.  If successful it
329e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // stores the result in the output parameter and returns true.  If
330e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // it fails it will push back the characters read so the same characters
331e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // can be reparsed.
332e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool ParseBackReferenceIndex(int* index_out);
333e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
334e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  CharacterRange ParseClassAtom(uc16* char_class);
335e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  RegExpTree* ReportError(Vector<const char> message);
336e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void Advance();
337e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void Advance(int dist);
338e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void Reset(int pos);
339e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
340e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Reports whether the pattern might be used as a literal search string.
341e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  // Only use if the result of the parse is a single atom node.
342e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool simple();
343e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool contains_anchor() { return contains_anchor_; }
344e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void set_contains_anchor() { contains_anchor_ = true; }
345e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  int captures_started() { return captures_ == NULL ? 0 : captures_->length(); }
346e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  int position() { return next_pos_ - 1; }
347e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool failed() { return failed_; }
348e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
349e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  static const int kMaxCaptures = 1 << 16;
350e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  static const uc32 kEndMarker = (1 << 21);
351e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
352e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org private:
353e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  enum SubexpressionType {
354e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    INITIAL,
355e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    CAPTURE,  // All positive values represent captures.
356e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    POSITIVE_LOOKAHEAD,
357e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    NEGATIVE_LOOKAHEAD,
358e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    GROUPING
359e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  };
360e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
361e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  class RegExpParserState : public ZoneObject {
362e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org   public:
363e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    RegExpParserState(RegExpParserState* previous_state,
364e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org                      SubexpressionType group_type,
365400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org                      int disjunction_capture_index,
366400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org                      Zone* zone)
367e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org        : previous_state_(previous_state),
3687028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          builder_(new(zone) RegExpBuilder(zone)),
369e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org          group_type_(group_type),
370e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org          disjunction_capture_index_(disjunction_capture_index) {}
371e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Parser state of containing expression, if any.
372e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    RegExpParserState* previous_state() { return previous_state_; }
373e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    bool IsSubexpression() { return previous_state_ != NULL; }
374e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // RegExpBuilder building this regexp's AST.
375e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    RegExpBuilder* builder() { return builder_; }
376e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Type of regexp being parsed (parenthesized group or entire regexp).
377e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    SubexpressionType group_type() { return group_type_; }
378e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Index in captures array of first capture in this sub-expression, if any.
379e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Also the capture index of this sub-expression itself, if group_type
380e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // is CAPTURE.
381e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    int capture_index() { return disjunction_capture_index_; }
382e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
383e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org   private:
384e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Linked list implementation of stack of states.
385e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    RegExpParserState* previous_state_;
386e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Builder for the stored disjunction.
387e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    RegExpBuilder* builder_;
388e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Stored disjunction type (capture, look-ahead or grouping), if any.
389e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    SubexpressionType group_type_;
390e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // Stored disjunction's capture index (if any).
391e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    int disjunction_capture_index_;
392e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  };
393e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate() { return isolate_; }
3955a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  Zone* zone() const { return zone_; }
396ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
397e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  uc32 current() { return current_; }
398e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool has_more() { return has_more_; }
399e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool has_next() { return next_pos_ < in()->length(); }
400e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  uc32 Next();
401e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  FlatStringReader* in() { return in_; }
402e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  void ScanForCaptures();
403fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
404ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate_;
4055a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  Zone* zone_;
406fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  Handle<String>* error_;
407fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  ZoneList<RegExpCapture*>* captures_;
408fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  FlatStringReader* in_;
409e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  uc32 current_;
410fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  int next_pos_;
411fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  // The capture count is only valid after we have scanned for captures.
412fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  int capture_count_;
413e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool has_more_;
414e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool multiline_;
415e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool simple_;
416e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool contains_anchor_;
417e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool is_scanned_for_captures_;
418e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  bool failed_;
419e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org};
420e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
421fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org// ----------------------------------------------------------------------------
422fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org// JAVASCRIPT PARSING
423e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
4241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org// Forward declaration.
4251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgclass SingletonLogger;
4261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass Parser BASE_EMBEDDED {
428e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org public:
429e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit Parser(CompilationInfo* info);
430e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ~Parser() {
431b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    delete reusable_preparser_;
432b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    reusable_preparser_ = NULL;
4331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
434e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
435e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool allow_natives_syntax() const { return allow_natives_syntax_; }
436e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool allow_lazy() const { return allow_lazy_; }
437e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool allow_modules() { return scanner().HarmonyModules(); }
438e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool allow_harmony_scoping() { return scanner().HarmonyScoping(); }
439e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool allow_generators() const { return allow_generators_; }
4401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  bool allow_for_of() const { return allow_for_of_; }
441ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  bool allow_harmony_numeric_literals() {
442ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    return scanner().HarmonyNumericLiterals();
443ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
444e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
445e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void set_allow_natives_syntax(bool allow) { allow_natives_syntax_ = allow; }
446e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void set_allow_lazy(bool allow) { allow_lazy_ = allow; }
447e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void set_allow_modules(bool allow) { scanner().SetHarmonyModules(allow); }
448e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void set_allow_harmony_scoping(bool allow) {
449e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    scanner().SetHarmonyScoping(allow);
450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void set_allow_generators(bool allow) { allow_generators_ = allow; }
4521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void set_allow_for_of(bool allow) { allow_for_of_ = allow; }
453ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  void set_allow_harmony_numeric_literals(bool allow) {
454ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    scanner().SetHarmonyNumericLiterals(allow);
455ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
456e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
457e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Parses the source code represented by the compilation info and sets its
458e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // function literal.  Returns false (and deallocates any allocated AST
459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // nodes) if parsing failed.
460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  static bool Parse(CompilationInfo* info) { return Parser(info).Parse(); }
461e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool Parse();
462e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
463eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Returns NULL if parsing failed.
4645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  FunctionLiteral* ParseProgram();
465eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
466fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  void ReportMessageAt(Scanner::Location loc,
467fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org                       const char* message,
468fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org                       Vector<const char*> args);
469c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void ReportMessageAt(Scanner::Location loc,
470c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                       const char* message,
471c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                       Vector<Handle<String> > args);
472eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
4734f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org private:
474c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  static const int kMaxNumFunctionLocals = 131071;  // 2^17-1
475c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
476eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  enum Mode {
477eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org    PARSE_LAZILY,
478eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org    PARSE_EAGERLY
479eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  };
480a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
481b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  enum VariableDeclarationContext {
482f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org    kModuleElement,
483f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org    kBlockElement,
484b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    kStatement,
485b645116853c677aca8a316381b87441ba6004f67danno@chromium.org    kForStatement
486b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  };
487b645116853c677aca8a316381b87441ba6004f67danno@chromium.org
488394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // If a list of variable declarations includes any initializers.
489394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  enum VariableDeclarationProperties {
490394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    kHasInitializers,
491394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    kHasNoInitializers
492394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  };
493394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
494c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  class BlockState;
495b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
496b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  class FunctionState BASE_EMBEDDED {
497b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org   public:
498b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    FunctionState(Parser* parser,
499b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                  Scope* scope,
500b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org                  Isolate* isolate);
501b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    ~FunctionState();
502b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
503b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int NextMaterializedLiteralIndex() {
504b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org      return next_materialized_literal_index_++;
505b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    }
506b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int materialized_literal_count() {
507b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org      return next_materialized_literal_index_ - JSFunction::kLiteralsPrefixSize;
508b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    }
509b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
510b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int NextHandlerIndex() { return next_handler_index_++; }
511b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int handler_count() { return next_handler_index_; }
512b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
513b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    void AddProperty() { expected_property_count_++; }
514b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int expected_property_count() { return expected_property_count_; }
515b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
516e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    void set_generator_object_variable(Variable *variable) {
517e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      ASSERT(variable != NULL);
518e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      ASSERT(!is_generator());
519e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      generator_object_variable_ = variable;
520e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    }
521e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    Variable* generator_object_variable() const {
522e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return generator_object_variable_;
523e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    }
524e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    bool is_generator() const {
525e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return generator_object_variable_ != NULL;
526e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    }
527f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
528b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    AstNodeFactory<AstConstructionVisitor>* factory() { return &factory_; }
529b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
530b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org   private:
531b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    // Used to assign an index to each literal that needs materialization in
532b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    // the function.  Includes regexp literals, and boilerplate for object and
533b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    // array literals.
534b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int next_materialized_literal_index_;
535b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
536b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    // Used to assign a per-function index to try and catch handlers.
537b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int next_handler_index_;
538b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
539b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    // Properties count estimation.
540b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int expected_property_count_;
541b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
542e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    // For generators, the variable that holds the generator object.  This
543e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    // variable is used by yield expressions and return statements.  NULL
544e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    // indicates that this function is not a generator.
545e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    Variable* generator_object_variable_;
546e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
547b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    Parser* parser_;
548b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    FunctionState* outer_function_state_;
549b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    Scope* outer_scope_;
550b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    int saved_ast_node_id_;
551b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    AstNodeFactory<AstConstructionVisitor> factory_;
552b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  };
553b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
554471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  class ParsingModeScope BASE_EMBEDDED {
555471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org   public:
556471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ParsingModeScope(Parser* parser, Mode mode)
557471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org        : parser_(parser),
558471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          old_mode_(parser->mode()) {
559471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      parser_->mode_ = mode;
560471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
561471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ~ParsingModeScope() {
562471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      parser_->mode_ = old_mode_;
563471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
564b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
565471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org   private:
566471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Parser* parser_;
567471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Mode old_mode_;
568471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  };
569c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
570e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  FunctionLiteral* ParseLazy();
5711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  FunctionLiteral* ParseLazy(Utf16CharacterStream* source);
572c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
573ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate() { return isolate_; }
5747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Zone* zone() const { return zone_; }
5755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  CompilationInfo* info() const { return info_; }
576ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
5775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // Called by ParseProgram after setting up the scanner.
57827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  FunctionLiteral* DoParseProgram(CompilationInfo* info,
5791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                  Handle<String> source);
5805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
581eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Report syntax error
582eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  void ReportUnexpectedToken(Token::Value token);
583eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  void ReportInvalidPreparseData(Handle<String> name, bool* ok);
584fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  void ReportMessage(const char* message, Vector<const char*> args);
585bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  void ReportMessage(const char* message, Vector<Handle<String> > args);
586eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
587e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void set_pre_parse_data(ScriptDataImpl *data) {
588e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    pre_parse_data_ = data;
589e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    symbol_cache_.Initialize(data ? data->symbol_count() : 0, zone());
590e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
591e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
592394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  bool inside_with() const { return top_scope_->inside_with(); }
593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Scanner& scanner()  { return scanner_; }
594eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Mode mode() const { return mode_; }
595e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; }
5961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  bool is_extended_mode() {
5971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    ASSERT(top_scope_ != NULL);
5981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    return top_scope_->is_extended_mode();
5991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
600812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Scope* DeclarationScope(VariableMode mode) {
601355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    return IsLexicalVariableMode(mode)
602812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org        ? top_scope_ : top_scope_->DeclarationScope();
603812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
604eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
605ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Check if the given string is 'eval' or 'arguments'.
606ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool IsEvalOrArguments(Handle<String> string);
607ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
608eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // All ParseXXX functions take as the last argument an *ok parameter
609eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // which is set to false if parsing failed; it is unchanged otherwise.
610eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // By making the 'exception handling' explicit, we are forced to check
611eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // for failure at the call sites.
61233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void* ParseSourceElements(ZoneList<Statement*>* processor, int end_token,
61333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                            bool is_eval, bool is_global, bool* ok);
614f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Statement* ParseModuleElement(ZoneStringList* labels, bool* ok);
61581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  Statement* ParseModuleDeclaration(ZoneStringList* names, bool* ok);
616f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Module* ParseModule(bool* ok);
617f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Module* ParseModuleLiteral(bool* ok);
618f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Module* ParseModulePath(bool* ok);
619f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Module* ParseModuleVariable(bool* ok);
620f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Module* ParseModuleUrl(bool* ok);
621812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Module* ParseModuleSpecifier(bool* ok);
622f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Block* ParseImportDeclaration(bool* ok);
623812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Statement* ParseExportDeclaration(bool* ok);
624f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Statement* ParseBlockElement(ZoneStringList* labels, bool* ok);
625eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseStatement(ZoneStringList* labels, bool* ok);
626812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Statement* ParseFunctionDeclaration(ZoneStringList* names, bool* ok);
627eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseNativeDeclaration(bool* ok);
628eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Block* ParseBlock(ZoneStringList* labels, bool* ok);
629b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  Block* ParseVariableStatement(VariableDeclarationContext var_context,
630812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                ZoneStringList* names,
631b645116853c677aca8a316381b87441ba6004f67danno@chromium.org                                bool* ok);
632b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  Block* ParseVariableDeclarations(VariableDeclarationContext var_context,
633394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                                   VariableDeclarationProperties* decl_props,
634812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                   ZoneStringList* names,
6354f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                                   Handle<String>* out,
6364f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                                   bool* ok);
637eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseExpressionOrLabelledStatement(ZoneStringList* labels,
638eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                                                bool* ok);
639eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  IfStatement* ParseIfStatement(ZoneStringList* labels, bool* ok);
640eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseContinueStatement(bool* ok);
641eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseBreakStatement(ZoneStringList* labels, bool* ok);
642eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseReturnStatement(bool* ok);
643eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseWithStatement(ZoneStringList* labels, bool* ok);
644eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  CaseClause* ParseCaseClause(bool* default_seen_ptr, bool* ok);
645eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  SwitchStatement* ParseSwitchStatement(ZoneStringList* labels, bool* ok);
646eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  DoWhileStatement* ParseDoWhileStatement(ZoneStringList* labels, bool* ok);
647eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  WhileStatement* ParseWhileStatement(ZoneStringList* labels, bool* ok);
648eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseForStatement(ZoneStringList* labels, bool* ok);
649eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Statement* ParseThrowStatement(bool* ok);
650eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* MakeCatchContext(Handle<String> id, VariableProxy* value);
651eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  TryStatement* ParseTryStatement(bool* ok);
652eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  DebuggerStatement* ParseDebuggerStatement(bool* ok);
653eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
654394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // Support for hamony block scoped bindings.
655394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  Block* ParseScopedBlock(ZoneStringList* labels, bool* ok);
656394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
657eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseExpression(bool accept_IN, bool* ok);
658eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseAssignmentExpression(bool accept_IN, bool* ok);
659f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Expression* ParseYieldExpression(bool* ok);
660eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseConditionalExpression(bool accept_IN, bool* ok);
661eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseBinaryExpression(int prec, bool accept_IN, bool* ok);
662eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseUnaryExpression(bool* ok);
663eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParsePostfixExpression(bool* ok);
664eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseLeftHandSideExpression(bool* ok);
665eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseNewExpression(bool* ok);
666eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseMemberExpression(bool* ok);
667eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseNewPrefix(PositionStack* stack, bool* ok);
668eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseMemberWithNewPrefixesExpression(PositionStack* stack,
669eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                                                   bool* ok);
670eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParsePrimaryExpression(bool* ok);
671eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseArrayLiteral(bool* ok);
672eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseObjectLiteral(bool* ok);
673eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  ObjectLiteral::Property* ParseObjectLiteralGetSet(bool is_getter, bool* ok);
674eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseRegExpLiteral(bool seen_equal, bool* ok);
675eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
676eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Populate the constant properties fixed array for a materialized object
677eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // literal.
678eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  void BuildObjectLiteralConstantProperties(
679eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org      ZoneList<ObjectLiteral::Property*>* properties,
680eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org      Handle<FixedArray> constants,
681eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org      bool* is_simple,
682eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org      bool* fast_elements,
68357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      int* depth,
68457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      bool* may_store_doubles);
685eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
686eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Decide if a property should be in the object boilerplate.
687eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  bool IsBoilerplateProperty(ObjectLiteral::Property* property);
688eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // If the expression is a literal, return the literal value;
689eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // if the expression is a materialized literal and is simple return a
690eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // compile time value as encoded by CompileTimeValue::GetValue().
691eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Otherwise, return undefined literal as the placeholder
692eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // in the object literal boilerplate.
693eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Handle<Object> GetBoilerplateValue(Expression* expression);
694eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
6951fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // Initialize the components of a for-in / for-of statement.
6961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void InitializeForEachStatement(ForEachStatement* stmt,
6971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                  Expression* each,
6981fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                  Expression* subject,
6991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                  Statement* body);
7001fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
701eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  ZoneList<Expression*>* ParseArguments(bool* ok);
702eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  FunctionLiteral* ParseFunctionLiteral(Handle<String> var_name,
70383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org                                        bool name_is_reserved,
704f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org                                        bool is_generator,
705eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                                        int function_token_position,
706dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org                                        FunctionLiteral::FunctionType type,
707eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                                        bool* ok);
708eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
709eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
710eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Magical syntax support.
711eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* ParseV8Intrinsic(bool* ok);
712eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  INLINE(Token::Value peek()) {
714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (stack_overflow_) return Token::ILLEGAL;
7155f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    return scanner().peek();
716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  INLINE(Token::Value Next()) {
719a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // BUG 1215673: Find a thread safe way to set a stack limit in
720a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // pre-parse mode. Otherwise, we cannot safely pre-parse from other
721a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // threads.
722a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (stack_overflow_) {
723a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return Token::ILLEGAL;
724a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
725ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (StackLimitCheck(isolate()).HasOverflowed()) {
726a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      // Any further calls to Next or peek will return the illegal token.
7275f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      // The current call must return the next token, which might already
7285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      // have been peek'ed.
729a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      stack_overflow_ = true;
730a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
7315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    return scanner().Next();
732a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
733a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
734f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  bool is_generator() const { return current_function_state_->is_generator(); }
735f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
73641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  bool CheckInOrOf(bool accept_OF, ForEachStatement::VisitMode* visit_mode);
7371fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
73883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  bool peek_any_identifier();
73983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
740eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  INLINE(void Consume(Token::Value token));
741eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  void Expect(Token::Value token, bool* ok);
742eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  bool Check(Token::Value token);
743eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  void ExpectSemicolon(bool* ok);
7441fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  bool CheckContextualKeyword(Vector<const char> keyword);
7451fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  void ExpectContextualKeyword(Vector<const char> keyword, bool* ok);
746eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
7479e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  Handle<String> LiteralString(PretenureFlag tenured) {
7489e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    if (scanner().is_literal_ascii()) {
749ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return isolate_->factory()->NewStringFromAscii(
750ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org          scanner().literal_ascii_string(), tenured);
7519e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    } else {
752ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return isolate_->factory()->NewStringFromTwoByte(
753154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org            scanner().literal_utf16_string(), tenured);
7549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
7559e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  }
7569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
7579e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  Handle<String> NextLiteralString(PretenureFlag tenured) {
7589e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    if (scanner().is_next_literal_ascii()) {
759ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return isolate_->factory()->NewStringFromAscii(
760ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org          scanner().next_literal_ascii_string(), tenured);
7619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    } else {
762ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return isolate_->factory()->NewStringFromTwoByte(
763154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org          scanner().next_literal_utf16_string(), tenured);
7649e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    }
7659e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  }
7669e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
767bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  Handle<String> GetSymbol();
768eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
769eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Get odd-ball literals.
770eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Literal* GetLiteralUndefined();
771eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Literal* GetLiteralTheHole();
772eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
773eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Handle<String> ParseIdentifier(bool* ok);
77404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  Handle<String> ParseIdentifierOrStrictReservedWord(
77504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org      bool* is_strict_reserved, bool* ok);
776eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Handle<String> ParseIdentifierName(bool* ok);
77704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  Handle<String> ParseIdentifierNameOrGetOrSet(bool* is_get,
77804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                                               bool* is_set,
77904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org                                               bool* ok);
780eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
78164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  // Determine if the expression is a variable proxy and mark it as being used
78264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  // in an assignment or with a increment/decrement operator. This is currently
78364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  // used on for the statically checking assignments to harmony const bindings.
78464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  void MarkAsLValue(Expression* expression);
78564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
786378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  // Strict mode validation of LValue expressions
787378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  void CheckStrictModeLValue(Expression* expression,
788378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org                             const char* error,
789378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org                             bool* ok);
790378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
7910ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Strict mode octal literal validation.
7920ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void CheckOctalLiteral(int beg_pos, int end_pos, bool* ok);
7930ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
7941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // For harmony block scoping mode: Check if the scope has conflicting var/let
7951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // declarations from different scopes. It covers for example
7961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  //
7971805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // function f() { { { var x; } let x; } }
7981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // function g() { { var x; let x; } }
7991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  //
8001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // The var declarations are hoisted to the function scope, but originate from
8011805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // a scope where the name has also been let bound or the var declaration is
8021805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // hoisted over such a scope.
8031805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  void CheckConflictingVarDeclarations(Scope* scope, bool* ok);
8041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
805eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Parser support
806bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  VariableProxy* NewUnresolved(Handle<String> name,
807bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com                               VariableMode mode,
80828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org                               Interface* interface);
809812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  void Declare(Declaration* declaration, bool resolve, bool* ok);
810eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
811eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  bool TargetStackContainsLabel(Handle<String> label);
812eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  BreakableStatement* LookupBreakTarget(Handle<String> label, bool* ok);
813eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  IterationStatement* LookupContinueTarget(Handle<String> label, bool* ok);
814eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
81544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  void RegisterTargetUse(Label* target, Target* stop);
816eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
817fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  // Factory methods.
818fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
819394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  Scope* NewScope(Scope* parent, ScopeType type);
820fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
8219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  Handle<String> LookupSymbol(int symbol_id);
822fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
8239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  Handle<String> LookupCachedSymbol(int symbol_id);
824fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
825eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Generate AST node that throw a ReferenceError with the given type.
826eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* NewThrowReferenceError(Handle<String> type);
827eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
828eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Generate AST node that throw a SyntaxError with the given
829eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // type. The first argument may be null (in the handle sense) in
830eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // which case no arguments are passed to the constructor.
831eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* NewThrowSyntaxError(Handle<String> type, Handle<Object> first);
832eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
833eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Generate AST node that throw a TypeError with the given
834eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // type. Both arguments must be non-null (in the handle sense).
835eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* NewThrowTypeError(Handle<String> type,
836eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                                Handle<Object> first,
837eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                                Handle<Object> second);
838eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
839eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  // Generic AST generator for throwing errors from compiled code.
840eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org  Expression* NewThrowError(Handle<String> constructor,
841eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                            Handle<String> type,
842eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org                            Vector< Handle<Object> > arguments);
843fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
8441b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  preparser::PreParser::PreParseResult LazyParseFunctionLiteral(
8451b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org       SingletonLogger* logger);
8461b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
847b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  AstNodeFactory<AstConstructionVisitor>* factory() {
848b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org    return current_function_state_->factory();
849b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
850b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
851ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate_;
852fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  ZoneList<Handle<String> > symbol_cache_;
853fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org
854fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  Handle<Script> script_;
855c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Scanner scanner_;
8561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  preparser::PreParser* reusable_preparser_;
857fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  Scope* top_scope_;
858c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  FunctionState* current_function_state_;
859fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  Target* target_stack_;  // for break, continue statements
860fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  v8::Extension* extension_;
861e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ScriptDataImpl* pre_parse_data_;
862fa943b736b1d996084393011529d568165bb5d83lrn@chromium.org  FuncNameInferrer* fni_;
86304e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org
86404e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  Mode mode_;
86504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org  bool allow_natives_syntax_;
8661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  bool allow_lazy_;
867e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool allow_generators_;
8681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  bool allow_for_of_;
869a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool stack_overflow_;
870c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // If true, the next (and immediately following) function literal is
871c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // preceded by a parenthesis.
872c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Heuristically that means that the function will be called immediately,
873c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // so never lazily compile it.
874c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool parenthesized_function_;
875ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
876400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  Zone* zone_;
8775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  CompilationInfo* info_;
878c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  friend class BlockState;
879c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  friend class FunctionState;
880eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org};
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
882bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
883bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// Support for handling complex values (array and object literals) that
884bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// can be fully handled at compile time.
885bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgclass CompileTimeValue: public AllStatic {
886bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org public:
887dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  enum LiteralType {
888f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    OBJECT_LITERAL_FAST_ELEMENTS,
889f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org    OBJECT_LITERAL_SLOW_ELEMENTS,
890bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    ARRAY_LITERAL
891bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  };
892bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
893bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  static bool IsCompileTimeValue(Expression* expression);
894bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
895bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get the value as a compile time value.
896bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  static Handle<FixedArray> GetValue(Expression* expression);
897bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
898bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get the type of a compile time value returned by GetValue().
899dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  static LiteralType GetLiteralType(Handle<FixedArray> value);
900bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
901bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get the elements array of a compile time value returned by GetValue().
902bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  static Handle<FixedArray> GetElements(Handle<FixedArray> value);
903bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
904bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org private:
905dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  static const int kLiteralTypeSlot = 0;
906bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  static const int kElementsSlot = 1;
907bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
908bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  DISALLOW_IMPLICIT_CONSTRUCTORS(CompileTimeValue);
909bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
910bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_PARSER_H_
914