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