OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <cmath> | 5 #include <cmath> |
6 | 6 |
7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 // | 172 // |
173 // HoistableDeclaration[Yield, Default] : | 173 // HoistableDeclaration[Yield, Default] : |
174 // FunctionDeclaration[?Yield, ?Default] | 174 // FunctionDeclaration[?Yield, ?Default] |
175 // GeneratorDeclaration[?Yield, ?Default] | 175 // GeneratorDeclaration[?Yield, ?Default] |
176 // | 176 // |
177 // LexicalDeclaration[In, Yield] : | 177 // LexicalDeclaration[In, Yield] : |
178 // LetOrConst BindingList[?In, ?Yield] ; | 178 // LetOrConst BindingList[?In, ?Yield] ; |
179 | 179 |
180 switch (peek()) { | 180 switch (peek()) { |
181 case Token::FUNCTION: | 181 case Token::FUNCTION: |
182 return ParseFunctionDeclaration(ok); | 182 return ParseHoistableDeclaration(ok); |
183 case Token::CLASS: | 183 case Token::CLASS: |
184 return ParseClassDeclaration(ok); | 184 return ParseClassDeclaration(ok); |
185 case Token::CONST: | 185 case Token::CONST: |
186 return ParseVariableStatement(kStatementListItem, ok); | 186 return ParseVariableStatement(kStatementListItem, ok); |
187 case Token::LET: | 187 case Token::LET: |
188 if (IsNextLetKeyword()) { | 188 if (IsNextLetKeyword()) { |
189 return ParseVariableStatement(kStatementListItem, ok); | 189 return ParseVariableStatement(kStatementListItem, ok); |
190 } | 190 } |
191 break; | 191 break; |
192 default: | 192 default: |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 | 371 |
372 case Token::VAR: | 372 case Token::VAR: |
373 return ParseVariableStatement(kStatement, ok); | 373 return ParseVariableStatement(kStatement, ok); |
374 | 374 |
375 default: | 375 default: |
376 return ParseExpressionOrLabelledStatement(allow_function, ok); | 376 return ParseExpressionOrLabelledStatement(allow_function, ok); |
377 } | 377 } |
378 } | 378 } |
379 | 379 |
380 | 380 |
381 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { | 381 PreParser::Statement PreParser::ParseHoistableDeclaration( |
382 // FunctionDeclaration :: | 382 int pos, bool is_generator, bool* ok) { |
383 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | |
384 // GeneratorDeclaration :: | |
385 // 'function' '*' Identifier '(' FormalParameterListopt ')' | |
386 // '{' FunctionBody '}' | |
387 Expect(Token::FUNCTION, CHECK_OK); | |
388 int pos = position(); | |
389 bool is_generator = Check(Token::MUL); | |
390 bool is_strict_reserved = false; | 383 bool is_strict_reserved = false; |
391 Identifier name = ParseIdentifierOrStrictReservedWord( | 384 Identifier name = ParseIdentifierOrStrictReservedWord( |
392 &is_strict_reserved, CHECK_OK); | 385 &is_strict_reserved, CHECK_OK); |
393 ParseFunctionLiteral(name, scanner()->location(), | 386 ParseFunctionLiteral(name, scanner()->location(), |
394 is_strict_reserved ? kFunctionNameIsStrictReserved | 387 is_strict_reserved ? kFunctionNameIsStrictReserved |
395 : kFunctionNameValidityUnknown, | 388 : kFunctionNameValidityUnknown, |
396 is_generator ? FunctionKind::kGeneratorFunction | 389 is_generator ? FunctionKind::kGeneratorFunction |
397 : FunctionKind::kNormalFunction, | 390 : FunctionKind::kNormalFunction, |
398 pos, FunctionLiteral::kDeclaration, language_mode(), | 391 pos, FunctionLiteral::kDeclaration, language_mode(), |
399 CHECK_OK); | 392 CHECK_OK); |
400 return Statement::FunctionDeclaration(); | 393 return Statement::FunctionDeclaration(); |
401 } | 394 } |
402 | 395 |
403 | 396 |
| 397 PreParser::Statement PreParser::ParseHoistableDeclaration(bool* ok) { |
| 398 // FunctionDeclaration :: |
| 399 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| 400 // GeneratorDeclaration :: |
| 401 // 'function' '*' Identifier '(' FormalParameterListopt ')' |
| 402 // '{' FunctionBody '}' |
| 403 Expect(Token::FUNCTION, CHECK_OK); |
| 404 int pos = position(); |
| 405 bool is_generator = Check(Token::MUL); |
| 406 return ParseHoistableDeclaration(pos, is_generator, CHECK_OK); |
| 407 } |
| 408 |
| 409 |
404 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { | 410 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { |
405 Expect(Token::CLASS, CHECK_OK); | 411 Expect(Token::CLASS, CHECK_OK); |
406 | 412 |
407 int pos = position(); | 413 int pos = position(); |
408 bool is_strict_reserved = false; | 414 bool is_strict_reserved = false; |
409 Identifier name = | 415 Identifier name = |
410 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 416 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
411 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, | 417 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, |
412 CHECK_OK); | 418 CHECK_OK); |
413 return Statement::Default(); | 419 return Statement::Default(); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 *bindings_loc = | 552 *bindings_loc = |
547 Scanner::Location(bindings_start, scanner()->location().end_pos); | 553 Scanner::Location(bindings_start, scanner()->location().end_pos); |
548 } | 554 } |
549 | 555 |
550 if (num_decl != nullptr) *num_decl = nvars; | 556 if (num_decl != nullptr) *num_decl = nvars; |
551 if (is_lexical != nullptr) *is_lexical = lexical; | 557 if (is_lexical != nullptr) *is_lexical = lexical; |
552 if (is_binding_pattern != nullptr) *is_binding_pattern = is_pattern; | 558 if (is_binding_pattern != nullptr) *is_binding_pattern = is_pattern; |
553 return Statement::Default(); | 559 return Statement::Default(); |
554 } | 560 } |
555 | 561 |
| 562 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { |
| 563 Consume(Token::FUNCTION); |
| 564 int pos = position(); |
| 565 bool is_generator = Check(Token::MUL); |
| 566 if (allow_harmony_restrictive_declarations() && is_generator) { |
| 567 PreParserTraits::ReportMessageAt( |
| 568 scanner()->location(), |
| 569 MessageTemplate::kGeneratorInLegacyContext); |
| 570 *ok = false; |
| 571 return Statement::Default(); |
| 572 } |
| 573 return ParseHoistableDeclaration(pos, is_generator, ok); |
| 574 } |
| 575 |
556 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement( | 576 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement( |
557 AllowLabelledFunctionStatement allow_function, bool* ok) { | 577 AllowLabelledFunctionStatement allow_function, bool* ok) { |
558 // ExpressionStatement | LabelledStatement :: | 578 // ExpressionStatement | LabelledStatement :: |
559 // Expression ';' | 579 // Expression ';' |
560 // Identifier ':' Statement | 580 // Identifier ':' Statement |
561 | 581 |
562 switch (peek()) { | 582 switch (peek()) { |
563 case Token::FUNCTION: | 583 case Token::FUNCTION: |
564 case Token::LBRACE: | 584 case Token::LBRACE: |
565 UNREACHABLE(); // Always handled by the callers. | 585 UNREACHABLE(); // Always handled by the callers. |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 } | 1218 } |
1199 Expect(Token::RBRACE, CHECK_OK); | 1219 Expect(Token::RBRACE, CHECK_OK); |
1200 return PreParserExpression::Default(); | 1220 return PreParserExpression::Default(); |
1201 } | 1221 } |
1202 | 1222 |
1203 #undef CHECK_OK | 1223 #undef CHECK_OK |
1204 | 1224 |
1205 | 1225 |
1206 } // namespace internal | 1226 } // namespace internal |
1207 } // namespace v8 | 1227 } // namespace v8 |
OLD | NEW |