Home | History | Annotate | Download | only in src
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #include "v8.h"
     29 
     30 #include "api.h"
     31 #include "ast.h"
     32 #include "bootstrapper.h"
     33 #include "char-predicates-inl.h"
     34 #include "codegen.h"
     35 #include "compiler.h"
     36 #include "func-name-inferrer.h"
     37 #include "messages.h"
     38 #include "parser.h"
     39 #include "platform.h"
     40 #include "preparser.h"
     41 #include "runtime.h"
     42 #include "scanner-character-streams.h"
     43 #include "scopeinfo.h"
     44 #include "string-stream.h"
     45 
     46 namespace v8 {
     47 namespace internal {
     48 
     49 // PositionStack is used for on-stack allocation of token positions for
     50 // new expressions. Please look at ParseNewExpression.
     51 
     52 class PositionStack  {
     53  public:
     54   explicit PositionStack(bool* ok) : top_(NULL), ok_(ok) {}
     55   ~PositionStack() {
     56     ASSERT(!*ok_ || is_empty());
     57     USE(ok_);
     58   }
     59 
     60   class Element  {
     61    public:
     62     Element(PositionStack* stack, int value) {
     63       previous_ = stack->top();
     64       value_ = value;
     65       stack->set_top(this);
     66     }
     67 
     68    private:
     69     Element* previous() { return previous_; }
     70     int value() { return value_; }
     71     friend class PositionStack;
     72     Element* previous_;
     73     int value_;
     74   };
     75 
     76   bool is_empty() { return top_ == NULL; }
     77   int pop() {
     78     ASSERT(!is_empty());
     79     int result = top_->value();
     80     top_ = top_->previous();
     81     return result;
     82   }
     83 
     84  private:
     85   Element* top() { return top_; }
     86   void set_top(Element* value) { top_ = value; }
     87   Element* top_;
     88   bool* ok_;
     89 };
     90 
     91 
     92 RegExpBuilder::RegExpBuilder(Zone* zone)
     93     : zone_(zone),
     94       pending_empty_(false),
     95       characters_(NULL),
     96       terms_(),
     97       alternatives_()
     98 #ifdef DEBUG
     99     , last_added_(ADD_NONE)
    100 #endif
    101   {}
    102 
    103 
    104 void RegExpBuilder::FlushCharacters() {
    105   pending_empty_ = false;
    106   if (characters_ != NULL) {
    107     RegExpTree* atom = new(zone()) RegExpAtom(characters_->ToConstVector());
    108     characters_ = NULL;
    109     text_.Add(atom, zone());
    110     LAST(ADD_ATOM);
    111   }
    112 }
    113 
    114 
    115 void RegExpBuilder::FlushText() {
    116   FlushCharacters();
    117   int num_text = text_.length();
    118   if (num_text == 0) {
    119     return;
    120   } else if (num_text == 1) {
    121     terms_.Add(text_.last(), zone());
    122   } else {
    123     RegExpText* text = new(zone()) RegExpText(zone());
    124     for (int i = 0; i < num_text; i++)
    125       text_.Get(i)->AppendToText(text, zone());
    126     terms_.Add(text, zone());
    127   }
    128   text_.Clear();
    129 }
    130 
    131 
    132 void RegExpBuilder::AddCharacter(uc16 c) {
    133   pending_empty_ = false;
    134   if (characters_ == NULL) {
    135     characters_ = new(zone()) ZoneList<uc16>(4, zone());
    136   }
    137   characters_->Add(c, zone());
    138   LAST(ADD_CHAR);
    139 }
    140 
    141 
    142 void RegExpBuilder::AddEmpty() {
    143   pending_empty_ = true;
    144 }
    145 
    146 
    147 void RegExpBuilder::AddAtom(RegExpTree* term) {
    148   if (term->IsEmpty()) {
    149     AddEmpty();
    150     return;
    151   }
    152   if (term->IsTextElement()) {
    153     FlushCharacters();
    154     text_.Add(term, zone());
    155   } else {
    156     FlushText();
    157     terms_.Add(term, zone());
    158   }
    159   LAST(ADD_ATOM);
    160 }
    161 
    162 
    163 void RegExpBuilder::AddAssertion(RegExpTree* assert) {
    164   FlushText();
    165   terms_.Add(assert, zone());
    166   LAST(ADD_ASSERT);
    167 }
    168 
    169 
    170 void RegExpBuilder::NewAlternative() {
    171   FlushTerms();
    172 }
    173 
    174 
    175 void RegExpBuilder::FlushTerms() {
    176   FlushText();
    177   int num_terms = terms_.length();
    178   RegExpTree* alternative;
    179   if (num_terms == 0) {
    180     alternative = RegExpEmpty::GetInstance();
    181   } else if (num_terms == 1) {
    182     alternative = terms_.last();
    183   } else {
    184     alternative = new(zone()) RegExpAlternative(terms_.GetList(zone()));
    185   }
    186   alternatives_.Add(alternative, zone());
    187   terms_.Clear();
    188   LAST(ADD_NONE);
    189 }
    190 
    191 
    192 RegExpTree* RegExpBuilder::ToRegExp() {
    193   FlushTerms();
    194   int num_alternatives = alternatives_.length();
    195   if (num_alternatives == 0) {
    196     return RegExpEmpty::GetInstance();
    197   }
    198   if (num_alternatives == 1) {
    199     return alternatives_.last();
    200   }
    201   return new(zone()) RegExpDisjunction(alternatives_.GetList(zone()));
    202 }
    203 
    204 
    205 void RegExpBuilder::AddQuantifierToAtom(
    206     int min, int max, RegExpQuantifier::QuantifierType quantifier_type) {
    207   if (pending_empty_) {
    208     pending_empty_ = false;
    209     return;
    210   }
    211   RegExpTree* atom;
    212   if (characters_ != NULL) {
    213     ASSERT(last_added_ == ADD_CHAR);
    214     // Last atom was character.
    215     Vector<const uc16> char_vector = characters_->ToConstVector();
    216     int num_chars = char_vector.length();
    217     if (num_chars > 1) {
    218       Vector<const uc16> prefix = char_vector.SubVector(0, num_chars - 1);
    219       text_.Add(new(zone()) RegExpAtom(prefix), zone());
    220       char_vector = char_vector.SubVector(num_chars - 1, num_chars);
    221     }
    222     characters_ = NULL;
    223     atom = new(zone()) RegExpAtom(char_vector);
    224     FlushText();
    225   } else if (text_.length() > 0) {
    226     ASSERT(last_added_ == ADD_ATOM);
    227     atom = text_.RemoveLast();
    228     FlushText();
    229   } else if (terms_.length() > 0) {
    230     ASSERT(last_added_ == ADD_ATOM);
    231     atom = terms_.RemoveLast();
    232     if (atom->max_match() == 0) {
    233       // Guaranteed to only match an empty string.
    234       LAST(ADD_TERM);
    235       if (min == 0) {
    236         return;
    237       }
    238       terms_.Add(atom, zone());
    239       return;
    240     }
    241   } else {
    242     // Only call immediately after adding an atom or character!
    243     UNREACHABLE();
    244     return;
    245   }
    246   terms_.Add(
    247       new(zone()) RegExpQuantifier(min, max, quantifier_type, atom), zone());
    248   LAST(ADD_TERM);
    249 }
    250 
    251 
    252 Handle<String> Parser::LookupSymbol(int symbol_id) {
    253   // Length of symbol cache is the number of identified symbols.
    254   // If we are larger than that, or negative, it's not a cached symbol.
    255   // This might also happen if there is no preparser symbol data, even
    256   // if there is some preparser data.
    257   if (static_cast<unsigned>(symbol_id)
    258       >= static_cast<unsigned>(symbol_cache_.length())) {
    259     if (scanner().is_literal_ascii()) {
    260       return isolate()->factory()->InternalizeOneByteString(
    261           Vector<const uint8_t>::cast(scanner().literal_ascii_string()));
    262     } else {
    263       return isolate()->factory()->InternalizeTwoByteString(
    264           scanner().literal_utf16_string());
    265     }
    266   }
    267   return LookupCachedSymbol(symbol_id);
    268 }
    269 
    270 
    271 Handle<String> Parser::LookupCachedSymbol(int symbol_id) {
    272   // Make sure the cache is large enough to hold the symbol identifier.
    273   if (symbol_cache_.length() <= symbol_id) {
    274     // Increase length to index + 1.
    275     symbol_cache_.AddBlock(Handle<String>::null(),
    276                            symbol_id + 1 - symbol_cache_.length(), zone());
    277   }
    278   Handle<String> result = symbol_cache_.at(symbol_id);
    279   if (result.is_null()) {
    280     if (scanner().is_literal_ascii()) {
    281       result = isolate()->factory()->InternalizeOneByteString(
    282           Vector<const uint8_t>::cast(scanner().literal_ascii_string()));
    283     } else {
    284       result = isolate()->factory()->InternalizeTwoByteString(
    285           scanner().literal_utf16_string());
    286     }
    287     symbol_cache_.at(symbol_id) = result;
    288     return result;
    289   }
    290   isolate()->counters()->total_preparse_symbols_skipped()->Increment();
    291   return result;
    292 }
    293 
    294 
    295 FunctionEntry ScriptDataImpl::GetFunctionEntry(int start) {
    296   // The current pre-data entry must be a FunctionEntry with the given
    297   // start position.
    298   if ((function_index_ + FunctionEntry::kSize <= store_.length())
    299       && (static_cast<int>(store_[function_index_]) == start)) {
    300     int index = function_index_;
    301     function_index_ += FunctionEntry::kSize;
    302     return FunctionEntry(store_.SubVector(index,
    303                                           index + FunctionEntry::kSize));
    304   }
    305   return FunctionEntry();
    306 }
    307 
    308 
    309 int ScriptDataImpl::GetSymbolIdentifier() {
    310   return ReadNumber(&symbol_data_);
    311 }
    312 
    313 
    314 bool ScriptDataImpl::SanityCheck() {
    315   // Check that the header data is valid and doesn't specify
    316   // point to positions outside the store.
    317   if (store_.length() < PreparseDataConstants::kHeaderSize) return false;
    318   if (magic() != PreparseDataConstants::kMagicNumber) return false;
    319   if (version() != PreparseDataConstants::kCurrentVersion) return false;
    320   if (has_error()) {
    321     // Extra sane sanity check for error message encoding.
    322     if (store_.length() <= PreparseDataConstants::kHeaderSize
    323                          + PreparseDataConstants::kMessageTextPos) {
    324       return false;
    325     }
    326     if (Read(PreparseDataConstants::kMessageStartPos) >
    327         Read(PreparseDataConstants::kMessageEndPos)) {
    328       return false;
    329     }
    330     unsigned arg_count = Read(PreparseDataConstants::kMessageArgCountPos);
    331     int pos = PreparseDataConstants::kMessageTextPos;
    332     for (unsigned int i = 0; i <= arg_count; i++) {
    333       if (store_.length() <= PreparseDataConstants::kHeaderSize + pos) {
    334         return false;
    335       }
    336       int length = static_cast<int>(Read(pos));
    337       if (length < 0) return false;
    338       pos += 1 + length;
    339     }
    340     if (store_.length() < PreparseDataConstants::kHeaderSize + pos) {
    341       return false;
    342     }
    343     return true;
    344   }
    345   // Check that the space allocated for function entries is sane.
    346   int functions_size =
    347       static_cast<int>(store_[PreparseDataConstants::kFunctionsSizeOffset]);
    348   if (functions_size < 0) return false;
    349   if (functions_size % FunctionEntry::kSize != 0) return false;
    350   // Check that the count of symbols is non-negative.
    351   int symbol_count =
    352       static_cast<int>(store_[PreparseDataConstants::kSymbolCountOffset]);
    353   if (symbol_count < 0) return false;
    354   // Check that the total size has room for header and function entries.
    355   int minimum_size =
    356       PreparseDataConstants::kHeaderSize + functions_size;
    357   if (store_.length() < minimum_size) return false;
    358   return true;
    359 }
    360 
    361 
    362 
    363 const char* ScriptDataImpl::ReadString(unsigned* start, int* chars) {
    364   int length = start[0];
    365   char* result = NewArray<char>(length + 1);
    366   for (int i = 0; i < length; i++) {
    367     result[i] = start[i + 1];
    368   }
    369   result[length] = '\0';
    370   if (chars != NULL) *chars = length;
    371   return result;
    372 }
    373 
    374 
    375 Scanner::Location ScriptDataImpl::MessageLocation() {
    376   int beg_pos = Read(PreparseDataConstants::kMessageStartPos);
    377   int end_pos = Read(PreparseDataConstants::kMessageEndPos);
    378   return Scanner::Location(beg_pos, end_pos);
    379 }
    380 
    381 
    382 const char* ScriptDataImpl::BuildMessage() {
    383   unsigned* start = ReadAddress(PreparseDataConstants::kMessageTextPos);
    384   return ReadString(start, NULL);
    385 }
    386 
    387 
    388 Vector<const char*> ScriptDataImpl::BuildArgs() {
    389   int arg_count = Read(PreparseDataConstants::kMessageArgCountPos);
    390   const char** array = NewArray<const char*>(arg_count);
    391   // Position after text found by skipping past length field and
    392   // length field content words.
    393   int pos = PreparseDataConstants::kMessageTextPos + 1
    394       + Read(PreparseDataConstants::kMessageTextPos);
    395   for (int i = 0; i < arg_count; i++) {
    396     int count = 0;
    397     array[i] = ReadString(ReadAddress(pos), &count);
    398     pos += count + 1;
    399   }
    400   return Vector<const char*>(array, arg_count);
    401 }
    402 
    403 
    404 unsigned ScriptDataImpl::Read(int position) {
    405   return store_[PreparseDataConstants::kHeaderSize + position];
    406 }
    407 
    408 
    409 unsigned* ScriptDataImpl::ReadAddress(int position) {
    410   return &store_[PreparseDataConstants::kHeaderSize + position];
    411 }
    412 
    413 
    414 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) {
    415   Scope* result = new(zone()) Scope(parent, scope_type, zone());
    416   result->Initialize();
    417   return result;
    418 }
    419 
    420 
    421 // ----------------------------------------------------------------------------
    422 // Target is a support class to facilitate manipulation of the
    423 // Parser's target_stack_ (the stack of potential 'break' and
    424 // 'continue' statement targets). Upon construction, a new target is
    425 // added; it is removed upon destruction.
    426 
    427 class Target BASE_EMBEDDED {
    428  public:
    429   Target(Target** variable, AstNode* node)
    430       : variable_(variable), node_(node), previous_(*variable) {
    431     *variable = this;
    432   }
    433 
    434   ~Target() {
    435     *variable_ = previous_;
    436   }
    437 
    438   Target* previous() { return previous_; }
    439   AstNode* node() { return node_; }
    440 
    441  private:
    442   Target** variable_;
    443   AstNode* node_;
    444   Target* previous_;
    445 };
    446 
    447 
    448 class TargetScope BASE_EMBEDDED {
    449  public:
    450   explicit TargetScope(Target** variable)
    451       : variable_(variable), previous_(*variable) {
    452     *variable = NULL;
    453   }
    454 
    455   ~TargetScope() {
    456     *variable_ = previous_;
    457   }
    458 
    459  private:
    460   Target** variable_;
    461   Target* previous_;
    462 };
    463 
    464 
    465 // ----------------------------------------------------------------------------
    466 // FunctionState and BlockState together implement the parser's scope stack.
    467 // The parser's current scope is in top_scope_.  The BlockState and
    468 // FunctionState constructors push on the scope stack and the destructors
    469 // pop.  They are also used to hold the parser's per-function and per-block
    470 // state.
    471 
    472 class Parser::BlockState BASE_EMBEDDED {
    473  public:
    474   BlockState(Parser* parser, Scope* scope)
    475       : parser_(parser),
    476         outer_scope_(parser->top_scope_) {
    477     parser->top_scope_ = scope;
    478   }
    479 
    480   ~BlockState() { parser_->top_scope_ = outer_scope_; }
    481 
    482  private:
    483   Parser* parser_;
    484   Scope* outer_scope_;
    485 };
    486 
    487 
    488 Parser::FunctionState::FunctionState(Parser* parser,
    489                                      Scope* scope,
    490                                      Isolate* isolate)
    491     : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize),
    492       next_handler_index_(0),
    493       expected_property_count_(0),
    494       generator_object_variable_(NULL),
    495       parser_(parser),
    496       outer_function_state_(parser->current_function_state_),
    497       outer_scope_(parser->top_scope_),
    498       saved_ast_node_id_(isolate->ast_node_id()),
    499       factory_(isolate, parser->zone()) {
    500   parser->top_scope_ = scope;
    501   parser->current_function_state_ = this;
    502   isolate->set_ast_node_id(BailoutId::FirstUsable().ToInt());
    503 }
    504 
    505 
    506 Parser::FunctionState::~FunctionState() {
    507   parser_->top_scope_ = outer_scope_;
    508   parser_->current_function_state_ = outer_function_state_;
    509   if (outer_function_state_ != NULL) {
    510     parser_->isolate()->set_ast_node_id(saved_ast_node_id_);
    511   }
    512 }
    513 
    514 
    515 // ----------------------------------------------------------------------------
    516 // The CHECK_OK macro is a convenient macro to enforce error
    517 // handling for functions that may fail (by returning !*ok).
    518 //
    519 // CAUTION: This macro appends extra statements after a call,
    520 // thus it must never be used where only a single statement
    521 // is correct (e.g. an if statement branch w/o braces)!
    522 
    523 #define CHECK_OK  ok);   \
    524   if (!*ok) return NULL; \
    525   ((void)0
    526 #define DUMMY )  // to make indentation work
    527 #undef DUMMY
    528 
    529 #define CHECK_FAILED  /**/);   \
    530   if (failed_) return NULL; \
    531   ((void)0
    532 #define DUMMY )  // to make indentation work
    533 #undef DUMMY
    534 
    535 // ----------------------------------------------------------------------------
    536 // Implementation of Parser
    537 
    538 Parser::Parser(CompilationInfo* info)
    539     : isolate_(info->isolate()),
    540       symbol_cache_(0, info->zone()),
    541       script_(info->script()),
    542       scanner_(isolate_->unicode_cache()),
    543       reusable_preparser_(NULL),
    544       top_scope_(NULL),
    545       current_function_state_(NULL),
    546       target_stack_(NULL),
    547       extension_(info->extension()),
    548       pre_parse_data_(NULL),
    549       fni_(NULL),
    550       allow_natives_syntax_(false),
    551       allow_lazy_(false),
    552       allow_generators_(false),
    553       allow_for_of_(false),
    554       stack_overflow_(false),
    555       parenthesized_function_(false),
    556       zone_(info->zone()),
    557       info_(info) {
    558   ASSERT(!script_.is_null());
    559   isolate_->set_ast_node_id(0);
    560   set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
    561   set_allow_modules(!info->is_native() && FLAG_harmony_modules);
    562   set_allow_natives_syntax(FLAG_allow_natives_syntax || info->is_native());
    563   set_allow_lazy(false);  // Must be explicitly enabled.
    564   set_allow_generators(FLAG_harmony_generators);
    565   set_allow_for_of(FLAG_harmony_iteration);
    566   set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
    567 }
    568 
    569 
    570 FunctionLiteral* Parser::ParseProgram() {
    571   HistogramTimerScope timer(isolate()->counters()->parse());
    572   Handle<String> source(String::cast(script_->source()));
    573   isolate()->counters()->total_parse_size()->Increment(source->length());
    574   int64_t start = FLAG_trace_parse ? OS::Ticks() : 0;
    575   fni_ = new(zone()) FuncNameInferrer(isolate(), zone());
    576 
    577   // Initialize parser state.
    578   source->TryFlatten();
    579   FunctionLiteral* result;
    580   if (source->IsExternalTwoByteString()) {
    581     // Notice that the stream is destroyed at the end of the branch block.
    582     // The last line of the blocks can't be moved outside, even though they're
    583     // identical calls.
    584     ExternalTwoByteStringUtf16CharacterStream stream(
    585         Handle<ExternalTwoByteString>::cast(source), 0, source->length());
    586     scanner_.Initialize(&stream);
    587     result = DoParseProgram(info(), source);
    588   } else {
    589     GenericStringUtf16CharacterStream stream(source, 0, source->length());
    590     scanner_.Initialize(&stream);
    591     result = DoParseProgram(info(), source);
    592   }
    593 
    594   if (FLAG_trace_parse && result != NULL) {
    595     double ms = static_cast<double>(OS::Ticks() - start) / 1000;
    596     if (info()->is_eval()) {
    597       PrintF("[parsing eval");
    598     } else if (info()->script()->name()->IsString()) {
    599       String* name = String::cast(info()->script()->name());
    600       SmartArrayPointer<char> name_chars = name->ToCString();
    601       PrintF("[parsing script: %s", *name_chars);
    602     } else {
    603       PrintF("[parsing script");
    604     }
    605     PrintF(" - took %0.3f ms]\n", ms);
    606   }
    607   return result;
    608 }
    609 
    610 
    611 FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info,
    612                                         Handle<String> source) {
    613   ASSERT(top_scope_ == NULL);
    614   ASSERT(target_stack_ == NULL);
    615   if (pre_parse_data_ != NULL) pre_parse_data_->Initialize();
    616 
    617   Handle<String> no_name = isolate()->factory()->empty_string();
    618 
    619   FunctionLiteral* result = NULL;
    620   { Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE);
    621     info->SetGlobalScope(scope);
    622     if (!info->context().is_null()) {
    623       scope = Scope::DeserializeScopeChain(*info->context(), scope, zone());
    624     }
    625     if (info->is_eval()) {
    626       if (!scope->is_global_scope() || info->language_mode() != CLASSIC_MODE) {
    627         scope = NewScope(scope, EVAL_SCOPE);
    628       }
    629     } else if (info->is_global()) {
    630       scope = NewScope(scope, GLOBAL_SCOPE);
    631     }
    632     scope->set_start_position(0);
    633     scope->set_end_position(source->length());
    634 
    635     // Compute the parsing mode.
    636     Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
    637     if (allow_natives_syntax() ||
    638         extension_ != NULL ||
    639         scope->is_eval_scope()) {
    640       mode = PARSE_EAGERLY;
    641     }
    642     ParsingModeScope parsing_mode(this, mode);
    643 
    644     // Enters 'scope'.
    645     FunctionState function_state(this, scope, isolate());
    646 
    647     top_scope_->SetLanguageMode(info->language_mode());
    648     ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
    649     bool ok = true;
    650     int beg_loc = scanner().location().beg_pos;
    651     ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok);
    652     if (ok && !top_scope_->is_classic_mode()) {
    653       CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok);
    654     }
    655 
    656     if (ok && is_extended_mode()) {
    657       CheckConflictingVarDeclarations(top_scope_, &ok);
    658     }
    659 
    660     if (ok && info->parse_restriction() == ONLY_SINGLE_FUNCTION_LITERAL) {
    661       if (body->length() != 1 ||
    662           !body->at(0)->IsExpressionStatement() ||
    663           !body->at(0)->AsExpressionStatement()->
    664               expression()->IsFunctionLiteral()) {
    665         ReportMessage("single_function_literal", Vector<const char*>::empty());
    666         ok = false;
    667       }
    668     }
    669 
    670     if (ok) {
    671       result = factory()->NewFunctionLiteral(
    672           no_name,
    673           top_scope_,
    674           body,
    675           function_state.materialized_literal_count(),
    676           function_state.expected_property_count(),
    677           function_state.handler_count(),
    678           0,
    679           FunctionLiteral::kNoDuplicateParameters,
    680           FunctionLiteral::ANONYMOUS_EXPRESSION,
    681           FunctionLiteral::kGlobalOrEval,
    682           FunctionLiteral::kNotParenthesized,
    683           FunctionLiteral::kNotGenerator);
    684       result->set_ast_properties(factory()->visitor()->ast_properties());
    685     } else if (stack_overflow_) {
    686       isolate()->StackOverflow();
    687     }
    688   }
    689 
    690   // Make sure the target stack is empty.
    691   ASSERT(target_stack_ == NULL);
    692 
    693   return result;
    694 }
    695 
    696 
    697 FunctionLiteral* Parser::ParseLazy() {
    698   HistogramTimerScope timer(isolate()->counters()->parse_lazy());
    699   Handle<String> source(String::cast(script_->source()));
    700   isolate()->counters()->total_parse_size()->Increment(source->length());
    701   int64_t start = FLAG_trace_parse ? OS::Ticks() : 0;
    702   Handle<SharedFunctionInfo> shared_info = info()->shared_info();
    703 
    704   // Initialize parser state.
    705   source->TryFlatten();
    706   FunctionLiteral* result;
    707   if (source->IsExternalTwoByteString()) {
    708     ExternalTwoByteStringUtf16CharacterStream stream(
    709         Handle<ExternalTwoByteString>::cast(source),
    710         shared_info->start_position(),
    711         shared_info->end_position());
    712     result = ParseLazy(&stream);
    713   } else {
    714     GenericStringUtf16CharacterStream stream(source,
    715                                              shared_info->start_position(),
    716                                              shared_info->end_position());
    717     result = ParseLazy(&stream);
    718   }
    719 
    720   if (FLAG_trace_parse && result != NULL) {
    721     double ms = static_cast<double>(OS::Ticks() - start) / 1000;
    722     SmartArrayPointer<char> name_chars = result->debug_name()->ToCString();
    723     PrintF("[parsing function: %s - took %0.3f ms]\n", *name_chars, ms);
    724   }
    725   return result;
    726 }
    727 
    728 
    729 FunctionLiteral* Parser::ParseLazy(Utf16CharacterStream* source) {
    730   Handle<SharedFunctionInfo> shared_info = info()->shared_info();
    731   scanner_.Initialize(source);
    732   ASSERT(top_scope_ == NULL);
    733   ASSERT(target_stack_ == NULL);
    734 
    735   Handle<String> name(String::cast(shared_info->name()));
    736   fni_ = new(zone()) FuncNameInferrer(isolate(), zone());
    737   fni_->PushEnclosingName(name);
    738 
    739   ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
    740 
    741   // Place holder for the result.
    742   FunctionLiteral* result = NULL;
    743 
    744   {
    745     // Parse the function literal.
    746     Scope* scope = NewScope(top_scope_, GLOBAL_SCOPE);
    747     info()->SetGlobalScope(scope);
    748     if (!info()->closure().is_null()) {
    749       scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope,
    750                                            zone());
    751     }
    752     FunctionState function_state(this, scope, isolate());
    753     ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode());
    754     ASSERT(scope->language_mode() != EXTENDED_MODE ||
    755            info()->is_extended_mode());
    756     ASSERT(info()->language_mode() == shared_info->language_mode());
    757     scope->SetLanguageMode(shared_info->language_mode());
    758     FunctionLiteral::FunctionType function_type = shared_info->is_expression()
    759         ? (shared_info->is_anonymous()
    760               ? FunctionLiteral::ANONYMOUS_EXPRESSION
    761               : FunctionLiteral::NAMED_EXPRESSION)
    762         : FunctionLiteral::DECLARATION;
    763     bool ok = true;
    764     result = ParseFunctionLiteral(name,
    765                                   false,  // Strict mode name already checked.
    766                                   shared_info->is_generator(),
    767                                   RelocInfo::kNoPosition,
    768                                   function_type,
    769                                   &ok);
    770     // Make sure the results agree.
    771     ASSERT(ok == (result != NULL));
    772   }
    773 
    774   // Make sure the target stack is empty.
    775   ASSERT(target_stack_ == NULL);
    776 
    777   if (result == NULL) {
    778     if (stack_overflow_) isolate()->StackOverflow();
    779   } else {
    780     Handle<String> inferred_name(shared_info->inferred_name());
    781     result->set_inferred_name(inferred_name);
    782   }
    783   return result;
    784 }
    785 
    786 
    787 Handle<String> Parser::GetSymbol() {
    788   int symbol_id = -1;
    789   if (pre_parse_data() != NULL) {
    790     symbol_id = pre_parse_data()->GetSymbolIdentifier();
    791   }
    792   return LookupSymbol(symbol_id);
    793 }
    794 
    795 
    796 void Parser::ReportMessage(const char* message, Vector<const char*> args) {
    797   Scanner::Location source_location = scanner().location();
    798   ReportMessageAt(source_location, message, args);
    799 }
    800 
    801 
    802 void Parser::ReportMessage(const char* message, Vector<Handle<String> > args) {
    803   Scanner::Location source_location = scanner().location();
    804   ReportMessageAt(source_location, message, args);
    805 }
    806 
    807 
    808 void Parser::ReportMessageAt(Scanner::Location source_location,
    809                              const char* message,
    810                              Vector<const char*> args) {
    811   MessageLocation location(script_,
    812                            source_location.beg_pos,
    813                            source_location.end_pos);
    814   Factory* factory = isolate()->factory();
    815   Handle<FixedArray> elements = factory->NewFixedArray(args.length());
    816   for (int i = 0; i < args.length(); i++) {
    817     Handle<String> arg_string = factory->NewStringFromUtf8(CStrVector(args[i]));
    818     elements->set(i, *arg_string);
    819   }
    820   Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
    821   Handle<Object> result = factory->NewSyntaxError(message, array);
    822   isolate()->Throw(*result, &location);
    823 }
    824 
    825 
    826 void Parser::ReportMessageAt(Scanner::Location source_location,
    827                              const char* message,
    828                              Vector<Handle<String> > args) {
    829   MessageLocation location(script_,
    830                            source_location.beg_pos,
    831                            source_location.end_pos);
    832   Factory* factory = isolate()->factory();
    833   Handle<FixedArray> elements = factory->NewFixedArray(args.length());
    834   for (int i = 0; i < args.length(); i++) {
    835     elements->set(i, *args[i]);
    836   }
    837   Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
    838   Handle<Object> result = factory->NewSyntaxError(message, array);
    839   isolate()->Throw(*result, &location);
    840 }
    841 
    842 
    843 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
    844                                   int end_token,
    845                                   bool is_eval,
    846                                   bool is_global,
    847                                   bool* ok) {
    848   // SourceElements ::
    849   //   (ModuleElement)* <end_token>
    850 
    851   // Allocate a target stack to use for this set of source
    852   // elements. This way, all scripts and functions get their own
    853   // target stack thus avoiding illegal breaks and continues across
    854   // functions.
    855   TargetScope scope(&this->target_stack_);
    856 
    857   ASSERT(processor != NULL);
    858   bool directive_prologue = true;     // Parsing directive prologue.
    859 
    860   while (peek() != end_token) {
    861     if (directive_prologue && peek() != Token::STRING) {
    862       directive_prologue = false;
    863     }
    864 
    865     Scanner::Location token_loc = scanner().peek_location();
    866     Statement* stat;
    867     if (is_global && !is_eval) {
    868       stat = ParseModuleElement(NULL, CHECK_OK);
    869     } else {
    870       stat = ParseBlockElement(NULL, CHECK_OK);
    871     }
    872     if (stat == NULL || stat->IsEmpty()) {
    873       directive_prologue = false;   // End of directive prologue.
    874       continue;
    875     }
    876 
    877     if (directive_prologue) {
    878       // A shot at a directive.
    879       ExpressionStatement* e_stat;
    880       Literal* literal;
    881       // Still processing directive prologue?
    882       if ((e_stat = stat->AsExpressionStatement()) != NULL &&
    883           (literal = e_stat->expression()->AsLiteral()) != NULL &&
    884           literal->value()->IsString()) {
    885         Handle<String> directive = Handle<String>::cast(literal->value());
    886 
    887         // Check "use strict" directive (ES5 14.1).
    888         if (top_scope_->is_classic_mode() &&
    889             directive->Equals(isolate()->heap()->use_strict_string()) &&
    890             token_loc.end_pos - token_loc.beg_pos ==
    891               isolate()->heap()->use_strict_string()->length() + 2) {
    892           // TODO(mstarzinger): Global strict eval calls, need their own scope
    893           // as specified in ES5 10.4.2(3). The correct fix would be to always
    894           // add this scope in DoParseProgram(), but that requires adaptations
    895           // all over the code base, so we go with a quick-fix for now.
    896           // In the same manner, we have to patch the parsing mode.
    897           if (is_eval && !top_scope_->is_eval_scope()) {
    898             ASSERT(top_scope_->is_global_scope());
    899             Scope* scope = NewScope(top_scope_, EVAL_SCOPE);
    900             scope->set_start_position(top_scope_->start_position());
    901             scope->set_end_position(top_scope_->end_position());
    902             top_scope_ = scope;
    903             mode_ = PARSE_EAGERLY;
    904           }
    905           // TODO(ES6): Fix entering extended mode, once it is specified.
    906           top_scope_->SetLanguageMode(allow_harmony_scoping()
    907                                       ? EXTENDED_MODE : STRICT_MODE);
    908           // "use strict" is the only directive for now.
    909           directive_prologue = false;
    910         }
    911       } else {
    912         // End of the directive prologue.
    913         directive_prologue = false;
    914       }
    915     }
    916 
    917     processor->Add(stat, zone());
    918   }
    919 
    920   return 0;
    921 }
    922 
    923 
    924 Statement* Parser::ParseModuleElement(ZoneStringList* labels,
    925                                       bool* ok) {
    926   // (Ecma 262 5th Edition, clause 14):
    927   // SourceElement:
    928   //    Statement
    929   //    FunctionDeclaration
    930   //
    931   // In harmony mode we allow additionally the following productions
    932   // ModuleElement:
    933   //    LetDeclaration
    934   //    ConstDeclaration
    935   //    ModuleDeclaration
    936   //    ImportDeclaration
    937   //    ExportDeclaration
    938   //    GeneratorDeclaration
    939 
    940   switch (peek()) {
    941     case Token::FUNCTION:
    942       return ParseFunctionDeclaration(NULL, ok);
    943     case Token::LET:
    944     case Token::CONST:
    945       return ParseVariableStatement(kModuleElement, NULL, ok);
    946     case Token::IMPORT:
    947       return ParseImportDeclaration(ok);
    948     case Token::EXPORT:
    949       return ParseExportDeclaration(ok);
    950     default: {
    951       Statement* stmt = ParseStatement(labels, CHECK_OK);
    952       // Handle 'module' as a context-sensitive keyword.
    953       if (FLAG_harmony_modules &&
    954           peek() == Token::IDENTIFIER &&
    955           !scanner().HasAnyLineTerminatorBeforeNext() &&
    956           stmt != NULL) {
    957         ExpressionStatement* estmt = stmt->AsExpressionStatement();
    958         if (estmt != NULL &&
    959             estmt->expression()->AsVariableProxy() != NULL &&
    960             estmt->expression()->AsVariableProxy()->name()->Equals(
    961                 isolate()->heap()->module_string()) &&
    962             !scanner().literal_contains_escapes()) {
    963           return ParseModuleDeclaration(NULL, ok);
    964         }
    965       }
    966       return stmt;
    967     }
    968   }
    969 }
    970 
    971 
    972 Statement* Parser::ParseModuleDeclaration(ZoneStringList* names, bool* ok) {
    973   // ModuleDeclaration:
    974   //    'module' Identifier Module
    975 
    976   Handle<String> name = ParseIdentifier(CHECK_OK);
    977 
    978 #ifdef DEBUG
    979   if (FLAG_print_interface_details)
    980     PrintF("# Module %s...\n", name->ToAsciiArray());
    981 #endif
    982 
    983   Module* module = ParseModule(CHECK_OK);
    984   VariableProxy* proxy = NewUnresolved(name, MODULE, module->interface());
    985   Declaration* declaration =
    986       factory()->NewModuleDeclaration(proxy, module, top_scope_);
    987   Declare(declaration, true, CHECK_OK);
    988 
    989 #ifdef DEBUG
    990   if (FLAG_print_interface_details)
    991     PrintF("# Module %s.\n", name->ToAsciiArray());
    992 
    993   if (FLAG_print_interfaces) {
    994     PrintF("module %s : ", name->ToAsciiArray());
    995     module->interface()->Print();
    996   }
    997 #endif
    998 
    999   if (names) names->Add(name, zone());
   1000   if (module->body() == NULL)
   1001     return factory()->NewEmptyStatement();
   1002   else
   1003     return factory()->NewModuleStatement(proxy, module->body());
   1004 }
   1005 
   1006 
   1007 Module* Parser::ParseModule(bool* ok) {
   1008   // Module:
   1009   //    '{' ModuleElement '}'
   1010   //    '=' ModulePath ';'
   1011   //    'at' String ';'
   1012 
   1013   switch (peek()) {
   1014     case Token::LBRACE:
   1015       return ParseModuleLiteral(ok);
   1016 
   1017     case Token::ASSIGN: {
   1018       Expect(Token::ASSIGN, CHECK_OK);
   1019       Module* result = ParseModulePath(CHECK_OK);
   1020       ExpectSemicolon(CHECK_OK);
   1021       return result;
   1022     }
   1023 
   1024     default: {
   1025       ExpectContextualKeyword(CStrVector("at"), CHECK_OK);
   1026       Module* result = ParseModuleUrl(CHECK_OK);
   1027       ExpectSemicolon(CHECK_OK);
   1028       return result;
   1029     }
   1030   }
   1031 }
   1032 
   1033 
   1034 Module* Parser::ParseModuleLiteral(bool* ok) {
   1035   // Module:
   1036   //    '{' ModuleElement '}'
   1037 
   1038   // Construct block expecting 16 statements.
   1039   Block* body = factory()->NewBlock(NULL, 16, false);
   1040 #ifdef DEBUG
   1041   if (FLAG_print_interface_details) PrintF("# Literal ");
   1042 #endif
   1043   Scope* scope = NewScope(top_scope_, MODULE_SCOPE);
   1044 
   1045   Expect(Token::LBRACE, CHECK_OK);
   1046   scope->set_start_position(scanner().location().beg_pos);
   1047   scope->SetLanguageMode(EXTENDED_MODE);
   1048 
   1049   {
   1050     BlockState block_state(this, scope);
   1051     TargetCollector collector(zone());
   1052     Target target(&this->target_stack_, &collector);
   1053     Target target_body(&this->target_stack_, body);
   1054 
   1055     while (peek() != Token::RBRACE) {
   1056       Statement* stat = ParseModuleElement(NULL, CHECK_OK);
   1057       if (stat && !stat->IsEmpty()) {
   1058         body->AddStatement(stat, zone());
   1059       }
   1060     }
   1061   }
   1062 
   1063   Expect(Token::RBRACE, CHECK_OK);
   1064   scope->set_end_position(scanner().location().end_pos);
   1065   body->set_scope(scope);
   1066 
   1067   // Check that all exports are bound.
   1068   Interface* interface = scope->interface();
   1069   for (Interface::Iterator it = interface->iterator();
   1070        !it.done(); it.Advance()) {
   1071     if (scope->LocalLookup(it.name()) == NULL) {
   1072       Handle<String> name(it.name());
   1073       ReportMessage("module_export_undefined",
   1074                     Vector<Handle<String> >(&name, 1));
   1075       *ok = false;
   1076       return NULL;
   1077     }
   1078   }
   1079 
   1080   interface->MakeModule(ok);
   1081   ASSERT(*ok);
   1082   interface->Freeze(ok);
   1083   ASSERT(*ok);
   1084   return factory()->NewModuleLiteral(body, interface);
   1085 }
   1086 
   1087 
   1088 Module* Parser::ParseModulePath(bool* ok) {
   1089   // ModulePath:
   1090   //    Identifier
   1091   //    ModulePath '.' Identifier
   1092 
   1093   Module* result = ParseModuleVariable(CHECK_OK);
   1094   while (Check(Token::PERIOD)) {
   1095     Handle<String> name = ParseIdentifierName(CHECK_OK);
   1096 #ifdef DEBUG
   1097     if (FLAG_print_interface_details)
   1098       PrintF("# Path .%s ", name->ToAsciiArray());
   1099 #endif
   1100     Module* member = factory()->NewModulePath(result, name);
   1101     result->interface()->Add(name, member->interface(), zone(), ok);
   1102     if (!*ok) {
   1103 #ifdef DEBUG
   1104       if (FLAG_print_interfaces) {
   1105         PrintF("PATH TYPE ERROR at '%s'\n", name->ToAsciiArray());
   1106         PrintF("result: ");
   1107         result->interface()->Print();
   1108         PrintF("member: ");
   1109         member->interface()->Print();
   1110       }
   1111 #endif
   1112       ReportMessage("invalid_module_path", Vector<Handle<String> >(&name, 1));
   1113       return NULL;
   1114     }
   1115     result = member;
   1116   }
   1117 
   1118   return result;
   1119 }
   1120 
   1121 
   1122 Module* Parser::ParseModuleVariable(bool* ok) {
   1123   // ModulePath:
   1124   //    Identifier
   1125 
   1126   Handle<String> name = ParseIdentifier(CHECK_OK);
   1127 #ifdef DEBUG
   1128   if (FLAG_print_interface_details)
   1129     PrintF("# Module variable %s ", name->ToAsciiArray());
   1130 #endif
   1131   VariableProxy* proxy = top_scope_->NewUnresolved(
   1132       factory(), name, Interface::NewModule(zone()),
   1133       scanner().location().beg_pos);
   1134 
   1135   return factory()->NewModuleVariable(proxy);
   1136 }
   1137 
   1138 
   1139 Module* Parser::ParseModuleUrl(bool* ok) {
   1140   // Module:
   1141   //    String
   1142 
   1143   Expect(Token::STRING, CHECK_OK);
   1144   Handle<String> symbol = GetSymbol();
   1145 
   1146   // TODO(ES6): Request JS resource from environment...
   1147 
   1148 #ifdef DEBUG
   1149   if (FLAG_print_interface_details) PrintF("# Url ");
   1150 #endif
   1151 
   1152   // Create an empty literal as long as the feature isn't finished.
   1153   USE(symbol);
   1154   Scope* scope = NewScope(top_scope_, MODULE_SCOPE);
   1155   Block* body = factory()->NewBlock(NULL, 1, false);
   1156   body->set_scope(scope);
   1157   Interface* interface = scope->interface();
   1158   Module* result = factory()->NewModuleLiteral(body, interface);
   1159   interface->Freeze(ok);
   1160   ASSERT(*ok);
   1161   interface->Unify(scope->interface(), zone(), ok);
   1162   ASSERT(*ok);
   1163   return result;
   1164 }
   1165 
   1166 
   1167 Module* Parser::ParseModuleSpecifier(bool* ok) {
   1168   // ModuleSpecifier:
   1169   //    String
   1170   //    ModulePath
   1171 
   1172   if (peek() == Token::STRING) {
   1173     return ParseModuleUrl(ok);
   1174   } else {
   1175     return ParseModulePath(ok);
   1176   }
   1177 }
   1178 
   1179 
   1180 Block* Parser::ParseImportDeclaration(bool* ok) {
   1181   // ImportDeclaration:
   1182   //    'import' IdentifierName (',' IdentifierName)* 'from' ModuleSpecifier ';'
   1183   //
   1184   // TODO(ES6): implement destructuring ImportSpecifiers
   1185 
   1186   Expect(Token::IMPORT, CHECK_OK);
   1187   ZoneStringList names(1, zone());
   1188 
   1189   Handle<String> name = ParseIdentifierName(CHECK_OK);
   1190   names.Add(name, zone());
   1191   while (peek() == Token::COMMA) {
   1192     Consume(Token::COMMA);
   1193     name = ParseIdentifierName(CHECK_OK);
   1194     names.Add(name, zone());
   1195   }
   1196 
   1197   ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
   1198   Module* module = ParseModuleSpecifier(CHECK_OK);
   1199   ExpectSemicolon(CHECK_OK);
   1200 
   1201   // Generate a separate declaration for each identifier.
   1202   // TODO(ES6): once we implement destructuring, make that one declaration.
   1203   Block* block = factory()->NewBlock(NULL, 1, true);
   1204   for (int i = 0; i < names.length(); ++i) {
   1205 #ifdef DEBUG
   1206     if (FLAG_print_interface_details)
   1207       PrintF("# Import %s ", names[i]->ToAsciiArray());
   1208 #endif
   1209     Interface* interface = Interface::NewUnknown(zone());
   1210     module->interface()->Add(names[i], interface, zone(), ok);
   1211     if (!*ok) {
   1212 #ifdef DEBUG
   1213       if (FLAG_print_interfaces) {
   1214         PrintF("IMPORT TYPE ERROR at '%s'\n", names[i]->ToAsciiArray());
   1215         PrintF("module: ");
   1216         module->interface()->Print();
   1217       }
   1218 #endif
   1219       ReportMessage("invalid_module_path", Vector<Handle<String> >(&name, 1));
   1220       return NULL;
   1221     }
   1222     VariableProxy* proxy = NewUnresolved(names[i], LET, interface);
   1223     Declaration* declaration =
   1224         factory()->NewImportDeclaration(proxy, module, top_scope_);
   1225     Declare(declaration, true, CHECK_OK);
   1226   }
   1227 
   1228   return block;
   1229 }
   1230 
   1231 
   1232 Statement* Parser::ParseExportDeclaration(bool* ok) {
   1233   // ExportDeclaration:
   1234   //    'export' Identifier (',' Identifier)* ';'
   1235   //    'export' VariableDeclaration
   1236   //    'export' FunctionDeclaration
   1237   //    'export' GeneratorDeclaration
   1238   //    'export' ModuleDeclaration
   1239   //
   1240   // TODO(ES6): implement structuring ExportSpecifiers
   1241 
   1242   Expect(Token::EXPORT, CHECK_OK);
   1243 
   1244   Statement* result = NULL;
   1245   ZoneStringList names(1, zone());
   1246   switch (peek()) {
   1247     case Token::IDENTIFIER: {
   1248       Handle<String> name = ParseIdentifier(CHECK_OK);
   1249       // Handle 'module' as a context-sensitive keyword.
   1250       if (!name->IsOneByteEqualTo(STATIC_ASCII_VECTOR("module"))) {
   1251         names.Add(name, zone());
   1252         while (peek() == Token::COMMA) {
   1253           Consume(Token::COMMA);
   1254           name = ParseIdentifier(CHECK_OK);
   1255           names.Add(name, zone());
   1256         }
   1257         ExpectSemicolon(CHECK_OK);
   1258         result = factory()->NewEmptyStatement();
   1259       } else {
   1260         result = ParseModuleDeclaration(&names, CHECK_OK);
   1261       }
   1262       break;
   1263     }
   1264 
   1265     case Token::FUNCTION:
   1266       result = ParseFunctionDeclaration(&names, CHECK_OK);
   1267       break;
   1268 
   1269     case Token::VAR:
   1270     case Token::LET:
   1271     case Token::CONST:
   1272       result = ParseVariableStatement(kModuleElement, &names, CHECK_OK);
   1273       break;
   1274 
   1275     default:
   1276       *ok = false;
   1277       ReportUnexpectedToken(scanner().current_token());
   1278       return NULL;
   1279   }
   1280 
   1281   // Extract declared names into export declarations and interface.
   1282   Interface* interface = top_scope_->interface();
   1283   for (int i = 0; i < names.length(); ++i) {
   1284 #ifdef DEBUG
   1285     if (FLAG_print_interface_details)
   1286       PrintF("# Export %s ", names[i]->ToAsciiArray());
   1287 #endif
   1288     Interface* inner = Interface::NewUnknown(zone());
   1289     interface->Add(names[i], inner, zone(), CHECK_OK);
   1290     if (!*ok)
   1291       return NULL;
   1292     VariableProxy* proxy = NewUnresolved(names[i], LET, inner);
   1293     USE(proxy);
   1294     // TODO(rossberg): Rethink whether we actually need to store export
   1295     // declarations (for compilation?).
   1296     // ExportDeclaration* declaration =
   1297     //     factory()->NewExportDeclaration(proxy, top_scope_);
   1298     // top_scope_->AddDeclaration(declaration);
   1299   }
   1300 
   1301   ASSERT(result != NULL);
   1302   return result;
   1303 }
   1304 
   1305 
   1306 Statement* Parser::ParseBlockElement(ZoneStringList* labels,
   1307                                      bool* ok) {
   1308   // (Ecma 262 5th Edition, clause 14):
   1309   // SourceElement:
   1310   //    Statement
   1311   //    FunctionDeclaration
   1312   //
   1313   // In harmony mode we allow additionally the following productions
   1314   // BlockElement (aka SourceElement):
   1315   //    LetDeclaration
   1316   //    ConstDeclaration
   1317   //    GeneratorDeclaration
   1318 
   1319   switch (peek()) {
   1320     case Token::FUNCTION:
   1321       return ParseFunctionDeclaration(NULL, ok);
   1322     case Token::LET:
   1323     case Token::CONST:
   1324       return ParseVariableStatement(kModuleElement, NULL, ok);
   1325     default:
   1326       return ParseStatement(labels, ok);
   1327   }
   1328 }
   1329 
   1330 
   1331 Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) {
   1332   // Statement ::
   1333   //   Block
   1334   //   VariableStatement
   1335   //   EmptyStatement
   1336   //   ExpressionStatement
   1337   //   IfStatement
   1338   //   IterationStatement
   1339   //   ContinueStatement
   1340   //   BreakStatement
   1341   //   ReturnStatement
   1342   //   WithStatement
   1343   //   LabelledStatement
   1344   //   SwitchStatement
   1345   //   ThrowStatement
   1346   //   TryStatement
   1347   //   DebuggerStatement
   1348 
   1349   // Note: Since labels can only be used by 'break' and 'continue'
   1350   // statements, which themselves are only valid within blocks,
   1351   // iterations or 'switch' statements (i.e., BreakableStatements),
   1352   // labels can be simply ignored in all other cases; except for
   1353   // trivial labeled break statements 'label: break label' which is
   1354   // parsed into an empty statement.
   1355 
   1356   // Keep the source position of the statement
   1357   int statement_pos = scanner().peek_location().beg_pos;
   1358   Statement* stmt = NULL;
   1359   switch (peek()) {
   1360     case Token::LBRACE:
   1361       return ParseBlock(labels, ok);
   1362 
   1363     case Token::CONST:  // fall through
   1364     case Token::LET:
   1365     case Token::VAR:
   1366       stmt = ParseVariableStatement(kStatement, NULL, ok);
   1367       break;
   1368 
   1369     case Token::SEMICOLON:
   1370       Next();
   1371       return factory()->NewEmptyStatement();
   1372 
   1373     case Token::IF:
   1374       stmt = ParseIfStatement(labels, ok);
   1375       break;
   1376 
   1377     case Token::DO:
   1378       stmt = ParseDoWhileStatement(labels, ok);
   1379       break;
   1380 
   1381     case Token::WHILE:
   1382       stmt = ParseWhileStatement(labels, ok);
   1383       break;
   1384 
   1385     case Token::FOR:
   1386       stmt = ParseForStatement(labels, ok);
   1387       break;
   1388 
   1389     case Token::CONTINUE:
   1390       stmt = ParseContinueStatement(ok);
   1391       break;
   1392 
   1393     case Token::BREAK:
   1394       stmt = ParseBreakStatement(labels, ok);
   1395       break;
   1396 
   1397     case Token::RETURN:
   1398       stmt = ParseReturnStatement(ok);
   1399       break;
   1400 
   1401     case Token::WITH:
   1402       stmt = ParseWithStatement(labels, ok);
   1403       break;
   1404 
   1405     case Token::SWITCH:
   1406       stmt = ParseSwitchStatement(labels, ok);
   1407       break;
   1408 
   1409     case Token::THROW:
   1410       stmt = ParseThrowStatement(ok);
   1411       break;
   1412 
   1413     case Token::TRY: {
   1414       // NOTE: It is somewhat complicated to have labels on
   1415       // try-statements. When breaking out of a try-finally statement,
   1416       // one must take great care not to treat it as a
   1417       // fall-through. It is much easier just to wrap the entire
   1418       // try-statement in a statement block and put the labels there
   1419       Block* result = factory()->NewBlock(labels, 1, false);
   1420       Target target(&this->target_stack_, result);
   1421       TryStatement* statement = ParseTryStatement(CHECK_OK);
   1422       if (statement) {
   1423         statement->set_statement_pos(statement_pos);
   1424       }
   1425       if (result) result->AddStatement(statement, zone());
   1426       return result;
   1427     }
   1428 
   1429     case Token::FUNCTION: {
   1430       // FunctionDeclaration is only allowed in the context of SourceElements
   1431       // (Ecma 262 5th Edition, clause 14):
   1432       // SourceElement:
   1433       //    Statement
   1434       //    FunctionDeclaration
   1435       // Common language extension is to allow function declaration in place
   1436       // of any statement. This language extension is disabled in strict mode.
   1437       //
   1438       // In Harmony mode, this case also handles the extension:
   1439       // Statement:
   1440       //    GeneratorDeclaration
   1441       if (!top_scope_->is_classic_mode()) {
   1442         ReportMessageAt(scanner().peek_location(), "strict_function",
   1443                         Vector<const char*>::empty());
   1444         *ok = false;
   1445         return NULL;
   1446       }
   1447       return ParseFunctionDeclaration(NULL, ok);
   1448     }
   1449 
   1450     case Token::DEBUGGER:
   1451       stmt = ParseDebuggerStatement(ok);
   1452       break;
   1453 
   1454     default:
   1455       stmt = ParseExpressionOrLabelledStatement(labels, ok);
   1456   }
   1457 
   1458   // Store the source position of the statement
   1459   if (stmt != NULL) stmt->set_statement_pos(statement_pos);
   1460   return stmt;
   1461 }
   1462 
   1463 
   1464 VariableProxy* Parser::NewUnresolved(
   1465     Handle<String> name, VariableMode mode, Interface* interface) {
   1466   // If we are inside a function, a declaration of a var/const variable is a
   1467   // truly local variable, and the scope of the variable is always the function
   1468   // scope.
   1469   // Let/const variables in harmony mode are always added to the immediately
   1470   // enclosing scope.
   1471   return DeclarationScope(mode)->NewUnresolved(
   1472       factory(), name, interface, scanner().location().beg_pos);
   1473 }
   1474 
   1475 
   1476 void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) {
   1477   VariableProxy* proxy = declaration->proxy();
   1478   Handle<String> name = proxy->name();
   1479   VariableMode mode = declaration->mode();
   1480   Scope* declaration_scope = DeclarationScope(mode);
   1481   Variable* var = NULL;
   1482 
   1483   // If a suitable scope exists, then we can statically declare this
   1484   // variable and also set its mode. In any case, a Declaration node
   1485   // will be added to the scope so that the declaration can be added
   1486   // to the corresponding activation frame at runtime if necessary.
   1487   // For instance declarations inside an eval scope need to be added
   1488   // to the calling function context.
   1489   // Similarly, strict mode eval scope does not leak variable declarations to
   1490   // the caller's scope so we declare all locals, too.
   1491   if (declaration_scope->is_function_scope() ||
   1492       declaration_scope->is_strict_or_extended_eval_scope() ||
   1493       declaration_scope->is_block_scope() ||
   1494       declaration_scope->is_module_scope() ||
   1495       declaration_scope->is_global_scope()) {
   1496     // Declare the variable in the declaration scope.
   1497     // For the global scope, we have to check for collisions with earlier
   1498     // (i.e., enclosing) global scopes, to maintain the illusion of a single
   1499     // global scope.
   1500     var = declaration_scope->is_global_scope()
   1501         ? declaration_scope->Lookup(name)
   1502         : declaration_scope->LocalLookup(name);
   1503     if (var == NULL) {
   1504       // Declare the name.
   1505       var = declaration_scope->DeclareLocal(
   1506           name, mode, declaration->initialization(), proxy->interface());
   1507     } else if ((mode != VAR || var->mode() != VAR) &&
   1508                (!declaration_scope->is_global_scope() ||
   1509                 IsLexicalVariableMode(mode) ||
   1510                 IsLexicalVariableMode(var->mode()))) {
   1511       // The name was declared in this scope before; check for conflicting
   1512       // re-declarations. We have a conflict if either of the declarations is
   1513       // not a var (in the global scope, we also have to ignore legacy const for
   1514       // compatibility). There is similar code in runtime.cc in the Declare
   1515       // functions. The function CheckNonConflictingScope checks for conflicting
   1516       // var and let bindings from different scopes whereas this is a check for
   1517       // conflicting declarations within the same scope. This check also covers
   1518       // the special case
   1519       //
   1520       // function () { let x; { var x; } }
   1521       //
   1522       // because the var declaration is hoisted to the function scope where 'x'
   1523       // is already bound.
   1524       ASSERT(IsDeclaredVariableMode(var->mode()));
   1525       if (is_extended_mode()) {
   1526         // In harmony mode we treat re-declarations as early errors. See
   1527         // ES5 16 for a definition of early errors.
   1528         SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS);
   1529         const char* elms[2] = { "Variable", *c_string };
   1530         Vector<const char*> args(elms, 2);
   1531         ReportMessage("redeclaration", args);
   1532         *ok = false;
   1533         return;
   1534       }
   1535       Handle<String> message_string =
   1536           isolate()->factory()->NewStringFromUtf8(CStrVector("Variable"),
   1537                                                   TENURED);
   1538       Expression* expression =
   1539           NewThrowTypeError(isolate()->factory()->redeclaration_string(),
   1540                             message_string, name);
   1541       declaration_scope->SetIllegalRedeclaration(expression);
   1542     }
   1543   }
   1544 
   1545   // We add a declaration node for every declaration. The compiler
   1546   // will only generate code if necessary. In particular, declarations
   1547   // for inner local variables that do not represent functions won't
   1548   // result in any generated code.
   1549   //
   1550   // Note that we always add an unresolved proxy even if it's not
   1551   // used, simply because we don't know in this method (w/o extra
   1552   // parameters) if the proxy is needed or not. The proxy will be
   1553   // bound during variable resolution time unless it was pre-bound
   1554   // below.
   1555   //
   1556   // WARNING: This will lead to multiple declaration nodes for the
   1557   // same variable if it is declared several times. This is not a
   1558   // semantic issue as long as we keep the source order, but it may be
   1559   // a performance issue since it may lead to repeated
   1560   // Runtime::DeclareContextSlot() calls.
   1561   declaration_scope->AddDeclaration(declaration);
   1562 
   1563   if (mode == CONST && declaration_scope->is_global_scope()) {
   1564     // For global const variables we bind the proxy to a variable.
   1565     ASSERT(resolve);  // should be set by all callers
   1566     Variable::Kind kind = Variable::NORMAL;
   1567     var = new(zone()) Variable(
   1568         declaration_scope, name, mode, true, kind,
   1569         kNeedsInitialization, proxy->interface());
   1570   } else if (declaration_scope->is_eval_scope() &&
   1571              declaration_scope->is_classic_mode()) {
   1572     // For variable declarations in a non-strict eval scope the proxy is bound
   1573     // to a lookup variable to force a dynamic declaration using the
   1574     // DeclareContextSlot runtime function.
   1575     Variable::Kind kind = Variable::NORMAL;
   1576     var = new(zone()) Variable(
   1577         declaration_scope, name, mode, true, kind,
   1578         declaration->initialization(), proxy->interface());
   1579     var->AllocateTo(Variable::LOOKUP, -1);
   1580     resolve = true;
   1581   }
   1582 
   1583   // If requested and we have a local variable, bind the proxy to the variable
   1584   // at parse-time. This is used for functions (and consts) declared inside
   1585   // statements: the corresponding function (or const) variable must be in the
   1586   // function scope and not a statement-local scope, e.g. as provided with a
   1587   // 'with' statement:
   1588   //
   1589   //   with (obj) {
   1590   //     function f() {}
   1591   //   }
   1592   //
   1593   // which is translated into:
   1594   //
   1595   //   with (obj) {
   1596   //     // in this case this is not: 'var f; f = function () {};'
   1597   //     var f = function () {};
   1598   //   }
   1599   //
   1600   // Note that if 'f' is accessed from inside the 'with' statement, it
   1601   // will be allocated in the context (because we must be able to look
   1602   // it up dynamically) but it will also be accessed statically, i.e.,
   1603   // with a context slot index and a context chain length for this
   1604   // initialization code. Thus, inside the 'with' statement, we need
   1605   // both access to the static and the dynamic context chain; the
   1606   // runtime needs to provide both.
   1607   if (resolve && var != NULL) {
   1608     proxy->BindTo(var);
   1609 
   1610     if (FLAG_harmony_modules) {
   1611       bool ok;
   1612 #ifdef DEBUG
   1613       if (FLAG_print_interface_details)
   1614         PrintF("# Declare %s\n", var->name()->ToAsciiArray());
   1615 #endif
   1616       proxy->interface()->Unify(var->interface(), zone(), &ok);
   1617       if (!ok) {
   1618 #ifdef DEBUG
   1619         if (FLAG_print_interfaces) {
   1620           PrintF("DECLARE TYPE ERROR\n");
   1621           PrintF("proxy: ");
   1622           proxy->interface()->Print();
   1623           PrintF("var: ");
   1624           var->interface()->Print();
   1625         }
   1626 #endif
   1627         ReportMessage("module_type_error", Vector<Handle<String> >(&name, 1));
   1628       }
   1629     }
   1630   }
   1631 }
   1632 
   1633 
   1634 // Language extension which is only enabled for source files loaded
   1635 // through the API's extension mechanism.  A native function
   1636 // declaration is resolved by looking up the function through a
   1637 // callback provided by the extension.
   1638 Statement* Parser::ParseNativeDeclaration(bool* ok) {
   1639   Expect(Token::FUNCTION, CHECK_OK);
   1640   Handle<String> name = ParseIdentifier(CHECK_OK);
   1641   Expect(Token::LPAREN, CHECK_OK);
   1642   bool done = (peek() == Token::RPAREN);
   1643   while (!done) {
   1644     ParseIdentifier(CHECK_OK);
   1645     done = (peek() == Token::RPAREN);
   1646     if (!done) {
   1647       Expect(Token::COMMA, CHECK_OK);
   1648     }
   1649   }
   1650   Expect(Token::RPAREN, CHECK_OK);
   1651   Expect(Token::SEMICOLON, CHECK_OK);
   1652 
   1653   // Make sure that the function containing the native declaration
   1654   // isn't lazily compiled. The extension structures are only
   1655   // accessible while parsing the first time not when reparsing
   1656   // because of lazy compilation.
   1657   DeclarationScope(VAR)->ForceEagerCompilation();
   1658 
   1659   // Compute the function template for the native function.
   1660   v8::Handle<v8::FunctionTemplate> fun_template =
   1661       extension_->GetNativeFunction(v8::Utils::ToLocal(name));
   1662   ASSERT(!fun_template.IsEmpty());
   1663 
   1664   // Instantiate the function and create a shared function info from it.
   1665   Handle<JSFunction> fun = Utils::OpenHandle(*fun_template->GetFunction());
   1666   const int literals = fun->NumberOfLiterals();
   1667   Handle<Code> code = Handle<Code>(fun->shared()->code());
   1668   Handle<Code> construct_stub = Handle<Code>(fun->shared()->construct_stub());
   1669   bool is_generator = false;
   1670   Handle<SharedFunctionInfo> shared =
   1671       isolate()->factory()->NewSharedFunctionInfo(name, literals, is_generator,
   1672           code, Handle<ScopeInfo>(fun->shared()->scope_info()));
   1673   shared->set_construct_stub(*construct_stub);
   1674 
   1675   // Copy the function data to the shared function info.
   1676   shared->set_function_data(fun->shared()->function_data());
   1677   int parameters = fun->shared()->formal_parameter_count();
   1678   shared->set_formal_parameter_count(parameters);
   1679 
   1680   // TODO(1240846): It's weird that native function declarations are
   1681   // introduced dynamically when we meet their declarations, whereas
   1682   // other functions are set up when entering the surrounding scope.
   1683   VariableProxy* proxy = NewUnresolved(name, VAR, Interface::NewValue());
   1684   Declaration* declaration =
   1685       factory()->NewVariableDeclaration(proxy, VAR, top_scope_);
   1686   Declare(declaration, true, CHECK_OK);
   1687   SharedFunctionInfoLiteral* lit =
   1688       factory()->NewSharedFunctionInfoLiteral(shared);
   1689   return factory()->NewExpressionStatement(
   1690       factory()->NewAssignment(
   1691           Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition));
   1692 }
   1693 
   1694 
   1695 Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) {
   1696   // FunctionDeclaration ::
   1697   //   'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
   1698   // GeneratorDeclaration ::
   1699   //   'function' '*' Identifier '(' FormalParameterListopt ')'
   1700   //      '{' FunctionBody '}'
   1701   Expect(Token::FUNCTION, CHECK_OK);
   1702   int function_token_position = scanner().location().beg_pos;
   1703   bool is_generator = allow_generators() && Check(Token::MUL);
   1704   bool is_strict_reserved = false;
   1705   Handle<String> name = ParseIdentifierOrStrictReservedWord(
   1706       &is_strict_reserved, CHECK_OK);
   1707   FunctionLiteral* fun = ParseFunctionLiteral(name,
   1708                                               is_strict_reserved,
   1709                                               is_generator,
   1710                                               function_token_position,
   1711                                               FunctionLiteral::DECLARATION,
   1712                                               CHECK_OK);
   1713   // Even if we're not at the top-level of the global or a function
   1714   // scope, we treat it as such and introduce the function with its
   1715   // initial value upon entering the corresponding scope.
   1716   // In extended mode, a function behaves as a lexical binding, except in the
   1717   // global scope.
   1718   VariableMode mode =
   1719       is_extended_mode() && !top_scope_->is_global_scope() ? LET : VAR;
   1720   VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue());
   1721   Declaration* declaration =
   1722       factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_);
   1723   Declare(declaration, true, CHECK_OK);
   1724   if (names) names->Add(name, zone());
   1725   return factory()->NewEmptyStatement();
   1726 }
   1727 
   1728 
   1729 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) {
   1730   if (top_scope_->is_extended_mode()) return ParseScopedBlock(labels, ok);
   1731 
   1732   // Block ::
   1733   //   '{' Statement* '}'
   1734 
   1735   // Note that a Block does not introduce a new execution scope!
   1736   // (ECMA-262, 3rd, 12.2)
   1737   //
   1738   // Construct block expecting 16 statements.
   1739   Block* result = factory()->NewBlock(labels, 16, false);
   1740   Target target(&this->target_stack_, result);
   1741   Expect(Token::LBRACE, CHECK_OK);
   1742   while (peek() != Token::RBRACE) {
   1743     Statement* stat = ParseStatement(NULL, CHECK_OK);
   1744     if (stat && !stat->IsEmpty()) {
   1745       result->AddStatement(stat, zone());
   1746     }
   1747   }
   1748   Expect(Token::RBRACE, CHECK_OK);
   1749   return result;
   1750 }
   1751 
   1752 
   1753 Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) {
   1754   // The harmony mode uses block elements instead of statements.
   1755   //
   1756   // Block ::
   1757   //   '{' BlockElement* '}'
   1758 
   1759   // Construct block expecting 16 statements.
   1760   Block* body = factory()->NewBlock(labels, 16, false);
   1761   Scope* block_scope = NewScope(top_scope_, BLOCK_SCOPE);
   1762 
   1763   // Parse the statements and collect escaping labels.
   1764   Expect(Token::LBRACE, CHECK_OK);
   1765   block_scope->set_start_position(scanner().location().beg_pos);
   1766   { BlockState block_state(this, block_scope);
   1767     TargetCollector collector(zone());
   1768     Target target(&this->target_stack_, &collector);
   1769     Target target_body(&this->target_stack_, body);
   1770 
   1771     while (peek() != Token::RBRACE) {
   1772       Statement* stat = ParseBlockElement(NULL, CHECK_OK);
   1773       if (stat && !stat->IsEmpty()) {
   1774         body->AddStatement(stat, zone());
   1775       }
   1776     }
   1777   }
   1778   Expect(Token::RBRACE, CHECK_OK);
   1779   block_scope->set_end_position(scanner().location().end_pos);
   1780   block_scope = block_scope->FinalizeBlockScope();
   1781   body->set_scope(block_scope);
   1782   return body;
   1783 }
   1784 
   1785 
   1786 Block* Parser::ParseVariableStatement(VariableDeclarationContext var_context,
   1787                                       ZoneStringList* names,
   1788                                       bool* ok) {
   1789   // VariableStatement ::
   1790   //   VariableDeclarations ';'
   1791 
   1792   Handle<String> ignore;
   1793   Block* result =
   1794       ParseVariableDeclarations(var_context, NULL, names, &ignore, CHECK_OK);
   1795   ExpectSemicolon(CHECK_OK);
   1796   return result;
   1797 }
   1798 
   1799 
   1800 bool Parser::IsEvalOrArguments(Handle<String> string) {
   1801   return string.is_identical_to(isolate()->factory()->eval_string()) ||
   1802       string.is_identical_to(isolate()->factory()->arguments_string());
   1803 }
   1804 
   1805 
   1806 // If the variable declaration declares exactly one non-const
   1807 // variable, then *out is set to that variable. In all other cases,
   1808 // *out is untouched; in particular, it is the caller's responsibility
   1809 // to initialize it properly. This mechanism is used for the parsing
   1810 // of 'for-in' loops.
   1811 Block* Parser::ParseVariableDeclarations(
   1812     VariableDeclarationContext var_context,
   1813     VariableDeclarationProperties* decl_props,
   1814     ZoneStringList* names,
   1815     Handle<String>* out,
   1816     bool* ok) {
   1817   // VariableDeclarations ::
   1818   //   ('var' | 'const' | 'let') (Identifier ('=' AssignmentExpression)?)+[',']
   1819   //
   1820   // The ES6 Draft Rev3 specifies the following grammar for const declarations
   1821   //
   1822   // ConstDeclaration ::
   1823   //   const ConstBinding (',' ConstBinding)* ';'
   1824   // ConstBinding ::
   1825   //   Identifier '=' AssignmentExpression
   1826   //
   1827   // TODO(ES6):
   1828   // ConstBinding ::
   1829   //   BindingPattern '=' AssignmentExpression
   1830   VariableMode mode = VAR;
   1831   // True if the binding needs initialization. 'let' and 'const' declared
   1832   // bindings are created uninitialized by their declaration nodes and
   1833   // need initialization. 'var' declared bindings are always initialized
   1834   // immediately by their declaration nodes.
   1835   bool needs_init = false;
   1836   bool is_const = false;
   1837   Token::Value init_op = Token::INIT_VAR;
   1838   if (peek() == Token::VAR) {
   1839     Consume(Token::VAR);
   1840   } else if (peek() == Token::CONST) {
   1841     // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads:
   1842     //
   1843     // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
   1844     //
   1845     // * It is a Syntax Error if the code that matches this production is not
   1846     //   contained in extended code.
   1847     //
   1848     // However disallowing const in classic mode will break compatibility with
   1849     // existing pages. Therefore we keep allowing const with the old
   1850     // non-harmony semantics in classic mode.
   1851     Consume(Token::CONST);
   1852     switch (top_scope_->language_mode()) {
   1853       case CLASSIC_MODE:
   1854         mode = CONST;
   1855         init_op = Token::INIT_CONST;
   1856         break;
   1857       case STRICT_MODE:
   1858         ReportMessage("strict_const", Vector<const char*>::empty());
   1859         *ok = false;
   1860         return NULL;
   1861       case EXTENDED_MODE:
   1862         if (var_context == kStatement) {
   1863           // In extended mode 'const' declarations are only allowed in source
   1864           // element positions.
   1865           ReportMessage("unprotected_const", Vector<const char*>::empty());
   1866           *ok = false;
   1867           return NULL;
   1868         }
   1869         mode = CONST_HARMONY;
   1870         init_op = Token::INIT_CONST_HARMONY;
   1871     }
   1872     is_const = true;
   1873     needs_init = true;
   1874   } else if (peek() == Token::LET) {
   1875     // ES6 Draft Rev4 section 12.2.1:
   1876     //
   1877     // LetDeclaration : let LetBindingList ;
   1878     //
   1879     // * It is a Syntax Error if the code that matches this production is not
   1880     //   contained in extended code.
   1881     if (!is_extended_mode()) {
   1882       ReportMessage("illegal_let", Vector<const char*>::empty());
   1883       *ok = false;
   1884       return NULL;
   1885     }
   1886     Consume(Token::LET);
   1887     if (var_context == kStatement) {
   1888       // Let declarations are only allowed in source element positions.
   1889       ReportMessage("unprotected_let", Vector<const char*>::empty());
   1890       *ok = false;
   1891       return NULL;
   1892     }
   1893     mode = LET;
   1894     needs_init = true;
   1895     init_op = Token::INIT_LET;
   1896   } else {
   1897     UNREACHABLE();  // by current callers
   1898   }
   1899 
   1900   Scope* declaration_scope = DeclarationScope(mode);
   1901 
   1902   // The scope of a var/const declared variable anywhere inside a function
   1903   // is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). Thus we can
   1904   // transform a source-level var/const declaration into a (Function)
   1905   // Scope declaration, and rewrite the source-level initialization into an
   1906   // assignment statement. We use a block to collect multiple assignments.
   1907   //
   1908   // We mark the block as initializer block because we don't want the
   1909   // rewriter to add a '.result' assignment to such a block (to get compliant
   1910   // behavior for code such as print(eval('var x = 7')), and for cosmetic
   1911   // reasons when pretty-printing. Also, unless an assignment (initialization)
   1912   // is inside an initializer block, it is ignored.
   1913   //
   1914   // Create new block with one expected declaration.
   1915   Block* block = factory()->NewBlock(NULL, 1, true);
   1916   int nvars = 0;  // the number of variables declared
   1917   Handle<String> name;
   1918   do {
   1919     if (fni_ != NULL) fni_->Enter();
   1920 
   1921     // Parse variable name.
   1922     if (nvars > 0) Consume(Token::COMMA);
   1923     name = ParseIdentifier(CHECK_OK);
   1924     if (fni_ != NULL) fni_->PushVariableName(name);
   1925 
   1926     // Strict mode variables may not be named eval or arguments
   1927     if (!declaration_scope->is_classic_mode() && IsEvalOrArguments(name)) {
   1928       ReportMessage("strict_var_name", Vector<const char*>::empty());
   1929       *ok = false;
   1930       return NULL;
   1931     }
   1932 
   1933     // Declare variable.
   1934     // Note that we *always* must treat the initial value via a separate init
   1935     // assignment for variables and constants because the value must be assigned
   1936     // when the variable is encountered in the source. But the variable/constant
   1937     // is declared (and set to 'undefined') upon entering the function within
   1938     // which the variable or constant is declared. Only function variables have
   1939     // an initial value in the declaration (because they are initialized upon
   1940     // entering the function).
   1941     //
   1942     // If we have a const declaration, in an inner scope, the proxy is always
   1943     // bound to the declared variable (independent of possibly surrounding with
   1944     // statements).
   1945     // For let/const declarations in harmony mode, we can also immediately
   1946     // pre-resolve the proxy because it resides in the same scope as the
   1947     // declaration.
   1948     Interface* interface =
   1949         is_const ? Interface::NewConst() : Interface::NewValue();
   1950     VariableProxy* proxy = NewUnresolved(name, mode, interface);
   1951     Declaration* declaration =
   1952         factory()->NewVariableDeclaration(proxy, mode, top_scope_);
   1953     Declare(declaration, mode != VAR, CHECK_OK);
   1954     nvars++;
   1955     if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) {
   1956       ReportMessageAt(scanner().location(), "too_many_variables",
   1957                       Vector<const char*>::empty());
   1958       *ok = false;
   1959       return NULL;
   1960     }
   1961     if (names) names->Add(name, zone());
   1962 
   1963     // Parse initialization expression if present and/or needed. A
   1964     // declaration of the form:
   1965     //
   1966     //    var v = x;
   1967     //
   1968     // is syntactic sugar for:
   1969     //
   1970     //    var v; v = x;
   1971     //
   1972     // In particular, we need to re-lookup 'v' (in top_scope_, not
   1973     // declaration_scope) as it may be a different 'v' than the 'v' in the
   1974     // declaration (e.g., if we are inside a 'with' statement or 'catch'
   1975     // block).
   1976     //
   1977     // However, note that const declarations are different! A const
   1978     // declaration of the form:
   1979     //
   1980     //   const c = x;
   1981     //
   1982     // is *not* syntactic sugar for:
   1983     //
   1984     //   const c; c = x;
   1985     //
   1986     // The "variable" c initialized to x is the same as the declared
   1987     // one - there is no re-lookup (see the last parameter of the
   1988     // Declare() call above).
   1989 
   1990     Scope* initialization_scope = is_const ? declaration_scope : top_scope_;
   1991     Expression* value = NULL;
   1992     int position = -1;
   1993     // Harmony consts have non-optional initializers.
   1994     if (peek() == Token::ASSIGN || mode == CONST_HARMONY) {
   1995       Expect(Token::ASSIGN, CHECK_OK);
   1996       position = scanner().location().beg_pos;
   1997       value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
   1998       // Don't infer if it is "a = function(){...}();"-like expression.
   1999       if (fni_ != NULL &&
   2000           value->AsCall() == NULL &&
   2001           value->AsCallNew() == NULL) {
   2002         fni_->Infer();
   2003       } else {
   2004         fni_->RemoveLastFunction();
   2005       }
   2006       if (decl_props != NULL) *decl_props = kHasInitializers;
   2007     }
   2008 
   2009     // Record the end position of the initializer.
   2010     if (proxy->var() != NULL) {
   2011       proxy->var()->set_initializer_position(scanner().location().end_pos);
   2012     }
   2013 
   2014     // Make sure that 'const x' and 'let x' initialize 'x' to undefined.
   2015     if (value == NULL && needs_init) {
   2016       value = GetLiteralUndefined();
   2017     }
   2018 
   2019     // Global variable declarations must be compiled in a specific
   2020     // way. When the script containing the global variable declaration
   2021     // is entered, the global variable must be declared, so that if it
   2022     // doesn't exist (on the global object itself, see ES5 errata) it
   2023     // gets created with an initial undefined value. This is handled
   2024     // by the declarations part of the function representing the
   2025     // top-level global code; see Runtime::DeclareGlobalVariable. If
   2026     // it already exists (in the object or in a prototype), it is
   2027     // *not* touched until the variable declaration statement is
   2028     // executed.
   2029     //
   2030     // Executing the variable declaration statement will always
   2031     // guarantee to give the global object a "local" variable; a
   2032     // variable defined in the global object and not in any
   2033     // prototype. This way, global variable declarations can shadow
   2034     // properties in the prototype chain, but only after the variable
   2035     // declaration statement has been executed. This is important in
   2036     // browsers where the global object (window) has lots of
   2037     // properties defined in prototype objects.
   2038     if (initialization_scope->is_global_scope() &&
   2039         !IsLexicalVariableMode(mode)) {
   2040       // Compute the arguments for the runtime call.
   2041       ZoneList<Expression*>* arguments =
   2042           new(zone()) ZoneList<Expression*>(3, zone());
   2043       // We have at least 1 parameter.
   2044       arguments->Add(factory()->NewLiteral(name), zone());
   2045       CallRuntime* initialize;
   2046 
   2047       if (is_const) {
   2048         arguments->Add(value, zone());
   2049         value = NULL;  // zap the value to avoid the unnecessary assignment
   2050 
   2051         // Construct the call to Runtime_InitializeConstGlobal
   2052         // and add it to the initialization statement block.
   2053         // Note that the function does different things depending on
   2054         // the number of arguments (1 or 2).
   2055         initialize = factory()->NewCallRuntime(
   2056             isolate()->factory()->InitializeConstGlobal_string(),
   2057             Runtime::FunctionForId(Runtime::kInitializeConstGlobal),
   2058             arguments);
   2059       } else {
   2060         // Add strict mode.
   2061         // We may want to pass singleton to avoid Literal allocations.
   2062         LanguageMode language_mode = initialization_scope->language_mode();
   2063         arguments->Add(factory()->NewNumberLiteral(language_mode), zone());
   2064 
   2065         // Be careful not to assign a value to the global variable if
   2066         // we're in a with. The initialization value should not
   2067         // necessarily be stored in the global object in that case,
   2068         // which is why we need to generate a separate assignment node.
   2069         if (value != NULL && !inside_with()) {
   2070           arguments->Add(value, zone());
   2071           value = NULL;  // zap the value to avoid the unnecessary assignment
   2072         }
   2073 
   2074         // Construct the call to Runtime_InitializeVarGlobal
   2075         // and add it to the initialization statement block.
   2076         // Note that the function does different things depending on
   2077         // the number of arguments (2 or 3).
   2078         initialize = factory()->NewCallRuntime(
   2079             isolate()->factory()->InitializeVarGlobal_string(),
   2080             Runtime::FunctionForId(Runtime::kInitializeVarGlobal),
   2081             arguments);
   2082       }
   2083 
   2084       block->AddStatement(factory()->NewExpressionStatement(initialize),
   2085                           zone());
   2086     } else if (needs_init) {
   2087       // Constant initializations always assign to the declared constant which
   2088       // is always at the function scope level. This is only relevant for
   2089       // dynamically looked-up variables and constants (the start context for
   2090       // constant lookups is always the function context, while it is the top
   2091       // context for var declared variables). Sigh...
   2092       // For 'let' and 'const' declared variables in harmony mode the
   2093       // initialization also always assigns to the declared variable.
   2094       ASSERT(proxy != NULL);
   2095       ASSERT(proxy->var() != NULL);
   2096       ASSERT(value != NULL);
   2097       Assignment* assignment =
   2098           factory()->NewAssignment(init_op, proxy, value, position);
   2099       block->AddStatement(factory()->NewExpressionStatement(assignment),
   2100                           zone());
   2101       value = NULL;
   2102     }
   2103 
   2104     // Add an assignment node to the initialization statement block if we still
   2105     // have a pending initialization value.
   2106     if (value != NULL) {
   2107       ASSERT(mode == VAR);
   2108       // 'var' initializations are simply assignments (with all the consequences
   2109       // if they are inside a 'with' statement - they may change a 'with' object
   2110       // property).
   2111       VariableProxy* proxy =
   2112           initialization_scope->NewUnresolved(factory(), name, interface);
   2113       Assignment* assignment =
   2114           factory()->NewAssignment(init_op, proxy, value, position);
   2115       block->AddStatement(factory()->NewExpressionStatement(assignment),
   2116                           zone());
   2117     }
   2118 
   2119     if (fni_ != NULL) fni_->Leave();
   2120   } while (peek() == Token::COMMA);
   2121 
   2122   // If there was a single non-const declaration, return it in the output
   2123   // parameter for possible use by for/in.
   2124   if (nvars == 1 && !is_const) {
   2125     *out = name;
   2126   }
   2127 
   2128   return block;
   2129 }
   2130 
   2131 
   2132 static bool ContainsLabel(ZoneStringList* labels, Handle<String> label) {
   2133   ASSERT(!label.is_null());
   2134   if (labels != NULL)
   2135     for (int i = labels->length(); i-- > 0; )
   2136       if (labels->at(i).is_identical_to(label))
   2137         return true;
   2138 
   2139   return false;
   2140 }
   2141 
   2142 
   2143 Statement* Parser::ParseExpressionOrLabelledStatement(ZoneStringList* labels,
   2144                                                       bool* ok) {
   2145   // ExpressionStatement | LabelledStatement ::
   2146   //   Expression ';'
   2147   //   Identifier ':' Statement
   2148   bool starts_with_idenfifier = peek_any_identifier();
   2149   Expression* expr = ParseExpression(true, CHECK_OK);
   2150   if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL &&
   2151       expr->AsVariableProxy() != NULL &&
   2152       !expr->AsVariableProxy()->is_this()) {
   2153     // Expression is a single identifier, and not, e.g., a parenthesized
   2154     // identifier.
   2155     VariableProxy* var = expr->AsVariableProxy();
   2156     Handle<String> label = var->name();
   2157     // TODO(1240780): We don't check for redeclaration of labels
   2158     // during preparsing since keeping track of the set of active
   2159     // labels requires nontrivial changes to the way scopes are
   2160     // structured.  However, these are probably changes we want to
   2161     // make later anyway so we should go back and fix this then.
   2162     if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) {
   2163       SmartArrayPointer<char> c_string = label->ToCString(DISALLOW_NULLS);
   2164       const char* elms[2] = { "Label", *c_string };
   2165       Vector<const char*> args(elms, 2);
   2166       ReportMessage("redeclaration", args);
   2167       *ok = false;
   2168       return NULL;
   2169     }
   2170     if (labels == NULL) {
   2171       labels = new(zone()) ZoneStringList(4, zone());
   2172     }
   2173     labels->Add(label, zone());
   2174     // Remove the "ghost" variable that turned out to be a label
   2175     // from the top scope. This way, we don't try to resolve it
   2176     // during the scope processing.
   2177     top_scope_->RemoveUnresolved(var);
   2178     Expect(Token::COLON, CHECK_OK);
   2179     return ParseStatement(labels, ok);
   2180   }
   2181 
   2182   // If we have an extension, we allow a native function declaration.
   2183   // A native function declaration starts with "native function" with
   2184   // no line-terminator between the two words.
   2185   if (extension_ != NULL &&
   2186       peek() == Token::FUNCTION &&
   2187       !scanner().HasAnyLineTerminatorBeforeNext() &&
   2188       expr != NULL &&
   2189       expr->AsVariableProxy() != NULL &&
   2190       expr->AsVariableProxy()->name()->Equals(
   2191           isolate()->heap()->native_string()) &&
   2192       !scanner().literal_contains_escapes()) {
   2193     return ParseNativeDeclaration(ok);
   2194   }
   2195 
   2196   // Parsed expression statement, or the context-sensitive 'module' keyword.
   2197   // Only expect semicolon in the former case.
   2198   if (!FLAG_harmony_modules ||
   2199       peek() != Token::IDENTIFIER ||
   2200       scanner().HasAnyLineTerminatorBeforeNext() ||
   2201       expr->AsVariableProxy() == NULL ||
   2202       !expr->AsVariableProxy()->name()->Equals(
   2203           isolate()->heap()->module_string()) ||
   2204       scanner().literal_contains_escapes()) {
   2205     ExpectSemicolon(CHECK_OK);
   2206   }
   2207   return factory()->NewExpressionStatement(expr);
   2208 }
   2209 
   2210 
   2211 IfStatement* Parser::ParseIfStatement(ZoneStringList* labels, bool* ok) {
   2212   // IfStatement ::
   2213   //   'if' '(' Expression ')' Statement ('else' Statement)?
   2214 
   2215   Expect(Token::IF, CHECK_OK);
   2216   Expect(Token::LPAREN, CHECK_OK);
   2217   Expression* condition = ParseExpression(true, CHECK_OK);
   2218   Expect(Token::RPAREN, CHECK_OK);
   2219   Statement* then_statement = ParseStatement(labels, CHECK_OK);
   2220   Statement* else_statement = NULL;
   2221   if (peek() == Token::ELSE) {
   2222     Next();
   2223     else_statement = ParseStatement(labels, CHECK_OK);
   2224   } else {
   2225     else_statement = factory()->NewEmptyStatement();
   2226   }
   2227   return factory()->NewIfStatement(condition, then_statement, else_statement);
   2228 }
   2229 
   2230 
   2231 Statement* Parser::ParseContinueStatement(bool* ok) {
   2232   // ContinueStatement ::
   2233   //   'continue' Identifier? ';'
   2234 
   2235   Expect(Token::CONTINUE, CHECK_OK);
   2236   Handle<String> label = Handle<String>::null();
   2237   Token::Value tok = peek();
   2238   if (!scanner().HasAnyLineTerminatorBeforeNext() &&
   2239       tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) {
   2240     label = ParseIdentifier(CHECK_OK);
   2241   }
   2242   IterationStatement* target = NULL;
   2243   target = LookupContinueTarget(label, CHECK_OK);
   2244   if (target == NULL) {
   2245     // Illegal continue statement.
   2246     const char* message = "illegal_continue";
   2247     Vector<Handle<String> > args;
   2248     if (!label.is_null()) {
   2249       message = "unknown_label";
   2250       args = Vector<Handle<String> >(&label, 1);
   2251     }
   2252     ReportMessageAt(scanner().location(), message, args);
   2253     *ok = false;
   2254     return NULL;
   2255   }
   2256   ExpectSemicolon(CHECK_OK);
   2257   return factory()->NewContinueStatement(target);
   2258 }
   2259 
   2260 
   2261 Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) {
   2262   // BreakStatement ::
   2263   //   'break' Identifier? ';'
   2264 
   2265   Expect(Token::BREAK, CHECK_OK);
   2266   Handle<String> label;
   2267   Token::Value tok = peek();
   2268   if (!scanner().HasAnyLineTerminatorBeforeNext() &&
   2269       tok != Token::SEMICOLON && tok != Token::RBRACE && tok != Token::EOS) {
   2270     label = ParseIdentifier(CHECK_OK);
   2271   }
   2272   // Parse labeled break statements that target themselves into
   2273   // empty statements, e.g. 'l1: l2: l3: break l2;'
   2274   if (!label.is_null() && ContainsLabel(labels, label)) {
   2275     ExpectSemicolon(CHECK_OK);
   2276     return factory()->NewEmptyStatement();
   2277   }
   2278   BreakableStatement* target = NULL;
   2279   target = LookupBreakTarget(label, CHECK_OK);
   2280   if (target == NULL) {
   2281     // Illegal break statement.
   2282     const char* message = "illegal_break";
   2283     Vector<Handle<String> > args;
   2284     if (!label.is_null()) {
   2285       message = "unknown_label";
   2286       args = Vector<Handle<String> >(&label, 1);
   2287     }
   2288     ReportMessageAt(scanner().location(), message, args);
   2289     *ok = false;
   2290     return NULL;
   2291   }
   2292   ExpectSemicolon(CHECK_OK);
   2293   return factory()->NewBreakStatement(target);
   2294 }
   2295 
   2296 
   2297 Statement* Parser::ParseReturnStatement(bool* ok) {
   2298   // ReturnStatement ::
   2299   //   'return' Expression? ';'
   2300 
   2301   // Consume the return token. It is necessary to do the before
   2302   // reporting any errors on it, because of the way errors are
   2303   // reported (underlining).
   2304   Expect(Token::RETURN, CHECK_OK);
   2305 
   2306   Token::Value tok = peek();
   2307   Statement* result;
   2308   Expression* return_value;
   2309   if (scanner().HasAnyLineTerminatorBeforeNext() ||
   2310       tok == Token::SEMICOLON ||
   2311       tok == Token::RBRACE ||
   2312       tok == Token::EOS) {
   2313     return_value = GetLiteralUndefined();
   2314   } else {
   2315     return_value = ParseExpression(true, CHECK_OK);
   2316   }
   2317   ExpectSemicolon(CHECK_OK);
   2318   if (is_generator()) {
   2319     Expression* generator = factory()->NewVariableProxy(
   2320         current_function_state_->generator_object_variable());
   2321     Expression* yield = factory()->NewYield(
   2322         generator, return_value, Yield::FINAL, RelocInfo::kNoPosition);
   2323     result = factory()->NewExpressionStatement(yield);
   2324   } else {
   2325     result = factory()->NewReturnStatement(return_value);
   2326   }
   2327 
   2328   // An ECMAScript program is considered syntactically incorrect if it
   2329   // contains a return statement that is not within the body of a
   2330   // function. See ECMA-262, section 12.9, page 67.
   2331   //
   2332   // To be consistent with KJS we report the syntax error at runtime.
   2333   Scope* declaration_scope = top_scope_->DeclarationScope();
   2334   if (declaration_scope->is_global_scope() ||
   2335       declaration_scope->is_eval_scope()) {
   2336     Handle<String> message = isolate()->factory()->illegal_return_string();
   2337     Expression* throw_error =
   2338         NewThrowSyntaxError(message, Handle<Object>::null());
   2339     return factory()->NewExpressionStatement(throw_error);
   2340   }
   2341   return result;
   2342 }
   2343 
   2344 
   2345 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) {
   2346   // WithStatement ::
   2347   //   'with' '(' Expression ')' Statement
   2348 
   2349   Expect(Token::WITH, CHECK_OK);
   2350 
   2351   if (!top_scope_->is_classic_mode()) {
   2352     ReportMessage("strict_mode_with", Vector<const char*>::empty());
   2353     *ok = false;
   2354     return NULL;
   2355   }
   2356 
   2357   Expect(Token::LPAREN, CHECK_OK);
   2358   Expression* expr = ParseExpression(true, CHECK_OK);
   2359   Expect(Token::RPAREN, CHECK_OK);
   2360 
   2361   top_scope_->DeclarationScope()->RecordWithStatement();
   2362   Scope* with_scope = NewScope(top_scope_, WITH_SCOPE);
   2363   Statement* stmt;
   2364   { BlockState block_state(this, with_scope);
   2365     with_scope->set_start_position(scanner().peek_location().beg_pos);
   2366     stmt = ParseStatement(labels, CHECK_OK);
   2367     with_scope->set_end_position(scanner().location().end_pos);
   2368   }
   2369   return factory()->NewWithStatement(with_scope, expr, stmt);
   2370 }
   2371 
   2372 
   2373 CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) {
   2374   // CaseClause ::
   2375   //   'case' Expression ':' Statement*
   2376   //   'default' ':' Statement*
   2377 
   2378   Expression* label = NULL;  // NULL expression indicates default case
   2379   if (peek() == Token::CASE) {
   2380     Expect(Token::CASE, CHECK_OK);
   2381     label = ParseExpression(true, CHECK_OK);
   2382   } else {
   2383     Expect(Token::DEFAULT, CHECK_OK);
   2384     if (*default_seen_ptr) {
   2385       ReportMessage("multiple_defaults_in_switch",
   2386                     Vector<const char*>::empty());
   2387       *ok = false;
   2388       return NULL;
   2389     }
   2390     *default_seen_ptr = true;
   2391   }
   2392   Expect(Token::COLON, CHECK_OK);
   2393   int pos = scanner().location().beg_pos;
   2394   ZoneList<Statement*>* statements =
   2395       new(zone()) ZoneList<Statement*>(5, zone());
   2396   while (peek() != Token::CASE &&
   2397          peek() != Token::DEFAULT &&
   2398          peek() != Token::RBRACE) {
   2399     Statement* stat = ParseStatement(NULL, CHECK_OK);
   2400     statements->Add(stat, zone());
   2401   }
   2402 
   2403   return new(zone()) CaseClause(isolate(), label, statements, pos);
   2404 }
   2405 
   2406 
   2407 SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels,
   2408                                               bool* ok) {
   2409   // SwitchStatement ::
   2410   //   'switch' '(' Expression ')' '{' CaseClause* '}'
   2411 
   2412   SwitchStatement* statement = factory()->NewSwitchStatement(labels);
   2413   Target target(&this->target_stack_, statement);
   2414 
   2415   Expect(Token::SWITCH, CHECK_OK);
   2416   Expect(Token::LPAREN, CHECK_OK);
   2417   Expression* tag = ParseExpression(true, CHECK_OK);
   2418   Expect(Token::RPAREN, CHECK_OK);
   2419 
   2420   bool default_seen = false;
   2421   ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4, zone());
   2422   Expect(Token::LBRACE, CHECK_OK);
   2423   while (peek() != Token::RBRACE) {
   2424     CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK);
   2425     cases->Add(clause, zone());
   2426   }
   2427   Expect(Token::RBRACE, CHECK_OK);
   2428 
   2429   if (statement) statement->Initialize(tag, cases);
   2430   return statement;
   2431 }
   2432 
   2433 
   2434 Statement* Parser::ParseThrowStatement(bool* ok) {
   2435   // ThrowStatement ::
   2436   //   'throw' Expression ';'
   2437 
   2438   Expect(Token::THROW, CHECK_OK);
   2439   int pos = scanner().location().beg_pos;
   2440   if (scanner().HasAnyLineTerminatorBeforeNext()) {
   2441     ReportMessage("newline_after_throw", Vector<const char*>::empty());
   2442     *ok = false;
   2443     return NULL;
   2444   }
   2445   Expression* exception = ParseExpression(true, CHECK_OK);
   2446   ExpectSemicolon(CHECK_OK);
   2447 
   2448   return factory()->NewExpressionStatement(factory()->NewThrow(exception, pos));
   2449 }
   2450 
   2451 
   2452 TryStatement* Parser::ParseTryStatement(bool* ok) {
   2453   // TryStatement ::
   2454   //   'try' Block Catch
   2455   //   'try' Block Finally
   2456   //   'try' Block Catch Finally
   2457   //
   2458   // Catch ::
   2459   //   'catch' '(' Identifier ')' Block
   2460   //
   2461   // Finally ::
   2462   //   'finally' Block
   2463 
   2464   Expect(Token::TRY, CHECK_OK);
   2465 
   2466   TargetCollector try_collector(zone());
   2467   Block* try_block;
   2468 
   2469   { Target target(&this->target_stack_, &try_collector);
   2470     try_block = ParseBlock(NULL, CHECK_OK);
   2471   }
   2472 
   2473   Token::Value tok = peek();
   2474   if (tok != Token::CATCH && tok != Token::FINALLY) {
   2475     ReportMessage("no_catch_or_finally", Vector<const char*>::empty());
   2476     *ok = false;
   2477     return NULL;
   2478   }
   2479 
   2480   // If we can break out from the catch block and there is a finally block,
   2481   // then we will need to collect escaping targets from the catch
   2482   // block. Since we don't know yet if there will be a finally block, we
   2483   // always collect the targets.
   2484   TargetCollector catch_collector(zone());
   2485   Scope* catch_scope = NULL;
   2486   Variable* catch_variable = NULL;
   2487   Block* catch_block = NULL;
   2488   Handle<String> name;
   2489   if (tok == Token::CATCH) {
   2490     Consume(Token::CATCH);
   2491 
   2492     Expect(Token::LPAREN, CHECK_OK);
   2493     catch_scope = NewScope(top_scope_, CATCH_SCOPE);
   2494     catch_scope->set_start_position(scanner().location().beg_pos);
   2495     name = ParseIdentifier(CHECK_OK);
   2496 
   2497     if (!top_scope_->is_classic_mode() && IsEvalOrArguments(name)) {
   2498       ReportMessage("strict_catch_variable", Vector<const char*>::empty());
   2499       *ok = false;
   2500       return NULL;
   2501     }
   2502 
   2503     Expect(Token::RPAREN, CHECK_OK);
   2504 
   2505     if (peek() == Token::LBRACE) {
   2506       Target target(&this->target_stack_, &catch_collector);
   2507       VariableMode mode = is_extended_mode() ? LET : VAR;
   2508       catch_variable =
   2509           catch_scope->DeclareLocal(name, mode, kCreatedInitialized);
   2510 
   2511       BlockState block_state(this, catch_scope);
   2512       catch_block = ParseBlock(NULL, CHECK_OK);
   2513     } else {
   2514       Expect(Token::LBRACE, CHECK_OK);
   2515     }
   2516     catch_scope->set_end_position(scanner().location().end_pos);
   2517     tok = peek();
   2518   }
   2519 
   2520   Block* finally_block = NULL;
   2521   if (tok == Token::FINALLY || catch_block == NULL) {
   2522     Consume(Token::FINALLY);
   2523     finally_block = ParseBlock(NULL, CHECK_OK);
   2524   }
   2525 
   2526   // Simplify the AST nodes by converting:
   2527   //   'try B0 catch B1 finally B2'
   2528   // to:
   2529   //   'try { try B0 catch B1 } finally B2'
   2530 
   2531   if (catch_block != NULL && finally_block != NULL) {
   2532     // If we have both, create an inner try/catch.
   2533     ASSERT(catch_scope != NULL && catch_variable != NULL);
   2534     int index = current_function_state_->NextHandlerIndex();
   2535     TryCatchStatement* statement = factory()->NewTryCatchStatement(
   2536         index, try_block, catch_scope, catch_variable, catch_block);
   2537     statement->set_escaping_targets(try_collector.targets());
   2538     try_block = factory()->NewBlock(NULL, 1, false);
   2539     try_block->AddStatement(statement, zone());
   2540     catch_block = NULL;  // Clear to indicate it's been handled.
   2541   }
   2542 
   2543   TryStatement* result = NULL;
   2544   if (catch_block != NULL) {
   2545     ASSERT(finally_block == NULL);
   2546     ASSERT(catch_scope != NULL && catch_variable != NULL);
   2547     int index = current_function_state_->NextHandlerIndex();
   2548     result = factory()->NewTryCatchStatement(
   2549         index, try_block, catch_scope, catch_variable, catch_block);
   2550   } else {
   2551     ASSERT(finally_block != NULL);
   2552     int index = current_function_state_->NextHandlerIndex();
   2553     result = factory()->NewTryFinallyStatement(index, try_block, finally_block);
   2554     // Combine the jump targets of the try block and the possible catch block.
   2555     try_collector.targets()->AddAll(*catch_collector.targets(), zone());
   2556   }
   2557 
   2558   result->set_escaping_targets(try_collector.targets());
   2559   return result;
   2560 }
   2561 
   2562 
   2563 DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels,
   2564                                                 bool* ok) {
   2565   // DoStatement ::
   2566   //   'do' Statement 'while' '(' Expression ')' ';'
   2567 
   2568   DoWhileStatement* loop = factory()->NewDoWhileStatement(labels);
   2569   Target target(&this->target_stack_, loop);
   2570 
   2571   Expect(Token::DO, CHECK_OK);
   2572   Statement* body = ParseStatement(NULL, CHECK_OK);
   2573   Expect(Token::WHILE, CHECK_OK);
   2574   Expect(Token::LPAREN, CHECK_OK);
   2575 
   2576   if (loop != NULL) {
   2577     int position = scanner().location().beg_pos;
   2578     loop->set_condition_position(position);
   2579   }
   2580 
   2581   Expression* cond = ParseExpression(true, CHECK_OK);
   2582   Expect(Token::RPAREN, CHECK_OK);
   2583 
   2584   // Allow do-statements to be terminated with and without
   2585   // semi-colons. This allows code such as 'do;while(0)return' to
   2586   // parse, which would not be the case if we had used the
   2587   // ExpectSemicolon() functionality here.
   2588   if (peek() == Token::SEMICOLON) Consume(Token::SEMICOLON);
   2589 
   2590   if (loop != NULL) loop->Initialize(cond, body);
   2591   return loop;
   2592 }
   2593 
   2594 
   2595 WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) {
   2596   // WhileStatement ::
   2597   //   'while' '(' Expression ')' Statement
   2598 
   2599   WhileStatement* loop = factory()->NewWhileStatement(labels);
   2600   Target target(&this->target_stack_, loop);
   2601 
   2602   Expect(Token::WHILE, CHECK_OK);
   2603   Expect(Token::LPAREN, CHECK_OK);
   2604   Expression* cond = ParseExpression(true, CHECK_OK);
   2605   Expect(Token::RPAREN, CHECK_OK);
   2606   Statement* body = ParseStatement(NULL, CHECK_OK);
   2607 
   2608   if (loop != NULL) loop->Initialize(cond, body);
   2609   return loop;
   2610 }
   2611 
   2612 
   2613 bool Parser::CheckInOrOf(bool accept_OF,
   2614                          ForEachStatement::VisitMode* visit_mode) {
   2615   if (Check(Token::IN)) {
   2616     *visit_mode = ForEachStatement::ENUMERATE;
   2617     return true;
   2618   } else if (allow_for_of() && accept_OF &&
   2619              CheckContextualKeyword(CStrVector("of"))) {
   2620     *visit_mode = ForEachStatement::ITERATE;
   2621     return true;
   2622   }
   2623   return false;
   2624 }
   2625 
   2626 
   2627 void Parser::InitializeForEachStatement(ForEachStatement* stmt,
   2628                                         Expression* each,
   2629                                         Expression* subject,
   2630                                         Statement* body) {
   2631   ForOfStatement* for_of = stmt->AsForOfStatement();
   2632 
   2633   if (for_of != NULL) {
   2634     Factory* heap_factory = isolate()->factory();
   2635     Handle<String> iterator_str = heap_factory->InternalizeOneByteString(
   2636         STATIC_ASCII_VECTOR(".iterator"));
   2637     Handle<String> result_str = heap_factory->InternalizeOneByteString(
   2638         STATIC_ASCII_VECTOR(".result"));
   2639     Variable* iterator =
   2640         top_scope_->DeclarationScope()->NewTemporary(iterator_str);
   2641     Variable* result = top_scope_->DeclarationScope()->NewTemporary(result_str);
   2642 
   2643     Expression* assign_iterator;
   2644     Expression* next_result;
   2645     Expression* result_done;
   2646     Expression* assign_each;
   2647 
   2648     // var iterator = iterable;
   2649     {
   2650       Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
   2651       assign_iterator = factory()->NewAssignment(
   2652           Token::ASSIGN, iterator_proxy, subject, RelocInfo::kNoPosition);
   2653     }
   2654 
   2655     // var result = iterator.next();
   2656     {
   2657       Expression* iterator_proxy = factory()->NewVariableProxy(iterator);
   2658       Expression* next_literal =
   2659           factory()->NewLiteral(heap_factory->next_string());
   2660       Expression* next_property = factory()->NewProperty(
   2661           iterator_proxy, next_literal, RelocInfo::kNoPosition);
   2662       ZoneList<Expression*>* next_arguments =
   2663           new(zone()) ZoneList<Expression*>(0, zone());
   2664       Expression* next_call = factory()->NewCall(
   2665           next_property, next_arguments, RelocInfo::kNoPosition);
   2666       Expression* result_proxy = factory()->NewVariableProxy(result);
   2667       next_result = factory()->NewAssignment(
   2668           Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition);
   2669     }
   2670 
   2671     // result.done
   2672     {
   2673       Expression* done_literal =
   2674           factory()->NewLiteral(heap_factory->done_string());
   2675       Expression* result_proxy = factory()->NewVariableProxy(result);
   2676       result_done = factory()->NewProperty(
   2677           result_proxy, done_literal, RelocInfo::kNoPosition);
   2678     }
   2679 
   2680     // each = result.value
   2681     {
   2682       Expression* value_literal =
   2683           factory()->NewLiteral(heap_factory->value_string());
   2684       Expression* result_proxy = factory()->NewVariableProxy(result);
   2685       Expression* result_value = factory()->NewProperty(
   2686           result_proxy, value_literal, RelocInfo::kNoPosition);
   2687       assign_each = factory()->NewAssignment(
   2688           Token::ASSIGN, each, result_value, RelocInfo::kNoPosition);
   2689     }
   2690 
   2691     for_of->Initialize(each, subject, body,
   2692                        assign_iterator, next_result, result_done, assign_each);
   2693   } else {
   2694     stmt->Initialize(each, subject, body);
   2695   }
   2696 }
   2697 
   2698 
   2699 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) {
   2700   // ForStatement ::
   2701   //   'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
   2702 
   2703   Statement* init = NULL;
   2704 
   2705   // Create an in-between scope for let-bound iteration variables.
   2706   Scope* saved_scope = top_scope_;
   2707   Scope* for_scope = NewScope(top_scope_, BLOCK_SCOPE);
   2708   top_scope_ = for_scope;
   2709 
   2710   Expect(Token::FOR, CHECK_OK);
   2711   Expect(Token::LPAREN, CHECK_OK);
   2712   for_scope->set_start_position(scanner().location().beg_pos);
   2713   if (peek() != Token::SEMICOLON) {
   2714     if (peek() == Token::VAR || peek() == Token::CONST) {
   2715       bool is_const = peek() == Token::CONST;
   2716       Handle<String> name;
   2717       VariableDeclarationProperties decl_props = kHasNoInitializers;
   2718       Block* variable_statement =
   2719           ParseVariableDeclarations(kForStatement, &decl_props, NULL, &name,
   2720                                     CHECK_OK);
   2721       bool accept_OF = decl_props == kHasNoInitializers;
   2722       ForEachStatement::VisitMode mode;
   2723 
   2724       if (!name.is_null() && CheckInOrOf(accept_OF, &mode)) {
   2725         Interface* interface =
   2726             is_const ? Interface::NewConst() : Interface::NewValue();
   2727         ForEachStatement* loop = factory()->NewForEachStatement(mode, labels);
   2728         Target target(&this->target_stack_, loop);
   2729 
   2730         Expression* enumerable = ParseExpression(true, CHECK_OK);
   2731         Expect(Token::RPAREN, CHECK_OK);
   2732 
   2733         VariableProxy* each =
   2734             top_scope_->NewUnresolved(factory(), name, interface);
   2735         Statement* body = ParseStatement(NULL, CHECK_OK);
   2736         InitializeForEachStatement(loop, each, enumerable, body);
   2737         Block* result = factory()->NewBlock(NULL, 2, false);
   2738         result->AddStatement(variable_statement, zone());
   2739         result->AddStatement(loop, zone());
   2740         top_scope_ = saved_scope;
   2741         for_scope->set_end_position(scanner().location().end_pos);
   2742         for_scope = for_scope->FinalizeBlockScope();
   2743         ASSERT(for_scope == NULL);
   2744         // Parsed for-in loop w/ variable/const declaration.
   2745         return result;
   2746       } else {
   2747         init = variable_statement;
   2748       }
   2749     } else if (peek() == Token::LET) {
   2750       Handle<String> name;
   2751       VariableDeclarationProperties decl_props = kHasNoInitializers;
   2752       Block* variable_statement =
   2753          ParseVariableDeclarations(kForStatement, &decl_props, NULL, &name,
   2754                                    CHECK_OK);
   2755       bool accept_IN = !name.is_null() && decl_props != kHasInitializers;
   2756       bool accept_OF = decl_props == kHasNoInitializers;
   2757       ForEachStatement::VisitMode mode;
   2758 
   2759       if (accept_IN && CheckInOrOf(accept_OF, &mode)) {
   2760         // Rewrite a for-in statement of the form
   2761         //
   2762         //   for (let x in e) b
   2763         //
   2764         // into
   2765         //
   2766         //   <let x' be a temporary variable>
   2767         //   for (x' in e) {
   2768         //     let x;
   2769         //     x = x';
   2770         //     b;
   2771         //   }
   2772 
   2773         // TODO(keuchel): Move the temporary variable to the block scope, after
   2774         // implementing stack allocated block scoped variables.
   2775         Factory* heap_factory = isolate()->factory();
   2776         Handle<String> tempstr =
   2777             heap_factory->NewConsString(heap_factory->dot_for_string(), name);
   2778         Handle<String> tempname = heap_factory->InternalizeString(tempstr);
   2779         Variable* temp = top_scope_->DeclarationScope()->NewTemporary(tempname);
   2780         VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
   2781         ForEachStatement* loop = factory()->NewForEachStatement(mode, labels);
   2782         Target target(&this->target_stack_, loop);
   2783 
   2784         // The expression does not see the loop variable.
   2785         top_scope_ = saved_scope;
   2786         Expression* enumerable = ParseExpression(true, CHECK_OK);
   2787         top_scope_ = for_scope;
   2788         Expect(Token::RPAREN, CHECK_OK);
   2789 
   2790         VariableProxy* each =
   2791             top_scope_->NewUnresolved(factory(), name, Interface::NewValue());
   2792         Statement* body = ParseStatement(NULL, CHECK_OK);
   2793         Block* body_block = factory()->NewBlock(NULL, 3, false);
   2794         Assignment* assignment = factory()->NewAssignment(
   2795             Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition);
   2796         Statement* assignment_statement =
   2797             factory()->NewExpressionStatement(assignment);
   2798         body_block->AddStatement(variable_statement, zone());
   2799         body_block->AddStatement(assignment_statement, zone());
   2800         body_block->AddStatement(body, zone());
   2801         InitializeForEachStatement(loop, temp_proxy, enumerable, body_block);
   2802         top_scope_ = saved_scope;
   2803         for_scope->set_end_position(scanner().location().end_pos);
   2804         for_scope = for_scope->FinalizeBlockScope();
   2805         body_block->set_scope(for_scope);
   2806         // Parsed for-in loop w/ let declaration.
   2807         return loop;
   2808 
   2809       } else {
   2810         init = variable_statement;
   2811       }
   2812     } else {
   2813       Expression* expression = ParseExpression(false, CHECK_OK);
   2814       ForEachStatement::VisitMode mode;
   2815       bool accept_OF = expression->AsVariableProxy();
   2816 
   2817       if (CheckInOrOf(accept_OF, &mode)) {
   2818         // Signal a reference error if the expression is an invalid
   2819         // left-hand side expression.  We could report this as a syntax
   2820         // error here but for compatibility with JSC we choose to report
   2821         // the error at runtime.
   2822         if (expression == NULL || !expression->IsValidLeftHandSide()) {
   2823           Handle<String> message =
   2824               isolate()->factory()->invalid_lhs_in_for_in_string();
   2825           expression = NewThrowReferenceError(message);
   2826         }
   2827         ForEachStatement* loop = factory()->NewForEachStatement(mode, labels);
   2828         Target target(&this->target_stack_, loop);
   2829 
   2830         Expression* enumerable = ParseExpression(true, CHECK_OK);
   2831         Expect(Token::RPAREN, CHECK_OK);
   2832 
   2833         Statement* body = ParseStatement(NULL, CHECK_OK);
   2834         InitializeForEachStatement(loop, expression, enumerable, body);
   2835         top_scope_ = saved_scope;
   2836         for_scope->set_end_position(scanner().location().end_pos);
   2837         for_scope = for_scope->FinalizeBlockScope();
   2838         ASSERT(for_scope == NULL);
   2839         // Parsed for-in loop.
   2840         return loop;
   2841 
   2842       } else {
   2843         init = factory()->NewExpressionStatement(expression);
   2844       }
   2845     }
   2846   }
   2847 
   2848   // Standard 'for' loop
   2849   ForStatement* loop = factory()->NewForStatement(labels);
   2850   Target target(&this->target_stack_, loop);
   2851 
   2852   // Parsed initializer at this point.
   2853   Expect(Token::SEMICOLON, CHECK_OK);
   2854 
   2855   Expression* cond = NULL;
   2856   if (peek() != Token::SEMICOLON) {
   2857     cond = ParseExpression(true, CHECK_OK);
   2858   }
   2859   Expect(Token::SEMICOLON, CHECK_OK);
   2860 
   2861   Statement* next = NULL;
   2862   if (peek() != Token::RPAREN) {
   2863     Expression* exp = ParseExpression(true, CHECK_OK);
   2864     next = factory()->NewExpressionStatement(exp);
   2865   }
   2866   Expect(Token::RPAREN, CHECK_OK);
   2867 
   2868   Statement* body = ParseStatement(NULL, CHECK_OK);
   2869   top_scope_ = saved_scope;
   2870   for_scope->set_end_position(scanner().location().end_pos);
   2871   for_scope = for_scope->FinalizeBlockScope();
   2872   if (for_scope != NULL) {
   2873     // Rewrite a for statement of the form
   2874     //
   2875     //   for (let x = i; c; n) b
   2876     //
   2877     // into
   2878     //
   2879     //   {
   2880     //     let x = i;
   2881     //     for (; c; n) b
   2882     //   }
   2883     ASSERT(init != NULL);
   2884     Block* result = factory()->NewBlock(NULL, 2, false);
   2885     result->AddStatement(init, zone());
   2886     result->AddStatement(loop, zone());
   2887     result->set_scope(for_scope);
   2888     loop->Initialize(NULL, cond, next, body);
   2889     return result;
   2890   } else {
   2891     loop->Initialize(init, cond, next, body);
   2892     return loop;
   2893   }
   2894 }
   2895 
   2896 
   2897 // Precedence = 1
   2898 Expression* Parser::ParseExpression(bool accept_IN, bool* ok) {
   2899   // Expression ::
   2900   //   AssignmentExpression
   2901   //   Expression ',' AssignmentExpression
   2902 
   2903   Expression* result = ParseAssignmentExpression(accept_IN, CHECK_OK);
   2904   while (peek() == Token::COMMA) {
   2905     Expect(Token::COMMA, CHECK_OK);
   2906     int position = scanner().location().beg_pos;
   2907     Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
   2908     result =
   2909         factory()->NewBinaryOperation(Token::COMMA, result, right, position);
   2910   }
   2911   return result;
   2912 }
   2913 
   2914 
   2915 // Precedence = 2
   2916 Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) {
   2917   // AssignmentExpression ::
   2918   //   ConditionalExpression
   2919   //   YieldExpression
   2920   //   LeftHandSideExpression AssignmentOperator AssignmentExpression
   2921 
   2922   if (peek() == Token::YIELD && is_generator()) {
   2923     return ParseYieldExpression(ok);
   2924   }
   2925 
   2926   if (fni_ != NULL) fni_->Enter();
   2927   Expression* expression = ParseConditionalExpression(accept_IN, CHECK_OK);
   2928 
   2929   if (!Token::IsAssignmentOp(peek())) {
   2930     if (fni_ != NULL) fni_->Leave();
   2931     // Parsed conditional expression only (no assignment).
   2932     return expression;
   2933   }
   2934 
   2935   // Signal a reference error if the expression is an invalid left-hand
   2936   // side expression.  We could report this as a syntax error here but
   2937   // for compatibility with JSC we choose to report the error at
   2938   // runtime.
   2939   // TODO(ES5): Should change parsing for spec conformance.
   2940   if (expression == NULL || !expression->IsValidLeftHandSide()) {
   2941     Handle<String> message =
   2942         isolate()->factory()->invalid_lhs_in_assignment_string();
   2943     expression = NewThrowReferenceError(message);
   2944   }
   2945 
   2946   if (!top_scope_->is_classic_mode()) {
   2947     // Assignment to eval or arguments is disallowed in strict mode.
   2948     CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK);
   2949   }
   2950   MarkAsLValue(expression);
   2951 
   2952   Token::Value op = Next();  // Get assignment operator.
   2953   int pos = scanner().location().beg_pos;
   2954   Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
   2955 
   2956   // TODO(1231235): We try to estimate the set of properties set by
   2957   // constructors. We define a new property whenever there is an
   2958   // assignment to a property of 'this'. We should probably only add
   2959   // properties if we haven't seen them before. Otherwise we'll
   2960   // probably overestimate the number of properties.
   2961   Property* property = expression ? expression->AsProperty() : NULL;
   2962   if (op == Token::ASSIGN &&
   2963       property != NULL &&
   2964       property->obj()->AsVariableProxy() != NULL &&
   2965       property->obj()->AsVariableProxy()->is_this()) {
   2966     current_function_state_->AddProperty();
   2967   }
   2968 
   2969   // If we assign a function literal to a property we pretenure the
   2970   // literal so it can be added as a constant function property.
   2971   if (property != NULL && right->AsFunctionLiteral() != NULL) {
   2972     right->AsFunctionLiteral()->set_pretenure();
   2973   }
   2974 
   2975   if (fni_ != NULL) {
   2976     // Check if the right hand side is a call to avoid inferring a
   2977     // name if we're dealing with "a = function(){...}();"-like
   2978     // expression.
   2979     if ((op == Token::INIT_VAR
   2980          || op == Token::INIT_CONST
   2981          || op == Token::ASSIGN)
   2982         && (right->AsCall() == NULL && right->AsCallNew() == NULL)) {
   2983       fni_->Infer();
   2984     } else {
   2985       fni_->RemoveLastFunction();
   2986     }
   2987     fni_->Leave();
   2988   }
   2989 
   2990   return factory()->NewAssignment(op, expression, right, pos);
   2991 }
   2992 
   2993 
   2994 Expression* Parser::ParseYieldExpression(bool* ok) {
   2995   // YieldExpression ::
   2996   //   'yield' '*'? AssignmentExpression
   2997   int position = scanner().peek_location().beg_pos;
   2998   Expect(Token::YIELD, CHECK_OK);
   2999   Yield::Kind kind =
   3000       Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND;
   3001   Expression* generator_object = factory()->NewVariableProxy(
   3002       current_function_state_->generator_object_variable());
   3003   Expression* expression = ParseAssignmentExpression(false, CHECK_OK);
   3004   Yield* yield =
   3005       factory()->NewYield(generator_object, expression, kind, position);
   3006   if (kind == Yield::DELEGATING) {
   3007     yield->set_index(current_function_state_->NextHandlerIndex());
   3008   }
   3009   return yield;
   3010 }
   3011 
   3012 
   3013 // Precedence = 3
   3014 Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) {
   3015   // ConditionalExpression ::
   3016   //   LogicalOrExpression
   3017   //   LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
   3018 
   3019   // We start using the binary expression parser for prec >= 4 only!
   3020   Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK);
   3021   if (peek() != Token::CONDITIONAL) return expression;
   3022   Consume(Token::CONDITIONAL);
   3023   // In parsing the first assignment expression in conditional
   3024   // expressions we always accept the 'in' keyword; see ECMA-262,
   3025   // section 11.12, page 58.
   3026   int left_position = scanner().peek_location().beg_pos;
   3027   Expression* left = ParseAssignmentExpression(true, CHECK_OK);
   3028   Expect(Token::COLON, CHECK_OK);
   3029   int right_position = scanner().peek_location().beg_pos;
   3030   Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
   3031   return factory()->NewConditional(
   3032       expression, left, right, left_position, right_position);
   3033 }
   3034 
   3035 
   3036 static int Precedence(Token::Value tok, bool accept_IN) {
   3037   if (tok == Token::IN && !accept_IN)
   3038     return 0;  // 0 precedence will terminate binary expression parsing
   3039 
   3040   return Token::Precedence(tok);
   3041 }
   3042 
   3043 
   3044 // Precedence >= 4
   3045 Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) {
   3046   ASSERT(prec >= 4);
   3047   Expression* x = ParseUnaryExpression(CHECK_OK);
   3048   for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
   3049     // prec1 >= 4
   3050     while (Precedence(peek(), accept_IN) == prec1) {
   3051       Token::Value op = Next();
   3052       int position = scanner().location().beg_pos;
   3053       Expression* y = ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
   3054 
   3055       // Compute some expressions involving only number literals.
   3056       if (x && x->AsLiteral() && x->AsLiteral()->value()->IsNumber() &&
   3057           y && y->AsLiteral() && y->AsLiteral()->value()->IsNumber()) {
   3058         double x_val = x->AsLiteral()->value()->Number();
   3059         double y_val = y->AsLiteral()->value()->Number();
   3060 
   3061         switch (op) {
   3062           case Token::ADD:
   3063             x = factory()->NewNumberLiteral(x_val + y_val);
   3064             continue;
   3065           case Token::SUB:
   3066             x = factory()->NewNumberLiteral(x_val - y_val);
   3067             continue;
   3068           case Token::MUL:
   3069             x = factory()->NewNumberLiteral(x_val * y_val);
   3070             continue;
   3071           case Token::DIV:
   3072             x = factory()->NewNumberLiteral(x_val / y_val);
   3073             continue;
   3074           case Token::BIT_OR: {
   3075             int value = DoubleToInt32(x_val) | DoubleToInt32(y_val);
   3076             x = factory()->NewNumberLiteral(value);
   3077             continue;
   3078           }
   3079           case Token::BIT_AND: {
   3080             int value = DoubleToInt32(x_val) & DoubleToInt32(y_val);
   3081             x = factory()->NewNumberLiteral(value);
   3082             continue;
   3083           }
   3084           case Token::BIT_XOR: {
   3085             int value = DoubleToInt32(x_val) ^ DoubleToInt32(y_val);
   3086             x = factory()->NewNumberLiteral(value);
   3087             continue;
   3088           }
   3089           case Token::SHL: {
   3090             int value = DoubleToInt32(x_val) << (DoubleToInt32(y_val) & 0x1f);
   3091             x = factory()->NewNumberLiteral(value);
   3092             continue;
   3093           }
   3094           case Token::SHR: {
   3095             uint32_t shift = DoubleToInt32(y_val) & 0x1f;
   3096             uint32_t value = DoubleToUint32(x_val) >> shift;
   3097             x = factory()->NewNumberLiteral(value);
   3098             continue;
   3099           }
   3100           case Token::SAR: {
   3101             uint32_t shift = DoubleToInt32(y_val) & 0x1f;
   3102             int value = ArithmeticShiftRight(DoubleToInt32(x_val), shift);
   3103             x = factory()->NewNumberLiteral(value);
   3104             continue;
   3105           }
   3106           default:
   3107             break;
   3108         }
   3109       }
   3110 
   3111       // For now we distinguish between comparisons and other binary
   3112       // operations.  (We could combine the two and get rid of this
   3113       // code and AST node eventually.)
   3114       if (Token::IsCompareOp(op)) {
   3115         // We have a comparison.
   3116         Token::Value cmp = op;
   3117         switch (op) {
   3118           case Token::NE: cmp = Token::EQ; break;
   3119           case Token::NE_STRICT: cmp = Token::EQ_STRICT; break;
   3120           default: break;
   3121         }
   3122         x = factory()->NewCompareOperation(cmp, x, y, position);
   3123         if (cmp != op) {
   3124           // The comparison was negated - add a NOT.
   3125           x = factory()->NewUnaryOperation(Token::NOT, x, position);
   3126         }
   3127 
   3128       } else {
   3129         // We have a "normal" binary operation.
   3130         x = factory()->NewBinaryOperation(op, x, y, position);
   3131       }
   3132     }
   3133   }
   3134   return x;
   3135 }
   3136 
   3137 
   3138 Expression* Parser::ParseUnaryExpression(bool* ok) {
   3139   // UnaryExpression ::
   3140   //   PostfixExpression
   3141   //   'delete' UnaryExpression
   3142   //   'void' UnaryExpression
   3143   //   'typeof' UnaryExpression
   3144   //   '++' UnaryExpression
   3145   //   '--' UnaryExpression
   3146   //   '+' UnaryExpression
   3147   //   '-' UnaryExpression
   3148   //   '~' UnaryExpression
   3149   //   '!' UnaryExpression
   3150 
   3151   Token::Value op = peek();
   3152   if (Token::IsUnaryOp(op)) {
   3153     op = Next();
   3154     int position = scanner().location().beg_pos;
   3155     Expression* expression = ParseUnaryExpression(CHECK_OK);
   3156 
   3157     if (expression != NULL && (expression->AsLiteral() != NULL)) {
   3158       Handle<Object> literal = expression->AsLiteral()->value();
   3159       if (op == Token::NOT) {
   3160         // Convert the literal to a boolean condition and negate it.
   3161         bool condition = literal->BooleanValue();
   3162         Handle<Object> result(isolate()->heap()->ToBoolean(!condition),
   3163                               isolate());
   3164         return factory()->NewLiteral(result);
   3165       } else if (literal->IsNumber()) {
   3166         // Compute some expressions involving only number literals.
   3167         double value = literal->Number();
   3168         switch (op) {
   3169           case Token::ADD:
   3170             return expression;
   3171           case Token::SUB:
   3172             return factory()->NewNumberLiteral(-value);
   3173           case Token::BIT_NOT:
   3174             return factory()->NewNumberLiteral(~DoubleToInt32(value));
   3175           default:
   3176             break;
   3177         }
   3178       }
   3179     }
   3180 
   3181     // "delete identifier" is a syntax error in strict mode.
   3182     if (op == Token::DELETE && !top_scope_->is_classic_mode()) {
   3183       VariableProxy* operand = expression->AsVariableProxy();
   3184       if (operand != NULL && !operand->is_this()) {
   3185         ReportMessage("strict_delete", Vector<const char*>::empty());
   3186         *ok = false;
   3187         return NULL;
   3188       }
   3189     }
   3190 
   3191     // Desugar '+foo' into 'foo*1', this enables the collection of type feedback
   3192     // without any special stub and the multiplication is removed later in
   3193     // Crankshaft's canonicalization pass.
   3194     if (op == Token::ADD) {
   3195       return factory()->NewBinaryOperation(Token::MUL,
   3196                                            expression,
   3197                                            factory()->NewNumberLiteral(1),
   3198                                            position);
   3199     }
   3200     // The same idea for '-foo' => 'foo*(-1)'.
   3201     if (op == Token::SUB) {
   3202       return factory()->NewBinaryOperation(Token::MUL,
   3203                                            expression,
   3204                                            factory()->NewNumberLiteral(-1),
   3205                                            position);
   3206     }
   3207     // ...and one more time for '~foo' => 'foo^(~0)'.
   3208     if (op == Token::BIT_NOT) {
   3209       return factory()->NewBinaryOperation(Token::BIT_XOR,
   3210                                            expression,
   3211                                            factory()->NewNumberLiteral(~0),
   3212                                            position);
   3213     }
   3214 
   3215     return factory()->NewUnaryOperation(op, expression, position);
   3216 
   3217   } else if (Token::IsCountOp(op)) {
   3218     op = Next();
   3219     Expression* expression = ParseUnaryExpression(CHECK_OK);
   3220     // Signal a reference error if the expression is an invalid
   3221     // left-hand side expression.  We could report this as a syntax
   3222     // error here but for compatibility with JSC we choose to report the
   3223     // error at runtime.
   3224     if (expression == NULL || !expression->IsValidLeftHandSide()) {
   3225       Handle<String> message =
   3226           isolate()->factory()->invalid_lhs_in_prefix_op_string();
   3227       expression = NewThrowReferenceError(message);
   3228     }
   3229 
   3230     if (!top_scope_->is_classic_mode()) {
   3231       // Prefix expression operand in strict mode may not be eval or arguments.
   3232       CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK);
   3233     }
   3234     MarkAsLValue(expression);
   3235 
   3236     int position = scanner().location().beg_pos;
   3237     return factory()->NewCountOperation(op,
   3238                                         true /* prefix */,
   3239                                         expression,
   3240                                         position);
   3241 
   3242   } else {
   3243     return ParsePostfixExpression(ok);
   3244   }
   3245 }
   3246 
   3247 
   3248 Expression* Parser::ParsePostfixExpression(bool* ok) {
   3249   // PostfixExpression ::
   3250   //   LeftHandSideExpression ('++' | '--')?
   3251 
   3252   Expression* expression = ParseLeftHandSideExpression(CHECK_OK);
   3253   if (!scanner().HasAnyLineTerminatorBeforeNext() &&
   3254       Token::IsCountOp(peek())) {
   3255     // Signal a reference error if the expression is an invalid
   3256     // left-hand side expression.  We could report this as a syntax
   3257     // error here but for compatibility with JSC we choose to report the
   3258     // error at runtime.
   3259     if (expression == NULL || !expression->IsValidLeftHandSide()) {
   3260       Handle<String> message =
   3261           isolate()->factory()->invalid_lhs_in_postfix_op_string();
   3262       expression = NewThrowReferenceError(message);
   3263     }
   3264 
   3265     if (!top_scope_->is_classic_mode()) {
   3266       // Postfix expression operand in strict mode may not be eval or arguments.
   3267       CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK);
   3268     }
   3269     MarkAsLValue(expression);
   3270 
   3271     Token::Value next = Next();
   3272     int position = scanner().location().beg_pos;
   3273     expression =
   3274         factory()->NewCountOperation(next,
   3275                                      false /* postfix */,
   3276                                      expression,
   3277                                      position);
   3278   }
   3279   return expression;
   3280 }
   3281 
   3282 
   3283 Expression* Parser::ParseLeftHandSideExpression(bool* ok) {
   3284   // LeftHandSideExpression ::
   3285   //   (NewExpression | MemberExpression) ...
   3286 
   3287   Expression* result;
   3288   if (peek() == Token::NEW) {
   3289     result = ParseNewExpression(CHECK_OK);
   3290   } else {
   3291     result = ParseMemberExpression(CHECK_OK);
   3292   }
   3293 
   3294   while (true) {
   3295     switch (peek()) {
   3296       case Token::LBRACK: {
   3297         Consume(Token::LBRACK);
   3298         int pos = scanner().location().beg_pos;
   3299         Expression* index = ParseExpression(true, CHECK_OK);
   3300         result = factory()->NewProperty(result, index, pos);
   3301         Expect(Token::RBRACK, CHECK_OK);
   3302         break;
   3303       }
   3304 
   3305       case Token::LPAREN: {
   3306         int pos;
   3307         if (scanner().current_token() == Token::IDENTIFIER) {
   3308           // For call of an identifier we want to report position of
   3309           // the identifier as position of the call in the stack trace.
   3310           pos = scanner().location().beg_pos;
   3311         } else {
   3312           // For other kinds of calls we record position of the parenthesis as
   3313           // position of the call.  Note that this is extremely important for
   3314           // expressions of the form function(){...}() for which call position
   3315           // should not point to the closing brace otherwise it will intersect
   3316           // with positions recorded for function literal and confuse debugger.
   3317           pos = scanner().peek_location().beg_pos;
   3318           // Also the trailing parenthesis are a hint that the function will
   3319           // be called immediately. If we happen to have parsed a preceding
   3320           // function literal eagerly, we can also compile it eagerly.
   3321           if (result->IsFunctionLiteral() && mode() == PARSE_EAGERLY) {
   3322             result->AsFunctionLiteral()->set_parenthesized();
   3323           }
   3324         }
   3325         ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
   3326 
   3327         // Keep track of eval() calls since they disable all local variable
   3328         // optimizations.
   3329         // The calls that need special treatment are the
   3330         // direct eval calls. These calls are all of the form eval(...), with
   3331         // no explicit receiver.
   3332         // These calls are marked as potentially direct eval calls. Whether
   3333         // they are actually direct calls to eval is determined at run time.
   3334         VariableProxy* callee = result->AsVariableProxy();
   3335         if (callee != NULL &&
   3336             callee->IsVariable(isolate()->factory()->eval_string())) {
   3337           top_scope_->DeclarationScope()->RecordEvalCall();
   3338         }
   3339         result = factory()->NewCall(result, args, pos);
   3340         if (fni_ != NULL) fni_->RemoveLastFunction();
   3341         break;
   3342       }
   3343 
   3344       case Token::PERIOD: {
   3345         Consume(Token::PERIOD);
   3346         int pos = scanner().location().beg_pos;
   3347         Handle<String> name = ParseIdentifierName(CHECK_OK);
   3348         result =
   3349             factory()->NewProperty(result, factory()->NewLiteral(name), pos);
   3350         if (fni_ != NULL) fni_->PushLiteralName(name);
   3351         break;
   3352       }
   3353 
   3354       default:
   3355         return result;
   3356     }
   3357   }
   3358 }
   3359 
   3360 
   3361 Expression* Parser::ParseNewPrefix(PositionStack* stack, bool* ok) {
   3362   // NewExpression ::
   3363   //   ('new')+ MemberExpression
   3364 
   3365   // The grammar for new expressions is pretty warped. The keyword
   3366   // 'new' can either be a part of the new expression (where it isn't
   3367   // followed by an argument list) or a part of the member expression,
   3368   // where it must be followed by an argument list. To accommodate
   3369   // this, we parse the 'new' keywords greedily and keep track of how
   3370   // many we have parsed. This information is then passed on to the
   3371   // member expression parser, which is only allowed to match argument
   3372   // lists as long as it has 'new' prefixes left
   3373   Expect(Token::NEW, CHECK_OK);
   3374   PositionStack::Element pos(stack, scanner().location().beg_pos);
   3375 
   3376   Expression* result;
   3377   if (peek() == Token::NEW) {
   3378     result = ParseNewPrefix(stack, CHECK_OK);
   3379   } else {
   3380     result = ParseMemberWithNewPrefixesExpression(stack, CHECK_OK);
   3381   }
   3382 
   3383   if (!stack->is_empty()) {
   3384     int last = stack->pop();
   3385     result = factory()->NewCallNew(
   3386         result, new(zone()) ZoneList<Expression*>(0, zone()), last);
   3387   }
   3388   return result;
   3389 }
   3390 
   3391 
   3392 Expression* Parser::ParseNewExpression(bool* ok) {
   3393   PositionStack stack(ok);
   3394   return ParseNewPrefix(&stack, ok);
   3395 }
   3396 
   3397 
   3398 Expression* Parser::ParseMemberExpression(bool* ok) {
   3399   return ParseMemberWithNewPrefixesExpression(NULL, ok);
   3400 }
   3401 
   3402 
   3403 Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack,
   3404                                                          bool* ok) {
   3405   // MemberExpression ::
   3406   //   (PrimaryExpression | FunctionLiteral)
   3407   //     ('[' Expression ']' | '.' Identifier | Arguments)*
   3408 
   3409   // Parse the initial primary or function expression.
   3410   Expression* result = NULL;
   3411   if (peek() == Token::FUNCTION) {
   3412     Expect(Token::FUNCTION, CHECK_OK);
   3413     int function_token_position = scanner().location().beg_pos;
   3414     bool is_generator = allow_generators() && Check(Token::MUL);
   3415     Handle<String> name;
   3416     bool is_strict_reserved_name = false;
   3417     if (peek_any_identifier()) {
   3418       name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
   3419                                                  CHECK_OK);
   3420     }
   3421     FunctionLiteral::FunctionType function_type = name.is_null()
   3422         ? FunctionLiteral::ANONYMOUS_EXPRESSION
   3423         : FunctionLiteral::NAMED_EXPRESSION;
   3424     result = ParseFunctionLiteral(name,
   3425                                   is_strict_reserved_name,
   3426                                   is_generator,
   3427                                   function_token_position,
   3428                                   function_type,
   3429                                   CHECK_OK);
   3430   } else {
   3431     result = ParsePrimaryExpression(CHECK_OK);
   3432   }
   3433 
   3434   while (true) {
   3435     switch (peek()) {
   3436       case Token::LBRACK: {
   3437         Consume(Token::LBRACK);
   3438         int pos = scanner().location().beg_pos;
   3439         Expression* index = ParseExpression(true, CHECK_OK);
   3440         result = factory()->NewProperty(result, index, pos);
   3441         if (fni_ != NULL) {
   3442           if (index->IsPropertyName()) {
   3443             fni_->PushLiteralName(index->AsLiteral()->AsPropertyName());
   3444           } else {
   3445             fni_->PushLiteralName(
   3446                 isolate()->factory()->anonymous_function_string());
   3447           }
   3448         }
   3449         Expect(Token::RBRACK, CHECK_OK);
   3450         break;
   3451       }
   3452       case Token::PERIOD: {
   3453         Consume(Token::PERIOD);
   3454         int pos = scanner().location().beg_pos;
   3455         Handle<String> name = ParseIdentifierName(CHECK_OK);
   3456         result =
   3457             factory()->NewProperty(result, factory()->NewLiteral(name), pos);
   3458         if (fni_ != NULL) fni_->PushLiteralName(name);
   3459         break;
   3460       }
   3461       case Token::LPAREN: {
   3462         if ((stack == NULL) || stack->is_empty()) return result;
   3463         // Consume one of the new prefixes (already parsed).
   3464         ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
   3465         int last = stack->pop();
   3466         result = factory()->NewCallNew(result, args, last);
   3467         break;
   3468       }
   3469       default:
   3470         return result;
   3471     }
   3472   }
   3473 }
   3474 
   3475 
   3476 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) {
   3477   // In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
   3478   // contexts this is used as a statement which invokes the debugger as i a
   3479   // break point is present.
   3480   // DebuggerStatement ::
   3481   //   'debugger' ';'
   3482 
   3483   Expect(Token::DEBUGGER, CHECK_OK);
   3484   ExpectSemicolon(CHECK_OK);
   3485   return factory()->NewDebuggerStatement();
   3486 }
   3487 
   3488 
   3489 void Parser::ReportUnexpectedToken(Token::Value token) {
   3490   // We don't report stack overflows here, to avoid increasing the
   3491   // stack depth even further.  Instead we report it after parsing is
   3492   // over, in ParseProgram/ParseJson.
   3493   if (token == Token::ILLEGAL && stack_overflow_) return;
   3494   // Four of the tokens are treated specially
   3495   switch (token) {
   3496     case Token::EOS:
   3497       return ReportMessage("unexpected_eos", Vector<const char*>::empty());
   3498     case Token::NUMBER:
   3499       return ReportMessage("unexpected_token_number",
   3500                            Vector<const char*>::empty());
   3501     case Token::STRING:
   3502       return ReportMessage("unexpected_token_string",
   3503                            Vector<const char*>::empty());
   3504     case Token::IDENTIFIER:
   3505       return ReportMessage("unexpected_token_identifier",
   3506                            Vector<const char*>::empty());
   3507     case Token::FUTURE_RESERVED_WORD:
   3508       return ReportMessage("unexpected_reserved",
   3509                            Vector<const char*>::empty());
   3510     case Token::YIELD:
   3511     case Token::FUTURE_STRICT_RESERVED_WORD:
   3512       return ReportMessage(top_scope_->is_classic_mode() ?
   3513                                "unexpected_token_identifier" :
   3514                                "unexpected_strict_reserved",
   3515                            Vector<const char*>::empty());
   3516     default:
   3517       const char* name = Token::String(token);
   3518       ASSERT(name != NULL);
   3519       ReportMessage("unexpected_token", Vector<const char*>(&name, 1));
   3520   }
   3521 }
   3522 
   3523 
   3524 void Parser::ReportInvalidPreparseData(Handle<String> name, bool* ok) {
   3525   SmartArrayPointer<char> name_string = name->ToCString(DISALLOW_NULLS);
   3526   const char* element[1] = { *name_string };
   3527   ReportMessage("invalid_preparser_data",
   3528                 Vector<const char*>(element, 1));
   3529   *ok = false;
   3530 }
   3531 
   3532 
   3533 Expression* Parser::ParsePrimaryExpression(bool* ok) {
   3534   // PrimaryExpression ::
   3535   //   'this'
   3536   //   'null'
   3537   //   'true'
   3538   //   'false'
   3539   //   Identifier
   3540   //   Number
   3541   //   String
   3542   //   ArrayLiteral
   3543   //   ObjectLiteral
   3544   //   RegExpLiteral
   3545   //   '(' Expression ')'
   3546 
   3547   Expression* result = NULL;
   3548   switch (peek()) {
   3549     case Token::THIS: {
   3550       Consume(Token::THIS);
   3551       result = factory()->NewVariableProxy(top_scope_->receiver());
   3552       break;
   3553     }
   3554 
   3555     case Token::NULL_LITERAL:
   3556       Consume(Token::NULL_LITERAL);
   3557       result = factory()->NewLiteral(isolate()->factory()->null_value());
   3558       break;
   3559 
   3560     case Token::TRUE_LITERAL:
   3561       Consume(Token::TRUE_LITERAL);
   3562       result = factory()->NewLiteral(isolate()->factory()->true_value());
   3563       break;
   3564 
   3565     case Token::FALSE_LITERAL:
   3566       Consume(Token::FALSE_LITERAL);
   3567       result = factory()->NewLiteral(isolate()->factory()->false_value());
   3568       break;
   3569 
   3570     case Token::IDENTIFIER:
   3571     case Token::YIELD:
   3572     case Token::FUTURE_STRICT_RESERVED_WORD: {
   3573       Handle<String> name = ParseIdentifier(CHECK_OK);
   3574       if (fni_ != NULL) fni_->PushVariableName(name);
   3575       // The name may refer to a module instance object, so its type is unknown.
   3576 #ifdef DEBUG
   3577       if (FLAG_print_interface_details)
   3578         PrintF("# Variable %s ", name->ToAsciiArray());
   3579 #endif
   3580       Interface* interface = Interface::NewUnknown(zone());
   3581       result = top_scope_->NewUnresolved(
   3582           factory(), name, interface, scanner().location().beg_pos);
   3583       break;
   3584     }
   3585 
   3586     case Token::NUMBER: {
   3587       Consume(Token::NUMBER);
   3588       ASSERT(scanner().is_literal_ascii());
   3589       double value = StringToDouble(isolate()->unicode_cache(),
   3590                                     scanner().literal_ascii_string(),
   3591                                     ALLOW_HEX | ALLOW_OCTAL |
   3592                                         ALLOW_IMPLICIT_OCTAL | ALLOW_BINARY);
   3593       result = factory()->NewNumberLiteral(value);
   3594       break;
   3595     }
   3596 
   3597     case Token::STRING: {
   3598       Consume(Token::STRING);
   3599       Handle<String> symbol = GetSymbol();
   3600       result = factory()->NewLiteral(symbol);
   3601       if (fni_ != NULL) fni_->PushLiteralName(symbol);
   3602       break;
   3603     }
   3604 
   3605     case Token::ASSIGN_DIV:
   3606       result = ParseRegExpLiteral(true, CHECK_OK);
   3607       break;
   3608 
   3609     case Token::DIV:
   3610       result = ParseRegExpLiteral(false, CHECK_OK);
   3611       break;
   3612 
   3613     case Token::LBRACK:
   3614       result = ParseArrayLiteral(CHECK_OK);
   3615       break;
   3616 
   3617     case Token::LBRACE:
   3618       result = ParseObjectLiteral(CHECK_OK);
   3619       break;
   3620 
   3621     case Token::LPAREN:
   3622       Consume(Token::LPAREN);
   3623       // Heuristically try to detect immediately called functions before
   3624       // seeing the call parentheses.
   3625       parenthesized_function_ = (peek() == Token::FUNCTION);
   3626       result = ParseExpression(true, CHECK_OK);
   3627       Expect(Token::RPAREN, CHECK_OK);
   3628       break;
   3629 
   3630     case Token::MOD:
   3631       if (allow_natives_syntax() || extension_ != NULL) {
   3632         result = ParseV8Intrinsic(CHECK_OK);
   3633         break;
   3634       }
   3635       // If we're not allowing special syntax we fall-through to the
   3636       // default case.
   3637 
   3638     default: {
   3639       Token::Value tok = Next();
   3640       ReportUnexpectedToken(tok);
   3641       *ok = false;
   3642       return NULL;
   3643     }
   3644   }
   3645 
   3646   return result;
   3647 }
   3648 
   3649 
   3650 Expression* Parser::ParseArrayLiteral(bool* ok) {
   3651   // ArrayLiteral ::
   3652   //   '[' Expression? (',' Expression?)* ']'
   3653 
   3654   ZoneList<Expression*>* values = new(zone()) ZoneList<Expression*>(4, zone());
   3655   Expect(Token::LBRACK, CHECK_OK);
   3656   while (peek() != Token::RBRACK) {
   3657     Expression* elem;
   3658     if (peek() == Token::COMMA) {
   3659       elem = GetLiteralTheHole();
   3660     } else {
   3661       elem = ParseAssignmentExpression(true, CHECK_OK);
   3662     }
   3663     values->Add(elem, zone());
   3664     if (peek() != Token::RBRACK) {
   3665       Expect(Token::COMMA, CHECK_OK);
   3666     }
   3667   }
   3668   Expect(Token::RBRACK, CHECK_OK);
   3669 
   3670   // Update the scope information before the pre-parsing bailout.
   3671   int literal_index = current_function_state_->NextMaterializedLiteralIndex();
   3672 
   3673   // Allocate a fixed array to hold all the object literals.
   3674   Handle<JSArray> array =
   3675       isolate()->factory()->NewJSArray(0, FAST_HOLEY_SMI_ELEMENTS);
   3676   isolate()->factory()->SetElementsCapacityAndLength(
   3677       array, values->length(), values->length());
   3678 
   3679   // Fill in the literals.
   3680   Heap* heap = isolate()->heap();
   3681   bool is_simple = true;
   3682   int depth = 1;
   3683   bool is_holey = false;
   3684   for (int i = 0, n = values->length(); i < n; i++) {
   3685     MaterializedLiteral* m_literal = values->at(i)->AsMaterializedLiteral();
   3686     if (m_literal != NULL && m_literal->depth() + 1 > depth) {
   3687       depth = m_literal->depth() + 1;
   3688     }
   3689     Handle<Object> boilerplate_value = GetBoilerplateValue(values->at(i));
   3690     if (boilerplate_value->IsTheHole()) {
   3691       is_holey = true;
   3692     } else if (boilerplate_value->IsUninitialized()) {
   3693       is_simple = false;
   3694       JSObject::SetOwnElement(
   3695           array, i, handle(Smi::FromInt(0), isolate()), kNonStrictMode);
   3696     } else {
   3697       JSObject::SetOwnElement(array, i, boilerplate_value, kNonStrictMode);
   3698     }
   3699   }
   3700 
   3701   Handle<FixedArrayBase> element_values(array->elements());
   3702 
   3703   // Simple and shallow arrays can be lazily copied, we transform the
   3704   // elements array to a copy-on-write array.
   3705   if (is_simple && depth == 1 && values->length() > 0 &&
   3706       array->HasFastSmiOrObjectElements()) {
   3707     element_values->set_map(heap->fixed_cow_array_map());
   3708   }
   3709 
   3710   // Remember both the literal's constant values as well as the ElementsKind
   3711   // in a 2-element FixedArray.
   3712   Handle<FixedArray> literals = isolate()->factory()->NewFixedArray(2, TENURED);
   3713 
   3714   ElementsKind kind = array->GetElementsKind();
   3715   kind = is_holey ? GetHoleyElementsKind(kind) : GetPackedElementsKind(kind);
   3716 
   3717   literals->set(0, Smi::FromInt(kind));
   3718   literals->set(1, *element_values);
   3719 
   3720   return factory()->NewArrayLiteral(
   3721       literals, values, literal_index, is_simple, depth);
   3722 }
   3723 
   3724 
   3725 bool Parser::IsBoilerplateProperty(ObjectLiteral::Property* property) {
   3726   return property != NULL &&
   3727          property->kind() != ObjectLiteral::Property::PROTOTYPE;
   3728 }
   3729 
   3730 
   3731 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) {
   3732   if (expression->AsLiteral() != NULL) return true;
   3733   MaterializedLiteral* lit = expression->AsMaterializedLiteral();
   3734   return lit != NULL && lit->is_simple();
   3735 }
   3736 
   3737 
   3738 Handle<FixedArray> CompileTimeValue::GetValue(Expression* expression) {
   3739   Factory* factory = Isolate::Current()->factory();
   3740   ASSERT(IsCompileTimeValue(expression));
   3741   Handle<FixedArray> result = factory->NewFixedArray(2, TENURED);
   3742   ObjectLiteral* object_literal = expression->AsObjectLiteral();
   3743   if (object_literal != NULL) {
   3744     ASSERT(object_literal->is_simple());
   3745     if (object_literal->fast_elements()) {
   3746       result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS));
   3747     } else {
   3748       result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS));
   3749     }
   3750     result->set(kElementsSlot, *object_literal->constant_properties());
   3751   } else {
   3752     ArrayLiteral* array_literal = expression->AsArrayLiteral();
   3753     ASSERT(array_literal != NULL && array_literal->is_simple());
   3754     result->set(kLiteralTypeSlot, Smi::FromInt(ARRAY_LITERAL));
   3755     result->set(kElementsSlot, *array_literal->constant_elements());
   3756   }
   3757   return result;
   3758 }
   3759 
   3760 
   3761 CompileTimeValue::LiteralType CompileTimeValue::GetLiteralType(
   3762     Handle<FixedArray> value) {
   3763   Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot));
   3764   return static_cast<LiteralType>(literal_type->value());
   3765 }
   3766 
   3767 
   3768 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) {
   3769   return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot)));
   3770 }
   3771 
   3772 
   3773 Handle<Object> Parser::GetBoilerplateValue(Expression* expression) {
   3774   if (expression->AsLiteral() != NULL) {
   3775     return expression->AsLiteral()->value();
   3776   }
   3777   if (CompileTimeValue::IsCompileTimeValue(expression)) {
   3778     return CompileTimeValue::GetValue(expression);
   3779   }
   3780   return isolate()->factory()->uninitialized_value();
   3781 }
   3782 
   3783 
   3784 // Validation per 11.1.5 Object Initialiser
   3785 class ObjectLiteralPropertyChecker {
   3786  public:
   3787   ObjectLiteralPropertyChecker(Parser* parser, LanguageMode language_mode) :
   3788     props_(Literal::Match),
   3789     parser_(parser),
   3790     language_mode_(language_mode) {
   3791   }
   3792 
   3793   void CheckProperty(
   3794     ObjectLiteral::Property* property,
   3795     Scanner::Location loc,
   3796     bool* ok);
   3797 
   3798  private:
   3799   enum PropertyKind {
   3800     kGetAccessor = 0x01,
   3801     kSetAccessor = 0x02,
   3802     kAccessor = kGetAccessor | kSetAccessor,
   3803     kData = 0x04
   3804   };
   3805 
   3806   static intptr_t GetPropertyKind(ObjectLiteral::Property* property) {
   3807     switch (property->kind()) {
   3808       case ObjectLiteral::Property::GETTER:
   3809         return kGetAccessor;
   3810       case ObjectLiteral::Property::SETTER:
   3811         return kSetAccessor;
   3812       default:
   3813         return kData;
   3814     }
   3815   }
   3816 
   3817   HashMap props_;
   3818   Parser* parser_;
   3819   LanguageMode language_mode_;
   3820 };
   3821 
   3822 
   3823 void ObjectLiteralPropertyChecker::CheckProperty(
   3824     ObjectLiteral::Property* property,
   3825     Scanner::Location loc,
   3826     bool* ok) {
   3827   ASSERT(property != NULL);
   3828   Literal* literal = property->key();
   3829   HashMap::Entry* entry = props_.Lookup(literal, literal->Hash(), true);
   3830   intptr_t prev = reinterpret_cast<intptr_t> (entry->value);
   3831   intptr_t curr = GetPropertyKind(property);
   3832 
   3833   // Duplicate data properties are illegal in strict or extended mode.
   3834   if (language_mode_ != CLASSIC_MODE && (curr & prev & kData) != 0) {
   3835     parser_->ReportMessageAt(loc, "strict_duplicate_property",
   3836                              Vector<const char*>::empty());
   3837     *ok = false;
   3838     return;
   3839   }
   3840   // Data property conflicting with an accessor.
   3841   if (((curr & kData) && (prev & kAccessor)) ||
   3842       ((prev & kData) && (curr & kAccessor))) {
   3843     parser_->ReportMessageAt(loc, "accessor_data_property",
   3844                              Vector<const char*>::empty());
   3845     *ok = false;
   3846     return;
   3847   }
   3848   // Two accessors of the same type conflicting
   3849   if ((curr & prev & kAccessor) != 0) {
   3850     parser_->ReportMessageAt(loc, "accessor_get_set",
   3851                              Vector<const char*>::empty());
   3852     *ok = false;
   3853     return;
   3854   }
   3855 
   3856   // Update map
   3857   entry->value = reinterpret_cast<void*> (prev | curr);
   3858   *ok = true;
   3859 }
   3860 
   3861 
   3862 void Parser::BuildObjectLiteralConstantProperties(
   3863     ZoneList<ObjectLiteral::Property*>* properties,
   3864     Handle<FixedArray> constant_properties,
   3865     bool* is_simple,
   3866     bool* fast_elements,
   3867     int* depth,
   3868     bool* may_store_doubles) {
   3869   int position = 0;
   3870   // Accumulate the value in local variables and store it at the end.
   3871   bool is_simple_acc = true;
   3872   int depth_acc = 1;
   3873   uint32_t max_element_index = 0;
   3874   uint32_t elements = 0;
   3875   for (int i = 0; i < properties->length(); i++) {
   3876     ObjectLiteral::Property* property = properties->at(i);
   3877     if (!IsBoilerplateProperty(property)) {
   3878       is_simple_acc = false;
   3879       continue;
   3880     }
   3881     MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral();
   3882     if (m_literal != NULL && m_literal->depth() >= depth_acc) {
   3883       depth_acc = m_literal->depth() + 1;
   3884     }
   3885 
   3886     // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined
   3887     // value for COMPUTED properties, the real value is filled in at
   3888     // runtime. The enumeration order is maintained.
   3889     Handle<Object> key = property->key()->value();
   3890     Handle<Object> value = GetBoilerplateValue(property->value());
   3891 
   3892     // Ensure objects that may, at any point in time, contain fields with double
   3893     // representation are always treated as nested objects. This is true for
   3894     // computed fields (value is undefined), and smi and double literals
   3895     // (value->IsNumber()).
   3896     // TODO(verwaest): Remove once we can store them inline.
   3897     if (FLAG_track_double_fields &&
   3898         (value->IsNumber() || value->IsUninitialized())) {
   3899       *may_store_doubles = true;
   3900     }
   3901 
   3902     is_simple_acc = is_simple_acc && !value->IsUninitialized();
   3903 
   3904     // Keep track of the number of elements in the object literal and
   3905     // the largest element index.  If the largest element index is
   3906     // much larger than the number of elements, creating an object
   3907     // literal with fast elements will be a waste of space.
   3908     uint32_t element_index = 0;
   3909     if (key->IsString()
   3910         && Handle<String>::cast(key)->AsArrayIndex(&element_index)
   3911         && element_index > max_element_index) {
   3912       max_element_index = element_index;
   3913       elements++;
   3914     } else if (key->IsSmi()) {
   3915       int key_value = Smi::cast(*key)->value();
   3916       if (key_value > 0
   3917           && static_cast<uint32_t>(key_value) > max_element_index) {
   3918         max_element_index = key_value;
   3919       }
   3920       elements++;
   3921     }
   3922 
   3923     // Add name, value pair to the fixed array.
   3924     constant_properties->set(position++, *key);
   3925     constant_properties->set(position++, *value);
   3926   }
   3927   *fast_elements =
   3928       (max_element_index <= 32) || ((2 * elements) >= max_element_index);
   3929   *is_simple = is_simple_acc;
   3930   *depth = depth_acc;
   3931 }
   3932 
   3933 
   3934 ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter,
   3935                                                           bool* ok) {
   3936   // Special handling of getter and setter syntax:
   3937   // { ... , get foo() { ... }, ... , set foo(v) { ... v ... } , ... }
   3938   // We have already read the "get" or "set" keyword.
   3939   Token::Value next = Next();
   3940   bool is_keyword = Token::IsKeyword(next);
   3941   if (next == Token::IDENTIFIER || next == Token::NUMBER ||
   3942       next == Token::FUTURE_RESERVED_WORD ||
   3943       next == Token::FUTURE_STRICT_RESERVED_WORD ||
   3944       next == Token::STRING || is_keyword) {
   3945     Handle<String> name;
   3946     if (is_keyword) {
   3947       name = isolate_->factory()->InternalizeUtf8String(Token::String(next));
   3948     } else {
   3949       name = GetSymbol();
   3950     }
   3951     FunctionLiteral* value =
   3952         ParseFunctionLiteral(name,
   3953                              false,   // reserved words are allowed here
   3954                              false,   // not a generator
   3955                              RelocInfo::kNoPosition,
   3956                              FunctionLiteral::ANONYMOUS_EXPRESSION,
   3957                              CHECK_OK);
   3958     // Allow any number of parameters for compatibilty with JSC.
   3959     // Specification only allows zero parameters for get and one for set.
   3960     return factory()->NewObjectLiteralProperty(is_getter, value);
   3961   } else {
   3962     ReportUnexpectedToken(next);
   3963     *ok = false;
   3964     return NULL;
   3965   }
   3966 }
   3967 
   3968 
   3969 Expression* Parser::ParseObjectLiteral(bool* ok) {
   3970   // ObjectLiteral ::
   3971   //   '{' (
   3972   //       ((IdentifierName | String | Number) ':' AssignmentExpression)
   3973   //     | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
   3974   //    )*[','] '}'
   3975 
   3976   ZoneList<ObjectLiteral::Property*>* properties =
   3977       new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone());
   3978   int number_of_boilerplate_properties = 0;
   3979   bool has_function = false;
   3980 
   3981   ObjectLiteralPropertyChecker checker(this, top_scope_->language_mode());
   3982 
   3983   Expect(Token::LBRACE, CHECK_OK);
   3984 
   3985   while (peek() != Token::RBRACE) {
   3986     if (fni_ != NULL) fni_->Enter();
   3987 
   3988     Literal* key = NULL;
   3989     Token::Value next = peek();
   3990 
   3991     // Location of the property name token
   3992     Scanner::Location loc = scanner().peek_location();
   3993 
   3994     switch (next) {
   3995       case Token::FUTURE_RESERVED_WORD:
   3996       case Token::FUTURE_STRICT_RESERVED_WORD:
   3997       case Token::IDENTIFIER: {
   3998         bool is_getter = false;
   3999         bool is_setter = false;
   4000         Handle<String> id =
   4001             ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK);
   4002         if (fni_ != NULL) fni_->PushLiteralName(id);
   4003 
   4004         if ((is_getter || is_setter) && peek() != Token::COLON) {
   4005             // Update loc to point to the identifier
   4006             loc = scanner().peek_location();
   4007             ObjectLiteral::Property* property =
   4008                 ParseObjectLiteralGetSet(is_getter, CHECK_OK);
   4009             if (IsBoilerplateProperty(property)) {
   4010               number_of_boilerplate_properties++;
   4011             }
   4012             // Validate the property.
   4013             checker.CheckProperty(property, loc, CHECK_OK);
   4014             properties->Add(property, zone());
   4015             if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
   4016 
   4017             if (fni_ != NULL) {
   4018               fni_->Infer();
   4019               fni_->Leave();
   4020             }
   4021             continue;  // restart the while
   4022         }
   4023         // Failed to parse as get/set property, so it's just a property
   4024         // called "get" or "set".
   4025         key = factory()->NewLiteral(id);
   4026         break;
   4027       }
   4028       case Token::STRING: {
   4029         Consume(Token::STRING);
   4030         Handle<String> string = GetSymbol();
   4031         if (fni_ != NULL) fni_->PushLiteralName(string);
   4032         uint32_t index;
   4033         if (!string.is_null() && string->AsArrayIndex(&index)) {
   4034           key = factory()->NewNumberLiteral(index);
   4035           break;
   4036         }
   4037         key = factory()->NewLiteral(string);
   4038         break;
   4039       }
   4040       case Token::NUMBER: {
   4041         Consume(Token::NUMBER);
   4042         ASSERT(scanner().is_literal_ascii());
   4043         double value = StringToDouble(isolate()->unicode_cache(),
   4044                                       scanner().literal_ascii_string(),
   4045                                       ALLOW_HEX | ALLOW_OCTAL |
   4046                                           ALLOW_IMPLICIT_OCTAL | ALLOW_BINARY);
   4047         key = factory()->NewNumberLiteral(value);
   4048         break;
   4049       }
   4050       default:
   4051         if (Token::IsKeyword(next)) {
   4052           Consume(next);
   4053           Handle<String> string = GetSymbol();
   4054           key = factory()->NewLiteral(string);
   4055         } else {
   4056           // Unexpected token.
   4057           Token::Value next = Next();
   4058           ReportUnexpectedToken(next);
   4059           *ok = false;
   4060           return NULL;
   4061         }
   4062     }
   4063 
   4064     Expect(Token::COLON, CHECK_OK);
   4065     Expression* value = ParseAssignmentExpression(true, CHECK_OK);
   4066 
   4067     ObjectLiteral::Property* property =
   4068         new(zone()) ObjectLiteral::Property(key, value, isolate());
   4069 
   4070     // Mark top-level object literals that contain function literals and
   4071     // pretenure the literal so it can be added as a constant function
   4072     // property.
   4073     if (top_scope_->DeclarationScope()->is_global_scope() &&
   4074         value->AsFunctionLiteral() != NULL) {
   4075       has_function = true;
   4076       value->AsFunctionLiteral()->set_pretenure();
   4077     }
   4078 
   4079     // Count CONSTANT or COMPUTED properties to maintain the enumeration order.
   4080     if (IsBoilerplateProperty(property)) number_of_boilerplate_properties++;
   4081     // Validate the property
   4082     checker.CheckProperty(property, loc, CHECK_OK);
   4083     properties->Add(property, zone());
   4084 
   4085     // TODO(1240767): Consider allowing trailing comma.
   4086     if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
   4087 
   4088     if (fni_ != NULL) {
   4089       fni_->Infer();
   4090       fni_->Leave();
   4091     }
   4092   }
   4093   Expect(Token::RBRACE, CHECK_OK);
   4094 
   4095   // Computation of literal_index must happen before pre parse bailout.
   4096   int literal_index = current_function_state_->NextMaterializedLiteralIndex();
   4097 
   4098   Handle<FixedArray> constant_properties = isolate()->factory()->NewFixedArray(
   4099       number_of_boilerplate_properties * 2, TENURED);
   4100 
   4101   bool is_simple = true;
   4102   bool fast_elements = true;
   4103   int depth = 1;
   4104   bool may_store_doubles = false;
   4105   BuildObjectLiteralConstantProperties(properties,
   4106                                        constant_properties,
   4107                                        &is_simple,
   4108                                        &fast_elements,
   4109                                        &depth,
   4110                                        &may_store_doubles);
   4111   return factory()->NewObjectLiteral(constant_properties,
   4112                                      properties,
   4113                                      literal_index,
   4114                                      is_simple,
   4115                                      fast_elements,
   4116                                      depth,
   4117                                      may_store_doubles,
   4118                                      has_function);
   4119 }
   4120 
   4121 
   4122 Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) {
   4123   if (!scanner().ScanRegExpPattern(seen_equal)) {
   4124     Next();
   4125     ReportMessage("unterminated_regexp", Vector<const char*>::empty());
   4126     *ok = false;
   4127     return NULL;
   4128   }
   4129 
   4130   int literal_index = current_function_state_->NextMaterializedLiteralIndex();
   4131 
   4132   Handle<String> js_pattern = NextLiteralString(TENURED);
   4133   scanner().ScanRegExpFlags();
   4134   Handle<String> js_flags = NextLiteralString(TENURED);
   4135   Next();
   4136 
   4137   return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index);
   4138 }
   4139 
   4140 
   4141 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) {
   4142   // Arguments ::
   4143   //   '(' (AssignmentExpression)*[','] ')'
   4144 
   4145   ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4, zone());
   4146   Expect(Token::LPAREN, CHECK_OK);
   4147   bool done = (peek() == Token::RPAREN);
   4148   while (!done) {
   4149     Expression* argument = ParseAssignmentExpression(true, CHECK_OK);
   4150     result->Add(argument, zone());
   4151     if (result->length() > Code::kMaxArguments) {
   4152       ReportMessageAt(scanner().location(), "too_many_arguments",
   4153                       Vector<const char*>::empty());
   4154       *ok = false;
   4155       return NULL;
   4156     }
   4157     done = (peek() == Token::RPAREN);
   4158     if (!done) Expect(Token::COMMA, CHECK_OK);
   4159   }
   4160   Expect(Token::RPAREN, CHECK_OK);
   4161   return result;
   4162 }
   4163 
   4164 
   4165 class SingletonLogger : public ParserRecorder {
   4166  public:
   4167   SingletonLogger() : has_error_(false), start_(-1), end_(-1) { }
   4168   virtual ~SingletonLogger() { }
   4169 
   4170   void Reset() { has_error_ = false; }
   4171 
   4172   virtual void LogFunction(int start,
   4173                            int end,
   4174                            int literals,
   4175                            int properties,
   4176                            LanguageMode mode) {
   4177     ASSERT(!has_error_);
   4178     start_ = start;
   4179     end_ = end;
   4180     literals_ = literals;
   4181     properties_ = properties;
   4182     mode_ = mode;
   4183   };
   4184 
   4185   // Logs a symbol creation of a literal or identifier.
   4186   virtual void LogAsciiSymbol(int start, Vector<const char> literal) { }
   4187   virtual void LogUtf16Symbol(int start, Vector<const uc16> literal) { }
   4188 
   4189   // Logs an error message and marks the log as containing an error.
   4190   // Further logging will be ignored, and ExtractData will return a vector
   4191   // representing the error only.
   4192   virtual void LogMessage(int start,
   4193                           int end,
   4194                           const char* message,
   4195                           const char* argument_opt) {
   4196     if (has_error_) return;
   4197     has_error_ = true;
   4198     start_ = start;
   4199     end_ = end;
   4200     message_ = message;
   4201     argument_opt_ = argument_opt;
   4202   }
   4203 
   4204   virtual int function_position() { return 0; }
   4205 
   4206   virtual int symbol_position() { return 0; }
   4207 
   4208   virtual int symbol_ids() { return -1; }
   4209 
   4210   virtual Vector<unsigned> ExtractData() {
   4211     UNREACHABLE();
   4212     return Vector<unsigned>();
   4213   }
   4214 
   4215   virtual void PauseRecording() { }
   4216 
   4217   virtual void ResumeRecording() { }
   4218 
   4219   bool has_error() { return has_error_; }
   4220 
   4221   int start() { return start_; }
   4222   int end() { return end_; }
   4223   int literals() {
   4224     ASSERT(!has_error_);
   4225     return literals_;
   4226   }
   4227   int properties() {
   4228     ASSERT(!has_error_);
   4229     return properties_;
   4230   }
   4231   LanguageMode language_mode() {
   4232     ASSERT(!has_error_);
   4233     return mode_;
   4234   }
   4235   const char* message() {
   4236     ASSERT(has_error_);
   4237     return message_;
   4238   }
   4239   const char* argument_opt() {
   4240     ASSERT(has_error_);
   4241     return argument_opt_;
   4242   }
   4243 
   4244  private:
   4245   bool has_error_;
   4246   int start_;
   4247   int end_;
   4248   // For function entries.
   4249   int literals_;
   4250   int properties_;
   4251   LanguageMode mode_;
   4252   // For error messages.
   4253   const char* message_;
   4254   const char* argument_opt_;
   4255 };
   4256 
   4257 
   4258 FunctionLiteral* Parser::ParseFunctionLiteral(
   4259     Handle<String> function_name,
   4260     bool name_is_strict_reserved,
   4261     bool is_generator,
   4262     int function_token_position,
   4263     FunctionLiteral::FunctionType function_type,
   4264     bool* ok) {
   4265   // Function ::
   4266   //   '(' FormalParameterList? ')' '{' FunctionBody '}'
   4267 
   4268   // Anonymous functions were passed either the empty symbol or a null
   4269   // handle as the function name.  Remember if we were passed a non-empty
   4270   // handle to decide whether to invoke function name inference.
   4271   bool should_infer_name = function_name.is_null();
   4272 
   4273   // We want a non-null handle as the function name.
   4274   if (should_infer_name) {
   4275     function_name = isolate()->factory()->empty_string();
   4276   }
   4277 
   4278   int num_parameters = 0;
   4279   // Function declarations are function scoped in normal mode, so they are
   4280   // hoisted. In harmony block scoping mode they are block scoped, so they
   4281   // are not hoisted.
   4282   Scope* scope =
   4283       (function_type == FunctionLiteral::DECLARATION && !is_extended_mode())
   4284       ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE)
   4285       : NewScope(top_scope_, FUNCTION_SCOPE);
   4286   ZoneList<Statement*>* body = NULL;
   4287   int materialized_literal_count = -1;
   4288   int expected_property_count = -1;
   4289   int handler_count = 0;
   4290   FunctionLiteral::ParameterFlag duplicate_parameters =
   4291       FunctionLiteral::kNoDuplicateParameters;
   4292   FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_
   4293       ? FunctionLiteral::kIsParenthesized
   4294       : FunctionLiteral::kNotParenthesized;
   4295   FunctionLiteral::IsGeneratorFlag generator = is_generator
   4296       ? FunctionLiteral::kIsGenerator
   4297       : FunctionLiteral::kNotGenerator;
   4298   AstProperties ast_properties;
   4299   // Parse function body.
   4300   { FunctionState function_state(this, scope, isolate());
   4301     top_scope_->SetScopeName(function_name);
   4302 
   4303     if (is_generator) {
   4304       // For generators, allocating variables in contexts is currently a win
   4305       // because it minimizes the work needed to suspend and resume an
   4306       // activation.
   4307       top_scope_->ForceContextAllocation();
   4308 
   4309       // Calling a generator returns a generator object.  That object is stored
   4310       // in a temporary variable, a definition that is used by "yield"
   4311       // expressions.  Presence of a variable for the generator object in the
   4312       // FunctionState indicates that this function is a generator.
   4313       Handle<String> tempname = isolate()->factory()->InternalizeOneByteString(
   4314           STATIC_ASCII_VECTOR(".generator_object"));
   4315       Variable* temp = top_scope_->DeclarationScope()->NewTemporary(tempname);
   4316       function_state.set_generator_object_variable(temp);
   4317     }
   4318 
   4319     //  FormalParameterList ::
   4320     //    '(' (Identifier)*[','] ')'
   4321     Expect(Token::LPAREN, CHECK_OK);
   4322     scope->set_start_position(scanner().location().beg_pos);
   4323     Scanner::Location name_loc = Scanner::Location::invalid();
   4324     Scanner::Location dupe_loc = Scanner::Location::invalid();
   4325     Scanner::Location reserved_loc = Scanner::Location::invalid();
   4326 
   4327     bool done = (peek() == Token::RPAREN);
   4328     while (!done) {
   4329       bool is_strict_reserved = false;
   4330       Handle<String> param_name =
   4331           ParseIdentifierOrStrictReservedWord(&is_strict_reserved,
   4332                                               CHECK_OK);
   4333 
   4334       // Store locations for possible future error reports.
   4335       if (!name_loc.IsValid() && IsEvalOrArguments(param_name)) {
   4336         name_loc = scanner().location();
   4337       }
   4338       if (!dupe_loc.IsValid() && top_scope_->IsDeclared(param_name)) {
   4339         duplicate_parameters = FunctionLiteral::kHasDuplicateParameters;
   4340         dupe_loc = scanner().location();
   4341       }
   4342       if (!reserved_loc.IsValid() && is_strict_reserved) {
   4343         reserved_loc = scanner().location();
   4344       }
   4345 
   4346       top_scope_->DeclareParameter(param_name, VAR);
   4347       num_parameters++;
   4348       if (num_parameters > Code::kMaxArguments) {
   4349         ReportMessageAt(scanner().location(), "too_many_parameters",
   4350                         Vector<const char*>::empty());
   4351         *ok = false;
   4352         return NULL;
   4353       }
   4354       done = (peek() == Token::RPAREN);
   4355       if (!done) Expect(Token::COMMA, CHECK_OK);
   4356     }
   4357     Expect(Token::RPAREN, CHECK_OK);
   4358 
   4359     Expect(Token::LBRACE, CHECK_OK);
   4360 
   4361     // If we have a named function expression, we add a local variable
   4362     // declaration to the body of the function with the name of the
   4363     // function and let it refer to the function itself (closure).
   4364     // NOTE: We create a proxy and resolve it here so that in the
   4365     // future we can change the AST to only refer to VariableProxies
   4366     // instead of Variables and Proxis as is the case now.
   4367     Variable* fvar = NULL;
   4368     Token::Value fvar_init_op = Token::INIT_CONST;
   4369     if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
   4370       if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY;
   4371       VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST;
   4372       fvar = new(zone()) Variable(top_scope_,
   4373          function_name, fvar_mode, true /* is valid LHS */,
   4374          Variable::NORMAL, kCreatedInitialized, Interface::NewConst());
   4375       VariableProxy* proxy = factory()->NewVariableProxy(fvar);
   4376       VariableDeclaration* fvar_declaration =
   4377           factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_);
   4378       top_scope_->DeclareFunctionVar(fvar_declaration);
   4379     }
   4380 
   4381     // Determine whether the function will be lazily compiled.
   4382     // The heuristics are:
   4383     // - It must not have been prohibited by the caller to Parse (some callers
   4384     //   need a full AST).
   4385     // - The outer scope must allow lazy compilation of inner functions.
   4386     // - The function mustn't be a function expression with an open parenthesis
   4387     //   before; we consider that a hint that the function will be called
   4388     //   immediately, and it would be a waste of time to make it lazily
   4389     //   compiled.
   4390     // These are all things we can know at this point, without looking at the
   4391     // function itself.
   4392     bool is_lazily_compiled = (mode() == PARSE_LAZILY &&
   4393                                top_scope_->AllowsLazyCompilation() &&
   4394                                !parenthesized_function_);
   4395     parenthesized_function_ = false;  // The bit was set for this function only.
   4396 
   4397     if (is_lazily_compiled) {
   4398       int function_block_pos = scanner().location().beg_pos;
   4399       FunctionEntry entry;
   4400       if (pre_parse_data_ != NULL) {
   4401         // If we have pre_parse_data_, we use it to skip parsing the function
   4402         // body.  The preparser data contains the information we need to
   4403         // construct the lazy function.
   4404         entry = pre_parse_data()->GetFunctionEntry(function_block_pos);
   4405         if (entry.is_valid()) {
   4406           if (entry.end_pos() <= function_block_pos) {
   4407             // End position greater than end of stream is safe, and hard
   4408             // to check.
   4409             ReportInvalidPreparseData(function_name, CHECK_OK);
   4410           }
   4411           scanner().SeekForward(entry.end_pos() - 1);
   4412 
   4413           scope->set_end_position(entry.end_pos());
   4414           Expect(Token::RBRACE, CHECK_OK);
   4415           isolate()->counters()->total_preparse_skipped()->Increment(
   4416               scope->end_position() - function_block_pos);
   4417           materialized_literal_count = entry.literal_count();
   4418           expected_property_count = entry.property_count();
   4419           top_scope_->SetLanguageMode(entry.language_mode());
   4420         } else {
   4421           is_lazily_compiled = false;
   4422         }
   4423       } else {
   4424         // With no preparser data, we partially parse the function, without
   4425         // building an AST. This gathers the data needed to build a lazy
   4426         // function.
   4427         SingletonLogger logger;
   4428         preparser::PreParser::PreParseResult result =
   4429             LazyParseFunctionLiteral(&logger);
   4430         if (result == preparser::PreParser::kPreParseStackOverflow) {
   4431           // Propagate stack overflow.
   4432           stack_overflow_ = true;
   4433           *ok = false;
   4434           return NULL;
   4435         }
   4436         if (logger.has_error()) {
   4437           const char* arg = logger.argument_opt();
   4438           Vector<const char*> args;
   4439           if (arg != NULL) {
   4440             args = Vector<const char*>(&arg, 1);
   4441           }
   4442           ReportMessageAt(Scanner::Location(logger.start(), logger.end()),
   4443                           logger.message(), args);
   4444           *ok = false;
   4445           return NULL;
   4446         }
   4447         scope->set_end_position(logger.end());
   4448         Expect(Token::RBRACE, CHECK_OK);
   4449         isolate()->counters()->total_preparse_skipped()->Increment(
   4450             scope->end_position() - function_block_pos);
   4451         materialized_literal_count = logger.literals();
   4452         expected_property_count = logger.properties();
   4453         top_scope_->SetLanguageMode(logger.language_mode());
   4454       }
   4455     }
   4456 
   4457     if (!is_lazily_compiled) {
   4458       ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
   4459       body = new(zone()) ZoneList<Statement*>(8, zone());
   4460       if (fvar != NULL) {
   4461         VariableProxy* fproxy = top_scope_->NewUnresolved(
   4462             factory(), function_name, Interface::NewConst());
   4463         fproxy->BindTo(fvar);
   4464         body->Add(factory()->NewExpressionStatement(
   4465             factory()->NewAssignment(fvar_init_op,
   4466                                      fproxy,
   4467                                      factory()->NewThisFunction(),
   4468                                      RelocInfo::kNoPosition)),
   4469                                      zone());
   4470       }
   4471 
   4472       // For generators, allocate and yield an iterator on function entry.
   4473       if (is_generator) {
   4474         ZoneList<Expression*>* arguments =
   4475             new(zone()) ZoneList<Expression*>(0, zone());
   4476         CallRuntime* allocation = factory()->NewCallRuntime(
   4477             isolate()->factory()->empty_string(),
   4478             Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject),
   4479             arguments);
   4480         VariableProxy* init_proxy = factory()->NewVariableProxy(
   4481             current_function_state_->generator_object_variable());
   4482         Assignment* assignment = factory()->NewAssignment(
   4483             Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition);
   4484         VariableProxy* get_proxy = factory()->NewVariableProxy(
   4485             current_function_state_->generator_object_variable());
   4486         Yield* yield = factory()->NewYield(
   4487             get_proxy, assignment, Yield::INITIAL, RelocInfo::kNoPosition);
   4488         body->Add(factory()->NewExpressionStatement(yield), zone());
   4489       }
   4490 
   4491       ParseSourceElements(body, Token::RBRACE, false, false, CHECK_OK);
   4492 
   4493       if (is_generator) {
   4494         VariableProxy* get_proxy = factory()->NewVariableProxy(
   4495             current_function_state_->generator_object_variable());
   4496         Expression *undefined = factory()->NewLiteral(
   4497             isolate()->factory()->undefined_value());
   4498         Yield* yield = factory()->NewYield(
   4499             get_proxy, undefined, Yield::FINAL, RelocInfo::kNoPosition);
   4500         body->Add(factory()->NewExpressionStatement(yield), zone());
   4501       }
   4502 
   4503       materialized_literal_count = function_state.materialized_literal_count();
   4504       expected_property_count = function_state.expected_property_count();
   4505       handler_count = function_state.handler_count();
   4506 
   4507       Expect(Token::RBRACE, CHECK_OK);
   4508       scope->set_end_position(scanner().location().end_pos);
   4509     }
   4510 
   4511     // Validate strict mode.
   4512     if (!top_scope_->is_classic_mode()) {
   4513       if (IsEvalOrArguments(function_name)) {
   4514         int start_pos = scope->start_position();
   4515         int position = function_token_position != RelocInfo::kNoPosition
   4516             ? function_token_position
   4517             : (start_pos > 0 ? start_pos - 1 : start_pos);
   4518         Scanner::Location location = Scanner::Location(position, start_pos);
   4519         ReportMessageAt(location,
   4520                         "strict_function_name", Vector<const char*>::empty());
   4521         *ok = false;
   4522         return NULL;
   4523       }
   4524       if (name_loc.IsValid()) {
   4525         ReportMessageAt(name_loc, "strict_param_name",
   4526                         Vector<const char*>::empty());
   4527         *ok = false;
   4528         return NULL;
   4529       }
   4530       if (dupe_loc.IsValid()) {
   4531         ReportMessageAt(dupe_loc, "strict_param_dupe",
   4532                         Vector<const char*>::empty());
   4533         *ok = false;
   4534         return NULL;
   4535       }
   4536       if (name_is_strict_reserved) {
   4537         int start_pos = scope->start_position();
   4538         int position = function_token_position != RelocInfo::kNoPosition
   4539             ? function_token_position
   4540             : (start_pos > 0 ? start_pos - 1 : start_pos);
   4541         Scanner::Location location = Scanner::Location(position, start_pos);
   4542         ReportMessageAt(location, "strict_reserved_word",
   4543                         Vector<const char*>::empty());
   4544         *ok = false;
   4545         return NULL;
   4546       }
   4547       if (reserved_loc.IsValid()) {
   4548         ReportMessageAt(reserved_loc, "strict_reserved_word",
   4549                         Vector<const char*>::empty());
   4550         *ok = false;
   4551         return NULL;
   4552       }
   4553       CheckOctalLiteral(scope->start_position(),
   4554                         scope->end_position(),
   4555                         CHECK_OK);
   4556     }
   4557     ast_properties = *factory()->visitor()->ast_properties();
   4558   }
   4559 
   4560   if (is_extended_mode()) {
   4561     CheckConflictingVarDeclarations(scope, CHECK_OK);
   4562   }
   4563 
   4564   FunctionLiteral* function_literal =
   4565       factory()->NewFunctionLiteral(function_name,
   4566                                     scope,
   4567                                     body,
   4568                                     materialized_literal_count,
   4569                                     expected_property_count,
   4570                                     handler_count,
   4571                                     num_parameters,
   4572                                     duplicate_parameters,
   4573                                     function_type,
   4574                                     FunctionLiteral::kIsFunction,
   4575                                     parenthesized,
   4576                                     generator);
   4577   function_literal->set_function_token_position(function_token_position);
   4578   function_literal->set_ast_properties(&ast_properties);
   4579 
   4580   if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal);
   4581   return function_literal;
   4582 }
   4583 
   4584 
   4585 preparser::PreParser::PreParseResult Parser::LazyParseFunctionLiteral(
   4586     SingletonLogger* logger) {
   4587   HistogramTimerScope preparse_scope(isolate()->counters()->pre_parse());
   4588   ASSERT_EQ(Token::LBRACE, scanner().current_token());
   4589 
   4590   if (reusable_preparser_ == NULL) {
   4591     intptr_t stack_limit = isolate()->stack_guard()->real_climit();
   4592     reusable_preparser_ = new preparser::PreParser(&scanner_,
   4593                                                    NULL,
   4594                                                    stack_limit);
   4595     reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping());
   4596     reusable_preparser_->set_allow_modules(allow_modules());
   4597     reusable_preparser_->set_allow_natives_syntax(allow_natives_syntax());
   4598     reusable_preparser_->set_allow_lazy(true);
   4599     reusable_preparser_->set_allow_generators(allow_generators());
   4600     reusable_preparser_->set_allow_for_of(allow_for_of());
   4601     reusable_preparser_->set_allow_harmony_numeric_literals(
   4602         allow_harmony_numeric_literals());
   4603   }
   4604   preparser::PreParser::PreParseResult result =
   4605       reusable_preparser_->PreParseLazyFunction(top_scope_->language_mode(),
   4606                                                 is_generator(),
   4607                                                 logger);
   4608   return result;
   4609 }
   4610 
   4611 
   4612 Expression* Parser::ParseV8Intrinsic(bool* ok) {
   4613   // CallRuntime ::
   4614   //   '%' Identifier Arguments
   4615 
   4616   Expect(Token::MOD, CHECK_OK);
   4617   Handle<String> name = ParseIdentifier(CHECK_OK);
   4618   ZoneList<Expression*>* args = ParseArguments(CHECK_OK);
   4619 
   4620   if (extension_ != NULL) {
   4621     // The extension structures are only accessible while parsing the
   4622     // very first time not when reparsing because of lazy compilation.
   4623     top_scope_->DeclarationScope()->ForceEagerCompilation();
   4624   }
   4625 
   4626   const Runtime::Function* function = Runtime::FunctionForName(name);
   4627 
   4628   // Check for built-in IS_VAR macro.
   4629   if (function != NULL &&
   4630       function->intrinsic_type == Runtime::RUNTIME &&
   4631       function->function_id == Runtime::kIS_VAR) {
   4632     // %IS_VAR(x) evaluates to x if x is a variable,
   4633     // leads to a parse error otherwise.  Could be implemented as an
   4634     // inline function %_IS_VAR(x) to eliminate this special case.
   4635     if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) {
   4636       return args->at(0);
   4637     } else {
   4638       ReportMessage("not_isvar", Vector<const char*>::empty());
   4639       *ok = false;
   4640       return NULL;
   4641     }
   4642   }
   4643 
   4644   // Check that the expected number of arguments are being passed.
   4645   if (function != NULL &&
   4646       function->nargs != -1 &&
   4647       function->nargs != args->length()) {
   4648     ReportMessage("illegal_access", Vector<const char*>::empty());
   4649     *ok = false;
   4650     return NULL;
   4651   }
   4652 
   4653   // Check that the function is defined if it's an inline runtime call.
   4654   if (function == NULL && name->Get(0) == '_') {
   4655     ReportMessage("not_defined", Vector<Handle<String> >(&name, 1));
   4656     *ok = false;
   4657     return NULL;
   4658   }
   4659 
   4660   // We have a valid intrinsics call or a call to a builtin.
   4661   return factory()->NewCallRuntime(name, function, args);
   4662 }
   4663 
   4664 
   4665 bool Parser::peek_any_identifier() {
   4666   Token::Value next = peek();
   4667   return next == Token::IDENTIFIER ||
   4668          next == Token::FUTURE_RESERVED_WORD ||
   4669          next == Token::FUTURE_STRICT_RESERVED_WORD ||
   4670          next == Token::YIELD;
   4671 }
   4672 
   4673 
   4674 void Parser::Consume(Token::Value token) {
   4675   Token::Value next = Next();
   4676   USE(next);
   4677   USE(token);
   4678   ASSERT(next == token);
   4679 }
   4680 
   4681 
   4682 void Parser::Expect(Token::Value token, bool* ok) {
   4683   Token::Value next = Next();
   4684   if (next == token) return;
   4685   ReportUnexpectedToken(next);
   4686   *ok = false;
   4687 }
   4688 
   4689 
   4690 bool Parser::Check(Token::Value token) {
   4691   Token::Value next = peek();
   4692   if (next == token) {
   4693     Consume(next);
   4694     return true;
   4695   }
   4696   return false;
   4697 }
   4698 
   4699 
   4700 bool Parser::CheckContextualKeyword(Vector<const char> keyword) {
   4701   if (peek() == Token::IDENTIFIER &&
   4702       scanner().is_next_contextual_keyword(keyword)) {
   4703     Consume(Token::IDENTIFIER);
   4704     return true;
   4705   }
   4706   return false;
   4707 }
   4708 
   4709 
   4710 void Parser::ExpectSemicolon(bool* ok) {
   4711   // Check for automatic semicolon insertion according to
   4712   // the rules given in ECMA-262, section 7.9, page 21.
   4713   Token::Value tok = peek();
   4714   if (tok == Token::SEMICOLON) {
   4715     Next();
   4716     return;
   4717   }
   4718   if (scanner().HasAnyLineTerminatorBeforeNext() ||
   4719       tok == Token::RBRACE ||
   4720       tok == Token::EOS) {
   4721     return;
   4722   }
   4723   Expect(Token::SEMICOLON, ok);
   4724 }
   4725 
   4726 
   4727 void Parser::ExpectContextualKeyword(Vector<const char> keyword, bool* ok) {
   4728   Expect(Token::IDENTIFIER, ok);
   4729   if (!*ok) return;
   4730   if (!scanner().is_literal_contextual_keyword(keyword)) {
   4731     *ok = false;
   4732     ReportUnexpectedToken(scanner().current_token());
   4733   }
   4734 }
   4735 
   4736 
   4737 Literal* Parser::GetLiteralUndefined() {
   4738   return factory()->NewLiteral(isolate()->factory()->undefined_value());
   4739 }
   4740 
   4741 
   4742 Literal* Parser::GetLiteralTheHole() {
   4743   return factory()->NewLiteral(isolate()->factory()->the_hole_value());
   4744 }
   4745 
   4746 
   4747 // Parses an identifier that is valid for the current scope, in particular it
   4748 // fails on strict mode future reserved keywords in a strict scope.
   4749 Handle<String> Parser::ParseIdentifier(bool* ok) {
   4750   Token::Value next = Next();
   4751   if (next == Token::IDENTIFIER ||
   4752       (top_scope_->is_classic_mode() &&
   4753        (next == Token::FUTURE_STRICT_RESERVED_WORD ||
   4754         (next == Token::YIELD && !is_generator())))) {
   4755     return GetSymbol();
   4756   } else {
   4757     ReportUnexpectedToken(next);
   4758     *ok = false;
   4759     return Handle<String>();
   4760   }
   4761 }
   4762 
   4763 
   4764 // Parses and identifier or a strict mode future reserved word, and indicate
   4765 // whether it is strict mode future reserved.
   4766 Handle<String> Parser::ParseIdentifierOrStrictReservedWord(
   4767     bool* is_strict_reserved, bool* ok) {
   4768   Token::Value next = Next();
   4769   if (next == Token::IDENTIFIER) {
   4770     *is_strict_reserved = false;
   4771   } else if (next == Token::FUTURE_STRICT_RESERVED_WORD ||
   4772              (next == Token::YIELD && !is_generator())) {
   4773     *is_strict_reserved = true;
   4774   } else {
   4775     ReportUnexpectedToken(next);
   4776     *ok = false;
   4777     return Handle<String>();
   4778   }
   4779   return GetSymbol();
   4780 }
   4781 
   4782 
   4783 Handle<String> Parser::ParseIdentifierName(bool* ok) {
   4784   Token::Value next = Next();
   4785   if (next != Token::IDENTIFIER &&
   4786       next != Token::FUTURE_RESERVED_WORD &&
   4787       next != Token::FUTURE_STRICT_RESERVED_WORD &&
   4788       !Token::IsKeyword(next)) {
   4789     ReportUnexpectedToken(next);
   4790     *ok = false;
   4791     return Handle<String>();
   4792   }
   4793   return GetSymbol();
   4794 }
   4795 
   4796 
   4797 void Parser::MarkAsLValue(Expression* expression) {
   4798   VariableProxy* proxy = expression != NULL
   4799       ? expression->AsVariableProxy()
   4800       : NULL;
   4801 
   4802   if (proxy != NULL) proxy->MarkAsLValue();
   4803 }
   4804 
   4805 
   4806 // Checks LHS expression for assignment and prefix/postfix increment/decrement
   4807 // in strict mode.
   4808 void Parser::CheckStrictModeLValue(Expression* expression,
   4809                                    const char* error,
   4810                                    bool* ok) {
   4811   ASSERT(!top_scope_->is_classic_mode());
   4812   VariableProxy* lhs = expression != NULL
   4813       ? expression->AsVariableProxy()
   4814       : NULL;
   4815 
   4816   if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) {
   4817     ReportMessage(error, Vector<const char*>::empty());
   4818     *ok = false;
   4819   }
   4820 }
   4821 
   4822 
   4823 // Checks whether an octal literal was last seen between beg_pos and end_pos.
   4824 // If so, reports an error. Only called for strict mode.
   4825 void Parser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) {
   4826   Scanner::Location octal = scanner().octal_position();
   4827   if (octal.IsValid() &&
   4828       beg_pos <= octal.beg_pos &&
   4829       octal.end_pos <= end_pos) {
   4830     ReportMessageAt(octal, "strict_octal_literal",
   4831                     Vector<const char*>::empty());
   4832     scanner().clear_octal_position();
   4833     *ok = false;
   4834   }
   4835 }
   4836 
   4837 
   4838 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
   4839   Declaration* decl = scope->CheckConflictingVarDeclarations();
   4840   if (decl != NULL) {
   4841     // In harmony mode we treat conflicting variable bindinds as early
   4842     // errors. See ES5 16 for a definition of early errors.
   4843     Handle<String> name = decl->proxy()->name();
   4844     SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS);
   4845     const char* elms[2] = { "Variable", *c_string };
   4846     Vector<const char*> args(elms, 2);
   4847     int position = decl->proxy()->position();
   4848     Scanner::Location location = position == RelocInfo::kNoPosition
   4849         ? Scanner::Location::invalid()
   4850         : Scanner::Location(position, position + 1);
   4851     ReportMessageAt(location, "redeclaration", args);
   4852     *ok = false;
   4853   }
   4854 }
   4855 
   4856 
   4857 // This function reads an identifier name and determines whether or not it
   4858 // is 'get' or 'set'.
   4859 Handle<String> Parser::ParseIdentifierNameOrGetOrSet(bool* is_get,
   4860                                                      bool* is_set,
   4861                                                      bool* ok) {
   4862   Handle<String> result = ParseIdentifierName(ok);
   4863   if (!*ok) return Handle<String>();
   4864   if (scanner().is_literal_ascii() && scanner().literal_length() == 3) {
   4865     const char* token = scanner().literal_ascii_string().start();
   4866     *is_get = strncmp(token, "get", 3) == 0;
   4867     *is_set = !*is_get && strncmp(token, "set", 3) == 0;
   4868   }
   4869   return result;
   4870 }
   4871 
   4872 
   4873 // ----------------------------------------------------------------------------
   4874 // Parser support
   4875 
   4876 
   4877 bool Parser::TargetStackContainsLabel(Handle<String> label) {
   4878   for (Target* t = target_stack_; t != NULL; t = t->previous()) {
   4879     BreakableStatement* stat = t->node()->AsBreakableStatement();
   4880     if (stat != NULL && ContainsLabel(stat->labels(), label))
   4881       return true;
   4882   }
   4883   return false;
   4884 }
   4885 
   4886 
   4887 BreakableStatement* Parser::LookupBreakTarget(Handle<String> label, bool* ok) {
   4888   bool anonymous = label.is_null();
   4889   for (Target* t = target_stack_; t != NULL; t = t->previous()) {
   4890     BreakableStatement* stat = t->node()->AsBreakableStatement();
   4891     if (stat == NULL) continue;
   4892     if ((anonymous && stat->is_target_for_anonymous()) ||
   4893         (!anonymous && ContainsLabel(stat->labels(), label))) {
   4894       RegisterTargetUse(stat->break_target(), t->previous());
   4895       return stat;
   4896     }
   4897   }
   4898   return NULL;
   4899 }
   4900 
   4901 
   4902 IterationStatement* Parser::LookupContinueTarget(Handle<String> label,
   4903                                                  bool* ok) {
   4904   bool anonymous = label.is_null();
   4905   for (Target* t = target_stack_; t != NULL; t = t->previous()) {
   4906     IterationStatement* stat = t->node()->AsIterationStatement();
   4907     if (stat == NULL) continue;
   4908 
   4909     ASSERT(stat->is_target_for_anonymous());
   4910     if (anonymous || ContainsLabel(stat->labels(), label)) {
   4911       RegisterTargetUse(stat->continue_target(), t->previous());
   4912       return stat;
   4913     }
   4914   }
   4915   return NULL;
   4916 }
   4917 
   4918 
   4919 void Parser::RegisterTargetUse(Label* target, Target* stop) {
   4920   // Register that a break target found at the given stop in the
   4921   // target stack has been used from the top of the target stack. Add
   4922   // the break target to any TargetCollectors passed on the stack.
   4923   for (Target* t = target_stack_; t != stop; t = t->previous()) {
   4924     TargetCollector* collector = t->node()->AsTargetCollector();
   4925     if (collector != NULL) collector->AddTarget(target, zone());
   4926   }
   4927 }
   4928 
   4929 
   4930 Expression* Parser::NewThrowReferenceError(Handle<String> message) {
   4931   return NewThrowError(isolate()->factory()->MakeReferenceError_string(),
   4932                        message, HandleVector<Object>(NULL, 0));
   4933 }
   4934 
   4935 
   4936 Expression* Parser::NewThrowSyntaxError(Handle<String> message,
   4937                                         Handle<Object> first) {
   4938   int argc = first.is_null() ? 0 : 1;
   4939   Vector< Handle<Object> > arguments = HandleVector<Object>(&first, argc);
   4940   return NewThrowError(
   4941       isolate()->factory()->MakeSyntaxError_string(), message, arguments);
   4942 }
   4943 
   4944 
   4945 Expression* Parser::NewThrowTypeError(Handle<String> message,
   4946                                       Handle<Object> first,
   4947                                       Handle<Object> second) {
   4948   ASSERT(!first.is_null() && !second.is_null());
   4949   Handle<Object> elements[] = { first, second };
   4950   Vector< Handle<Object> > arguments =
   4951       HandleVector<Object>(elements, ARRAY_SIZE(elements));
   4952   return NewThrowError(
   4953       isolate()->factory()->MakeTypeError_string(), message, arguments);
   4954 }
   4955 
   4956 
   4957 Expression* Parser::NewThrowError(Handle<String> constructor,
   4958                                   Handle<String> message,
   4959                                   Vector< Handle<Object> > arguments) {
   4960   int argc = arguments.length();
   4961   Handle<FixedArray> elements = isolate()->factory()->NewFixedArray(argc,
   4962                                                                     TENURED);
   4963   for (int i = 0; i < argc; i++) {
   4964     Handle<Object> element = arguments[i];
   4965     if (!element.is_null()) {
   4966       elements->set(i, *element);
   4967     }
   4968   }
   4969   Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(
   4970       elements, FAST_ELEMENTS, TENURED);
   4971 
   4972   ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2, zone());
   4973   args->Add(factory()->NewLiteral(message), zone());
   4974   args->Add(factory()->NewLiteral(array), zone());
   4975   CallRuntime* call_constructor =
   4976       factory()->NewCallRuntime(constructor, NULL, args);
   4977   return factory()->NewThrow(call_constructor, scanner().location().beg_pos);
   4978 }
   4979 
   4980 
   4981 // ----------------------------------------------------------------------------
   4982 // Regular expressions
   4983 
   4984 
   4985 RegExpParser::RegExpParser(FlatStringReader* in,
   4986                            Handle<String>* error,
   4987                            bool multiline,
   4988                            Zone* zone)
   4989     : isolate_(Isolate::Current()),
   4990       zone_(zone),
   4991       error_(error),
   4992       captures_(NULL),
   4993       in_(in),
   4994       current_(kEndMarker),
   4995       next_pos_(0),
   4996       capture_count_(0),
   4997       has_more_(true),
   4998       multiline_(multiline),
   4999       simple_(false),
   5000       contains_anchor_(false),
   5001       is_scanned_for_captures_(false),
   5002       failed_(false) {
   5003   Advance();
   5004 }
   5005 
   5006 
   5007 uc32 RegExpParser::Next() {
   5008   if (has_next()) {
   5009     return in()->Get(next_pos_);
   5010   } else {
   5011     return kEndMarker;
   5012   }
   5013 }
   5014 
   5015 
   5016 void RegExpParser::Advance() {
   5017   if (next_pos_ < in()->length()) {
   5018     StackLimitCheck check(isolate());
   5019     if (check.HasOverflowed()) {
   5020       ReportError(CStrVector(Isolate::kStackOverflowMessage));
   5021     } else if (zone()->excess_allocation()) {
   5022       ReportError(CStrVector("Regular expression too large"));
   5023     } else {
   5024       current_ = in()->Get(next_pos_);
   5025       next_pos_++;
   5026     }
   5027   } else {
   5028     current_ = kEndMarker;
   5029     has_more_ = false;
   5030   }
   5031 }
   5032 
   5033 
   5034 void RegExpParser::Reset(int pos) {
   5035   next_pos_ = pos;
   5036   has_more_ = (pos < in()->length());
   5037   Advance();
   5038 }
   5039 
   5040 
   5041 void RegExpParser::Advance(int dist) {
   5042   next_pos_ += dist - 1;
   5043   Advance();
   5044 }
   5045 
   5046 
   5047 bool RegExpParser::simple() {
   5048   return simple_;
   5049 }
   5050 
   5051 
   5052 RegExpTree* RegExpParser::ReportError(Vector<const char> message) {
   5053   failed_ = true;
   5054   *error_ = isolate()->factory()->NewStringFromAscii(message, NOT_TENURED);
   5055   // Zip to the end to make sure the no more input is read.
   5056   current_ = kEndMarker;
   5057   next_pos_ = in()->length();
   5058   return NULL;
   5059 }
   5060 
   5061 
   5062 // Pattern ::
   5063 //   Disjunction
   5064 RegExpTree* RegExpParser::ParsePattern() {
   5065   RegExpTree* result = ParseDisjunction(CHECK_FAILED);
   5066   ASSERT(!has_more());
   5067   // If the result of parsing is a literal string atom, and it has the
   5068   // same length as the input, then the atom is identical to the input.
   5069   if (result->IsAtom() && result->AsAtom()->length() == in()->length()) {
   5070     simple_ = true;
   5071   }
   5072   return result;
   5073 }
   5074 
   5075 
   5076 // Disjunction ::
   5077 //   Alternative
   5078 //   Alternative | Disjunction
   5079 // Alternative ::
   5080 //   [empty]
   5081 //   Term Alternative
   5082 // Term ::
   5083 //   Assertion
   5084 //   Atom
   5085 //   Atom Quantifier
   5086 RegExpTree* RegExpParser::ParseDisjunction() {
   5087   // Used to store current state while parsing subexpressions.
   5088   RegExpParserState initial_state(NULL, INITIAL, 0, zone());
   5089   RegExpParserState* stored_state = &initial_state;
   5090   // Cache the builder in a local variable for quick access.
   5091   RegExpBuilder* builder = initial_state.builder();
   5092   while (true) {
   5093     switch (current()) {
   5094     case kEndMarker:
   5095       if (stored_state->IsSubexpression()) {
   5096         // Inside a parenthesized group when hitting end of input.
   5097         ReportError(CStrVector("Unterminated group") CHECK_FAILED);
   5098       }
   5099       ASSERT_EQ(INITIAL, stored_state->group_type());
   5100       // Parsing completed successfully.
   5101       return builder->ToRegExp();
   5102     case ')': {
   5103       if (!stored_state->IsSubexpression()) {
   5104         ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
   5105       }
   5106       ASSERT_NE(INITIAL, stored_state->group_type());
   5107 
   5108       Advance();
   5109       // End disjunction parsing and convert builder content to new single
   5110       // regexp atom.
   5111       RegExpTree* body = builder->ToRegExp();
   5112 
   5113       int end_capture_index = captures_started();
   5114 
   5115       int capture_index = stored_state->capture_index();
   5116       SubexpressionType group_type = stored_state->group_type();
   5117 
   5118       // Restore previous state.
   5119       stored_state = stored_state->previous_state();
   5120       builder = stored_state->builder();
   5121 
   5122       // Build result of subexpression.
   5123       if (group_type == CAPTURE) {
   5124         RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index);
   5125         captures_->at(capture_index - 1) = capture;
   5126         body = capture;
   5127       } else if (group_type != GROUPING) {
   5128         ASSERT(group_type == POSITIVE_LOOKAHEAD ||
   5129                group_type == NEGATIVE_LOOKAHEAD);
   5130         bool is_positive = (group_type == POSITIVE_LOOKAHEAD);
   5131         body = new(zone()) RegExpLookahead(body,
   5132                                    is_positive,
   5133                                    end_capture_index - capture_index,
   5134                                    capture_index);
   5135       }
   5136       builder->AddAtom(body);
   5137       // For compatability with JSC and ES3, we allow quantifiers after
   5138       // lookaheads, and break in all cases.
   5139       break;
   5140     }
   5141     case '|': {
   5142       Advance();
   5143       builder->NewAlternative();
   5144       continue;
   5145     }
   5146     case '*':
   5147     case '+':
   5148     case '?':
   5149       return ReportError(CStrVector("Nothing to repeat"));
   5150     case '^': {
   5151       Advance();
   5152       if (multiline_) {
   5153         builder->AddAssertion(
   5154             new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE));
   5155       } else {
   5156         builder->AddAssertion(
   5157             new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
   5158         set_contains_anchor();
   5159       }
   5160       continue;
   5161     }
   5162     case '$': {
   5163       Advance();
   5164       RegExpAssertion::AssertionType assertion_type =
   5165           multiline_ ? RegExpAssertion::END_OF_LINE :
   5166                        RegExpAssertion::END_OF_INPUT;
   5167       builder->AddAssertion(new(zone()) RegExpAssertion(assertion_type));
   5168       continue;
   5169     }
   5170     case '.': {
   5171       Advance();
   5172       // everything except \x0a, \x0d, \u2028 and \u2029
   5173       ZoneList<CharacterRange>* ranges =
   5174           new(zone()) ZoneList<CharacterRange>(2, zone());
   5175       CharacterRange::AddClassEscape('.', ranges, zone());
   5176       RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
   5177       builder->AddAtom(atom);
   5178       break;
   5179     }
   5180     case '(': {
   5181       SubexpressionType subexpr_type = CAPTURE;
   5182       Advance();
   5183       if (current() == '?') {
   5184         switch (Next()) {
   5185           case ':':
   5186             subexpr_type = GROUPING;
   5187             break;
   5188           case '=':
   5189             subexpr_type = POSITIVE_LOOKAHEAD;
   5190             break;
   5191           case '!':
   5192             subexpr_type = NEGATIVE_LOOKAHEAD;
   5193             break;
   5194           default:
   5195             ReportError(CStrVector("Invalid group") CHECK_FAILED);
   5196             break;
   5197         }
   5198         Advance(2);
   5199       } else {
   5200         if (captures_ == NULL) {
   5201           captures_ = new(zone()) ZoneList<RegExpCapture*>(2, zone());
   5202         }
   5203         if (captures_started() >= kMaxCaptures) {
   5204           ReportError(CStrVector("Too many captures") CHECK_FAILED);
   5205         }
   5206         captures_->Add(NULL, zone());
   5207       }
   5208       // Store current state and begin new disjunction parsing.
   5209       stored_state = new(zone()) RegExpParserState(stored_state, subexpr_type,
   5210                                                    captures_started(), zone());
   5211       builder = stored_state->builder();
   5212       continue;
   5213     }
   5214     case '[': {
   5215       RegExpTree* atom = ParseCharacterClass(CHECK_FAILED);
   5216       builder->AddAtom(atom);
   5217       break;
   5218     }
   5219     // Atom ::
   5220     //   \ AtomEscape
   5221     case '\\':
   5222       switch (Next()) {
   5223       case kEndMarker:
   5224         return ReportError(CStrVector("\\ at end of pattern"));
   5225       case 'b':
   5226         Advance(2);
   5227         builder->AddAssertion(
   5228             new(zone()) RegExpAssertion(RegExpAssertion::BOUNDARY));
   5229         continue;
   5230       case 'B':
   5231         Advance(2);
   5232         builder->AddAssertion(
   5233             new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY));
   5234         continue;
   5235       // AtomEscape ::
   5236       //   CharacterClassEscape
   5237       //
   5238       // CharacterClassEscape :: one of
   5239       //   d D s S w W
   5240       case 'd': case 'D': case 's': case 'S': case 'w': case 'W': {
   5241         uc32 c = Next();
   5242         Advance(2);
   5243         ZoneList<CharacterRange>* ranges =
   5244             new(zone()) ZoneList<CharacterRange>(2, zone());
   5245         CharacterRange::AddClassEscape(c, ranges, zone());
   5246         RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
   5247         builder->AddAtom(atom);
   5248         break;
   5249       }
   5250       case '1': case '2': case '3': case '4': case '5': case '6':
   5251       case '7': case '8': case '9': {
   5252         int index = 0;
   5253         if (ParseBackReferenceIndex(&index)) {
   5254           RegExpCapture* capture = NULL;
   5255           if (captures_ != NULL && index <= captures_->length()) {
   5256             capture = captures_->at(index - 1);
   5257           }
   5258           if (capture == NULL) {
   5259             builder->AddEmpty();
   5260             break;
   5261           }
   5262           RegExpTree* atom = new(zone()) RegExpBackReference(capture);
   5263           builder->AddAtom(atom);
   5264           break;
   5265         }
   5266         uc32 first_digit = Next();
   5267         if (first_digit == '8' || first_digit == '9') {
   5268           // Treat as identity escape
   5269           builder->AddCharacter(first_digit);
   5270           Advance(2);
   5271           break;
   5272         }
   5273       }
   5274       // FALLTHROUGH
   5275       case '0': {
   5276         Advance();
   5277         uc32 octal = ParseOctalLiteral();
   5278         builder->AddCharacter(octal);
   5279         break;
   5280       }
   5281       // ControlEscape :: one of
   5282       //   f n r t v
   5283       case 'f':
   5284         Advance(2);
   5285         builder->AddCharacter('\f');
   5286         break;
   5287       case 'n':
   5288         Advance(2);
   5289         builder->AddCharacter('\n');
   5290         break;
   5291       case 'r':
   5292         Advance(2);
   5293         builder->AddCharacter('\r');
   5294         break;
   5295       case 't':
   5296         Advance(2);
   5297         builder->AddCharacter('\t');
   5298         break;
   5299       case 'v':
   5300         Advance(2);
   5301         builder->AddCharacter('\v');
   5302         break;
   5303       case 'c': {
   5304         Advance();
   5305         uc32 controlLetter = Next();
   5306         // Special case if it is an ASCII letter.
   5307         // Convert lower case letters to uppercase.
   5308         uc32 letter = controlLetter & ~('a' ^ 'A');
   5309         if (letter < 'A' || 'Z' < letter) {
   5310           // controlLetter is not in range 'A'-'Z' or 'a'-'z'.
   5311           // This is outside the specification. We match JSC in
   5312           // reading the backslash as a literal character instead
   5313           // of as starting an escape.
   5314           builder->AddCharacter('\\');
   5315         } else {
   5316           Advance(2);
   5317           builder->AddCharacter(controlLetter & 0x1f);
   5318         }
   5319         break;
   5320       }
   5321       case 'x': {
   5322         Advance(2);
   5323         uc32 value;
   5324         if (ParseHexEscape(2, &value)) {
   5325           builder->AddCharacter(value);
   5326         } else {
   5327           builder->AddCharacter('x');
   5328         }
   5329         break;
   5330       }
   5331       case 'u': {
   5332         Advance(2);
   5333         uc32 value;
   5334         if (ParseHexEscape(4, &value)) {
   5335           builder->AddCharacter(value);
   5336         } else {
   5337           builder->AddCharacter('u');
   5338         }
   5339         break;
   5340       }
   5341       default:
   5342         // Identity escape.
   5343         builder->AddCharacter(Next());
   5344         Advance(2);
   5345         break;
   5346       }
   5347       break;
   5348     case '{': {
   5349       int dummy;
   5350       if (ParseIntervalQuantifier(&dummy, &dummy)) {
   5351         ReportError(CStrVector("Nothing to repeat") CHECK_FAILED);
   5352       }
   5353       // fallthrough
   5354     }
   5355     default:
   5356       builder->AddCharacter(current());
   5357       Advance();
   5358       break;
   5359     }  // end switch(current())
   5360 
   5361     int min;
   5362     int max;
   5363     switch (current()) {
   5364     // QuantifierPrefix ::
   5365     //   *
   5366     //   +
   5367     //   ?
   5368     //   {
   5369     case '*':
   5370       min = 0;
   5371       max = RegExpTree::kInfinity;
   5372       Advance();
   5373       break;
   5374     case '+':
   5375       min = 1;
   5376       max = RegExpTree::kInfinity;
   5377       Advance();
   5378       break;
   5379     case '?':
   5380       min = 0;
   5381       max = 1;
   5382       Advance();
   5383       break;
   5384     case '{':
   5385       if (ParseIntervalQuantifier(&min, &max)) {
   5386         if (max < min) {
   5387           ReportError(CStrVector("numbers out of order in {} quantifier.")
   5388                       CHECK_FAILED);
   5389         }
   5390         break;
   5391       } else {
   5392         continue;
   5393       }
   5394     default:
   5395       continue;
   5396     }
   5397     RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY;
   5398     if (current() == '?') {
   5399       quantifier_type = RegExpQuantifier::NON_GREEDY;
   5400       Advance();
   5401     } else if (FLAG_regexp_possessive_quantifier && current() == '+') {
   5402       // FLAG_regexp_possessive_quantifier is a debug-only flag.
   5403       quantifier_type = RegExpQuantifier::POSSESSIVE;
   5404       Advance();
   5405     }
   5406     builder->AddQuantifierToAtom(min, max, quantifier_type);
   5407   }
   5408 }
   5409 
   5410 
   5411 #ifdef DEBUG
   5412 // Currently only used in an ASSERT.
   5413 static bool IsSpecialClassEscape(uc32 c) {
   5414   switch (c) {
   5415     case 'd': case 'D':
   5416     case 's': case 'S':
   5417     case 'w': case 'W':
   5418       return true;
   5419     default:
   5420       return false;
   5421   }
   5422 }
   5423 #endif
   5424 
   5425 
   5426 // In order to know whether an escape is a backreference or not we have to scan
   5427 // the entire regexp and find the number of capturing parentheses.  However we
   5428 // don't want to scan the regexp twice unless it is necessary.  This mini-parser
   5429 // is called when needed.  It can see the difference between capturing and
   5430 // noncapturing parentheses and can skip character classes and backslash-escaped
   5431 // characters.
   5432 void RegExpParser::ScanForCaptures() {
   5433   // Start with captures started previous to current position
   5434   int capture_count = captures_started();
   5435   // Add count of captures after this position.
   5436   int n;
   5437   while ((n = current()) != kEndMarker) {
   5438     Advance();
   5439     switch (n) {
   5440       case '\\':
   5441         Advance();
   5442         break;
   5443       case '[': {
   5444         int c;
   5445         while ((c = current()) != kEndMarker) {
   5446           Advance();
   5447           if (c == '\\') {
   5448             Advance();
   5449           } else {
   5450             if (c == ']') break;
   5451           }
   5452         }
   5453         break;
   5454       }
   5455       case '(':
   5456         if (current() != '?') capture_count++;
   5457         break;
   5458     }
   5459   }
   5460   capture_count_ = capture_count;
   5461   is_scanned_for_captures_ = true;
   5462 }
   5463 
   5464 
   5465 bool RegExpParser::ParseBackReferenceIndex(int* index_out) {
   5466   ASSERT_EQ('\\', current());
   5467   ASSERT('1' <= Next() && Next() <= '9');
   5468   // Try to parse a decimal literal that is no greater than the total number
   5469   // of left capturing parentheses in the input.
   5470   int start = position();
   5471   int value = Next() - '0';
   5472   Advance(2);
   5473   while (true) {
   5474     uc32 c = current();
   5475     if (IsDecimalDigit(c)) {
   5476       value = 10 * value + (c - '0');
   5477       if (value > kMaxCaptures) {
   5478         Reset(start);
   5479         return false;
   5480       }
   5481       Advance();
   5482     } else {
   5483       break;
   5484     }
   5485   }
   5486   if (value > captures_started()) {
   5487     if (!is_scanned_for_captures_) {
   5488       int saved_position = position();
   5489       ScanForCaptures();
   5490       Reset(saved_position);
   5491     }
   5492     if (value > capture_count_) {
   5493       Reset(start);
   5494       return false;
   5495     }
   5496   }
   5497   *index_out = value;
   5498   return true;
   5499 }
   5500 
   5501 
   5502 // QuantifierPrefix ::
   5503 //   { DecimalDigits }
   5504 //   { DecimalDigits , }
   5505 //   { DecimalDigits , DecimalDigits }
   5506 //
   5507 // Returns true if parsing succeeds, and set the min_out and max_out
   5508 // values. Values are truncated to RegExpTree::kInfinity if they overflow.
   5509 bool RegExpParser::ParseIntervalQuantifier(int* min_out, int* max_out) {
   5510   ASSERT_EQ(current(), '{');
   5511   int start = position();
   5512   Advance();
   5513   int min = 0;
   5514   if (!IsDecimalDigit(current())) {
   5515     Reset(start);
   5516     return false;
   5517   }
   5518   while (IsDecimalDigit(current())) {
   5519     int next = current() - '0';
   5520     if (min > (RegExpTree::kInfinity - next) / 10) {
   5521       // Overflow. Skip past remaining decimal digits and return -1.
   5522       do {
   5523         Advance();
   5524       } while (IsDecimalDigit(current()));
   5525       min = RegExpTree::kInfinity;
   5526       break;
   5527     }
   5528     min = 10 * min + next;
   5529     Advance();
   5530   }
   5531   int max = 0;
   5532   if (current() == '}') {
   5533     max = min;
   5534     Advance();
   5535   } else if (current() == ',') {
   5536     Advance();
   5537     if (current() == '}') {
   5538       max = RegExpTree::kInfinity;
   5539       Advance();
   5540     } else {
   5541       while (IsDecimalDigit(current())) {
   5542         int next = current() - '0';
   5543         if (max > (RegExpTree::kInfinity - next) / 10) {
   5544           do {
   5545             Advance();
   5546           } while (IsDecimalDigit(current()));
   5547           max = RegExpTree::kInfinity;
   5548           break;
   5549         }
   5550         max = 10 * max + next;
   5551         Advance();
   5552       }
   5553       if (current() != '}') {
   5554         Reset(start);
   5555         return false;
   5556       }
   5557       Advance();
   5558     }
   5559   } else {
   5560     Reset(start);
   5561     return false;
   5562   }
   5563   *min_out = min;
   5564   *max_out = max;
   5565   return true;
   5566 }
   5567 
   5568 
   5569 uc32 RegExpParser::ParseOctalLiteral() {
   5570   ASSERT('0' <= current() && current() <= '7');
   5571   // For compatibility with some other browsers (not all), we parse
   5572   // up to three octal digits with a value below 256.
   5573   uc32 value = current() - '0';
   5574   Advance();
   5575   if ('0' <= current() && current() <= '7') {
   5576     value = value * 8 + current() - '0';
   5577     Advance();
   5578     if (value < 32 && '0' <= current() && current() <= '7') {
   5579       value = value * 8 + current() - '0';
   5580       Advance();
   5581     }
   5582   }
   5583   return value;
   5584 }
   5585 
   5586 
   5587 bool RegExpParser::ParseHexEscape(int length, uc32 *value) {
   5588   int start = position();
   5589   uc32 val = 0;
   5590   bool done = false;
   5591   for (int i = 0; !done; i++) {
   5592     uc32 c = current();
   5593     int d = HexValue(c);
   5594     if (d < 0) {
   5595       Reset(start);
   5596       return false;
   5597     }
   5598     val = val * 16 + d;
   5599     Advance();
   5600     if (i == length - 1) {
   5601       done = true;
   5602     }
   5603   }
   5604   *value = val;
   5605   return true;
   5606 }
   5607 
   5608 
   5609 uc32 RegExpParser::ParseClassCharacterEscape() {
   5610   ASSERT(current() == '\\');
   5611   ASSERT(has_next() && !IsSpecialClassEscape(Next()));
   5612   Advance();
   5613   switch (current()) {
   5614     case 'b':
   5615       Advance();
   5616       return '\b';
   5617     // ControlEscape :: one of
   5618     //   f n r t v
   5619     case 'f':
   5620       Advance();
   5621       return '\f';
   5622     case 'n':
   5623       Advance();
   5624       return '\n';
   5625     case 'r':
   5626       Advance();
   5627       return '\r';
   5628     case 't':
   5629       Advance();
   5630       return '\t';
   5631     case 'v':
   5632       Advance();
   5633       return '\v';
   5634     case 'c': {
   5635       uc32 controlLetter = Next();
   5636       uc32 letter = controlLetter & ~('A' ^ 'a');
   5637       // For compatibility with JSC, inside a character class
   5638       // we also accept digits and underscore as control characters.
   5639       if ((controlLetter >= '0' && controlLetter <= '9') ||
   5640           controlLetter == '_' ||
   5641           (letter >= 'A' && letter <= 'Z')) {
   5642         Advance(2);
   5643         // Control letters mapped to ASCII control characters in the range
   5644         // 0x00-0x1f.
   5645         return controlLetter & 0x1f;
   5646       }
   5647       // We match JSC in reading the backslash as a literal
   5648       // character instead of as starting an escape.
   5649       return '\\';
   5650     }
   5651     case '0': case '1': case '2': case '3': case '4': case '5':
   5652     case '6': case '7':
   5653       // For compatibility, we interpret a decimal escape that isn't
   5654       // a back reference (and therefore either \0 or not valid according
   5655       // to the specification) as a 1..3 digit octal character code.
   5656       return ParseOctalLiteral();
   5657     case 'x': {
   5658       Advance();
   5659       uc32 value;
   5660       if (ParseHexEscape(2, &value)) {
   5661         return value;
   5662       }
   5663       // If \x is not followed by a two-digit hexadecimal, treat it
   5664       // as an identity escape.
   5665       return 'x';
   5666     }
   5667     case 'u': {
   5668       Advance();
   5669       uc32 value;
   5670       if (ParseHexEscape(4, &value)) {
   5671         return value;
   5672       }
   5673       // If \u is not followed by a four-digit hexadecimal, treat it
   5674       // as an identity escape.
   5675       return 'u';
   5676     }
   5677     default: {
   5678       // Extended identity escape. We accept any character that hasn't
   5679       // been matched by a more specific case, not just the subset required
   5680       // by the ECMAScript specification.
   5681       uc32 result = current();
   5682       Advance();
   5683       return result;
   5684     }
   5685   }
   5686   return 0;
   5687 }
   5688 
   5689 
   5690 CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) {
   5691   ASSERT_EQ(0, *char_class);
   5692   uc32 first = current();
   5693   if (first == '\\') {
   5694     switch (Next()) {
   5695       case 'w': case 'W': case 'd': case 'D': case 's': case 'S': {
   5696         *char_class = Next();
   5697         Advance(2);
   5698         return CharacterRange::Singleton(0);  // Return dummy value.
   5699       }
   5700       case kEndMarker:
   5701         return ReportError(CStrVector("\\ at end of pattern"));
   5702       default:
   5703         uc32 c = ParseClassCharacterEscape(CHECK_FAILED);
   5704         return CharacterRange::Singleton(c);
   5705     }
   5706   } else {
   5707     Advance();
   5708     return CharacterRange::Singleton(first);
   5709   }
   5710 }
   5711 
   5712 
   5713 static const uc16 kNoCharClass = 0;
   5714 
   5715 // Adds range or pre-defined character class to character ranges.
   5716 // If char_class is not kInvalidClass, it's interpreted as a class
   5717 // escape (i.e., 's' means whitespace, from '\s').
   5718 static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges,
   5719                                     uc16 char_class,
   5720                                     CharacterRange range,
   5721                                     Zone* zone) {
   5722   if (char_class != kNoCharClass) {
   5723     CharacterRange::AddClassEscape(char_class, ranges, zone);
   5724   } else {
   5725     ranges->Add(range, zone);
   5726   }
   5727 }
   5728 
   5729 
   5730 RegExpTree* RegExpParser::ParseCharacterClass() {
   5731   static const char* kUnterminated = "Unterminated character class";
   5732   static const char* kRangeOutOfOrder = "Range out of order in character class";
   5733 
   5734   ASSERT_EQ(current(), '[');
   5735   Advance();
   5736   bool is_negated = false;
   5737   if (current() == '^') {
   5738     is_negated = true;
   5739     Advance();
   5740   }
   5741   ZoneList<CharacterRange>* ranges =
   5742       new(zone()) ZoneList<CharacterRange>(2, zone());
   5743   while (has_more() && current() != ']') {
   5744     uc16 char_class = kNoCharClass;
   5745     CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
   5746     if (current() == '-') {
   5747       Advance();
   5748       if (current() == kEndMarker) {
   5749         // If we reach the end we break out of the loop and let the
   5750         // following code report an error.
   5751         break;
   5752       } else if (current() == ']') {
   5753         AddRangeOrEscape(ranges, char_class, first, zone());
   5754         ranges->Add(CharacterRange::Singleton('-'), zone());
   5755         break;
   5756       }
   5757       uc16 char_class_2 = kNoCharClass;
   5758       CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED);
   5759       if (char_class != kNoCharClass || char_class_2 != kNoCharClass) {
   5760         // Either end is an escaped character class. Treat the '-' verbatim.
   5761         AddRangeOrEscape(ranges, char_class, first, zone());
   5762         ranges->Add(CharacterRange::Singleton('-'), zone());
   5763         AddRangeOrEscape(ranges, char_class_2, next, zone());
   5764         continue;
   5765       }
   5766       if (first.from() > next.to()) {
   5767         return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED);
   5768       }
   5769       ranges->Add(CharacterRange::Range(first.from(), next.to()), zone());
   5770     } else {
   5771       AddRangeOrEscape(ranges, char_class, first, zone());
   5772     }
   5773   }
   5774   if (!has_more()) {
   5775     return ReportError(CStrVector(kUnterminated) CHECK_FAILED);
   5776   }
   5777   Advance();
   5778   if (ranges->length() == 0) {
   5779     ranges->Add(CharacterRange::Everything(), zone());
   5780     is_negated = !is_negated;
   5781   }
   5782   return new(zone()) RegExpCharacterClass(ranges, is_negated);
   5783 }
   5784 
   5785 
   5786 // ----------------------------------------------------------------------------
   5787 // The Parser interface.
   5788 
   5789 ParserMessage::~ParserMessage() {
   5790   for (int i = 0; i < args().length(); i++)
   5791     DeleteArray(args()[i]);
   5792   DeleteArray(args().start());
   5793 }
   5794 
   5795 
   5796 ScriptDataImpl::~ScriptDataImpl() {
   5797   if (owns_store_) store_.Dispose();
   5798 }
   5799 
   5800 
   5801 int ScriptDataImpl::Length() {
   5802   return store_.length() * sizeof(unsigned);
   5803 }
   5804 
   5805 
   5806 const char* ScriptDataImpl::Data() {
   5807   return reinterpret_cast<const char*>(store_.start());
   5808 }
   5809 
   5810 
   5811 bool ScriptDataImpl::HasError() {
   5812   return has_error();
   5813 }
   5814 
   5815 
   5816 void ScriptDataImpl::Initialize() {
   5817   // Prepares state for use.
   5818   if (store_.length() >= PreparseDataConstants::kHeaderSize) {
   5819     function_index_ = PreparseDataConstants::kHeaderSize;
   5820     int symbol_data_offset = PreparseDataConstants::kHeaderSize
   5821         + store_[PreparseDataConstants::kFunctionsSizeOffset];
   5822     if (store_.length() > symbol_data_offset) {
   5823       symbol_data_ = reinterpret_cast<byte*>(&store_[symbol_data_offset]);
   5824     } else {
   5825       // Partial preparse causes no symbol information.
   5826       symbol_data_ = reinterpret_cast<byte*>(&store_[0] + store_.length());
   5827     }
   5828     symbol_data_end_ = reinterpret_cast<byte*>(&store_[0] + store_.length());
   5829   }
   5830 }
   5831 
   5832 
   5833 int ScriptDataImpl::ReadNumber(byte** source) {
   5834   // Reads a number from symbol_data_ in base 128. The most significant
   5835   // bit marks that there are more digits.
   5836   // If the first byte is 0x80 (kNumberTerminator), it would normally
   5837   // represent a leading zero. Since that is useless, and therefore won't
   5838   // appear as the first digit of any actual value, it is used to
   5839   // mark the end of the input stream.
   5840   byte* data = *source;
   5841   if (data >= symbol_data_end_) return -1;
   5842   byte input = *data;
   5843   if (input == PreparseDataConstants::kNumberTerminator) {
   5844     // End of stream marker.
   5845     return -1;
   5846   }
   5847   int result = input & 0x7f;
   5848   data++;
   5849   while ((input & 0x80u) != 0) {
   5850     if (data >= symbol_data_end_) return -1;
   5851     input = *data;
   5852     result = (result << 7) | (input & 0x7f);
   5853     data++;
   5854   }
   5855   *source = data;
   5856   return result;
   5857 }
   5858 
   5859 
   5860 // Create a Scanner for the preparser to use as input, and preparse the source.
   5861 ScriptDataImpl* PreParserApi::PreParse(Utf16CharacterStream* source) {
   5862   CompleteParserRecorder recorder;
   5863   Isolate* isolate = Isolate::Current();
   5864   HistogramTimerScope timer(isolate->counters()->pre_parse());
   5865   Scanner scanner(isolate->unicode_cache());
   5866   intptr_t stack_limit = isolate->stack_guard()->real_climit();
   5867   preparser::PreParser preparser(&scanner, &recorder, stack_limit);
   5868   preparser.set_allow_lazy(true);
   5869   preparser.set_allow_generators(FLAG_harmony_generators);
   5870   preparser.set_allow_for_of(FLAG_harmony_iteration);
   5871   preparser.set_allow_harmony_scoping(FLAG_harmony_scoping);
   5872   preparser.set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
   5873   scanner.Initialize(source);
   5874   preparser::PreParser::PreParseResult result = preparser.PreParseProgram();
   5875   if (result == preparser::PreParser::kPreParseStackOverflow) {
   5876     isolate->StackOverflow();
   5877     return NULL;
   5878   }
   5879 
   5880   // Extract the accumulated data from the recorder as a single
   5881   // contiguous vector that we are responsible for disposing.
   5882   Vector<unsigned> store = recorder.ExtractData();
   5883   return new ScriptDataImpl(store);
   5884 }
   5885 
   5886 
   5887 bool RegExpParser::ParseRegExp(FlatStringReader* input,
   5888                                bool multiline,
   5889                                RegExpCompileData* result,
   5890                                Zone* zone) {
   5891   ASSERT(result != NULL);
   5892   RegExpParser parser(input, &result->error, multiline, zone);
   5893   RegExpTree* tree = parser.ParsePattern();
   5894   if (parser.failed()) {
   5895     ASSERT(tree == NULL);
   5896     ASSERT(!result->error.is_null());
   5897   } else {
   5898     ASSERT(tree != NULL);
   5899     ASSERT(result->error.is_null());
   5900     result->tree = tree;
   5901     int capture_count = parser.captures_started();
   5902     result->simple = tree->IsAtom() && parser.simple() && capture_count == 0;
   5903     result->contains_anchor = parser.contains_anchor();
   5904     result->capture_count = capture_count;
   5905   }
   5906   return !parser.failed();
   5907 }
   5908 
   5909 
   5910 bool Parser::Parse() {
   5911   ASSERT(info()->function() == NULL);
   5912   FunctionLiteral* result = NULL;
   5913   if (info()->is_lazy()) {
   5914     ASSERT(!info()->is_eval());
   5915     if (info()->shared_info()->is_function()) {
   5916       result = ParseLazy();
   5917     } else {
   5918       result = ParseProgram();
   5919     }
   5920   } else {
   5921     ScriptDataImpl* pre_parse_data = info()->pre_parse_data();
   5922     set_pre_parse_data(pre_parse_data);
   5923     if (pre_parse_data != NULL && pre_parse_data->has_error()) {
   5924       Scanner::Location loc = pre_parse_data->MessageLocation();
   5925       const char* message = pre_parse_data->BuildMessage();
   5926       Vector<const char*> args = pre_parse_data->BuildArgs();
   5927       ReportMessageAt(loc, message, args);
   5928       DeleteArray(message);
   5929       for (int i = 0; i < args.length(); i++) {
   5930         DeleteArray(args[i]);
   5931       }
   5932       DeleteArray(args.start());
   5933       ASSERT(info()->isolate()->has_pending_exception());
   5934     } else {
   5935       result = ParseProgram();
   5936     }
   5937   }
   5938   info()->SetFunction(result);
   5939   return (result != NULL);
   5940 }
   5941 
   5942 } }  // namespace v8::internal
   5943