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