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