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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 } | 58 } |
59 if (scanner->UnescapedLiteralMatches("undefined", 9)) { | 59 if (scanner->UnescapedLiteralMatches("undefined", 9)) { |
60 return PreParserIdentifier::Undefined(); | 60 return PreParserIdentifier::Undefined(); |
61 } | 61 } |
62 if (scanner->LiteralMatches("prototype", 9)) { | 62 if (scanner->LiteralMatches("prototype", 9)) { |
63 return PreParserIdentifier::Prototype(); | 63 return PreParserIdentifier::Prototype(); |
64 } | 64 } |
65 if (scanner->LiteralMatches("constructor", 11)) { | 65 if (scanner->LiteralMatches("constructor", 11)) { |
66 return PreParserIdentifier::Constructor(); | 66 return PreParserIdentifier::Constructor(); |
67 } | 67 } |
| 68 if (scanner->LiteralMatches("async", 5)) { |
| 69 return PreParserIdentifier::Async(); |
| 70 } |
| 71 if (scanner->LiteralMatches("await", 5)) { |
| 72 return PreParserIdentifier::Await(); |
| 73 } |
68 return PreParserIdentifier::Default(); | 74 return PreParserIdentifier::Default(); |
69 } | 75 } |
70 | 76 |
71 | 77 |
72 PreParserIdentifier PreParserTraits::GetNumberAsSymbol(Scanner* scanner) { | 78 PreParserIdentifier PreParserTraits::GetNumberAsSymbol(Scanner* scanner) { |
73 return PreParserIdentifier::Default(); | 79 return PreParserIdentifier::Default(); |
74 } | 80 } |
75 | 81 |
76 | 82 |
77 PreParserExpression PreParserTraits::ExpressionFromString( | 83 PreParserExpression PreParserTraits::ExpressionFromString( |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 return ParseFunctionDeclaration(ok); | 187 return ParseFunctionDeclaration(ok); |
182 case Token::CLASS: | 188 case Token::CLASS: |
183 return ParseClassDeclaration(ok); | 189 return ParseClassDeclaration(ok); |
184 case Token::CONST: | 190 case Token::CONST: |
185 return ParseVariableStatement(kStatementListItem, ok); | 191 return ParseVariableStatement(kStatementListItem, ok); |
186 case Token::LET: | 192 case Token::LET: |
187 if (IsNextLetKeyword()) { | 193 if (IsNextLetKeyword()) { |
188 return ParseVariableStatement(kStatementListItem, ok); | 194 return ParseVariableStatement(kStatementListItem, ok); |
189 } | 195 } |
190 break; | 196 break; |
| 197 case Token::IDENTIFIER: |
| 198 if (allow_harmony_async_await() && |
| 199 PeekContextualKeyword(CStrVector("async")) && |
| 200 PeekAhead() == Token::FUNCTION && |
| 201 !scanner()->HasAnyLineTerminatorAfterNext()) { |
| 202 Consume(Token::IDENTIFIER); |
| 203 return ParseAsyncFunctionDeclaration(ok); |
| 204 } |
| 205 /* falls through */ |
191 default: | 206 default: |
192 break; | 207 break; |
193 } | 208 } |
194 return ParseStatement(kAllowLabelledFunctionStatement, ok); | 209 return ParseStatement(kAllowLabelledFunctionStatement, ok); |
195 } | 210 } |
196 | 211 |
197 | 212 |
198 void PreParser::ParseStatementList(int end_token, bool* ok, | 213 void PreParser::ParseStatementList(int end_token, bool* ok, |
199 Scanner::BookmarkScope* bookmark) { | 214 Scanner::BookmarkScope* bookmark) { |
200 // SourceElements :: | 215 // SourceElements :: |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 ParseFunctionLiteral(name, scanner()->location(), | 405 ParseFunctionLiteral(name, scanner()->location(), |
391 is_strict_reserved ? kFunctionNameIsStrictReserved | 406 is_strict_reserved ? kFunctionNameIsStrictReserved |
392 : kFunctionNameValidityUnknown, | 407 : kFunctionNameValidityUnknown, |
393 is_generator ? FunctionKind::kGeneratorFunction | 408 is_generator ? FunctionKind::kGeneratorFunction |
394 : FunctionKind::kNormalFunction, | 409 : FunctionKind::kNormalFunction, |
395 pos, FunctionLiteral::kDeclaration, language_mode(), | 410 pos, FunctionLiteral::kDeclaration, language_mode(), |
396 CHECK_OK); | 411 CHECK_OK); |
397 return Statement::FunctionDeclaration(); | 412 return Statement::FunctionDeclaration(); |
398 } | 413 } |
399 | 414 |
| 415 PreParser::Statement PreParser::ParseAsyncFunctionDeclaration(bool* ok) { |
| 416 // AsyncFunctionDeclaration :: |
| 417 // async [no LineTerminator here] function BindingIdentifier[Await] |
| 418 // ( FormalParameters[Await] ) { AsyncFunctionBody } |
| 419 DCHECK_EQ(scanner()->current_token(), Token::IDENTIFIER); |
| 420 DCHECK(scanner()->is_literal_contextual_keyword(CStrVector("async"))); |
| 421 int pos = position(); |
| 422 Expect(Token::FUNCTION, CHECK_OK); |
| 423 bool is_strict_reserved = false; |
| 424 Identifier name = |
| 425 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 426 if (V8_UNLIKELY(is_async_function() && this->IsAwait(name))) { |
| 427 ReportMessageAt(scanner()->location(), |
| 428 MessageTemplate::kAwaitBindingIdentifier); |
| 429 *ok = false; |
| 430 return Statement::Default(); |
| 431 } |
| 432 ParseFunctionLiteral(name, scanner()->location(), |
| 433 is_strict_reserved ? kFunctionNameIsStrictReserved |
| 434 : kFunctionNameValidityUnknown, |
| 435 FunctionKind::kAsyncFunction, pos, |
| 436 FunctionLiteral::kDeclaration, language_mode(), |
| 437 CHECK_OK); |
| 438 return Statement::FunctionDeclaration(); |
| 439 } |
400 | 440 |
401 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { | 441 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { |
402 Expect(Token::CLASS, CHECK_OK); | 442 Expect(Token::CLASS, CHECK_OK); |
403 | 443 |
404 int pos = position(); | 444 int pos = position(); |
405 bool is_strict_reserved = false; | 445 bool is_strict_reserved = false; |
406 Identifier name = | 446 Identifier name = |
407 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 447 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
408 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, | 448 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, |
409 CHECK_OK); | 449 CHECK_OK); |
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 allow_duplicate_parameters, CHECK_OK); | 1049 allow_duplicate_parameters, CHECK_OK); |
1010 | 1050 |
1011 if (is_strict(language_mode)) { | 1051 if (is_strict(language_mode)) { |
1012 int end_position = scanner()->location().end_pos; | 1052 int end_position = scanner()->location().end_pos; |
1013 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 1053 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
1014 } | 1054 } |
1015 | 1055 |
1016 return Expression::Default(); | 1056 return Expression::Default(); |
1017 } | 1057 } |
1018 | 1058 |
| 1059 PreParser::Expression PreParser::ParseAsyncFunctionExpression(bool* ok) { |
| 1060 // AsyncFunctionDeclaration :: |
| 1061 // async [no LineTerminator here] function ( FormalParameters[Await] ) |
| 1062 // { AsyncFunctionBody } |
| 1063 // |
| 1064 // async [no LineTerminator here] function BindingIdentifier[Await] |
| 1065 // ( FormalParameters[Await] ) { AsyncFunctionBody } |
| 1066 int pos = position(); |
| 1067 Expect(Token::FUNCTION, CHECK_OK); |
| 1068 bool is_strict_reserved = false; |
| 1069 Identifier name; |
| 1070 FunctionLiteral::FunctionType type = FunctionLiteral::kAnonymousExpression; |
| 1071 |
| 1072 if (peek_any_identifier()) { |
| 1073 type = FunctionLiteral::kNamedExpression; |
| 1074 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 1075 if (this->IsAwait(name)) { |
| 1076 ReportMessageAt(scanner()->location(), |
| 1077 MessageTemplate::kAwaitBindingIdentifier); |
| 1078 *ok = false; |
| 1079 return Expression::Default(); |
| 1080 } |
| 1081 } |
| 1082 |
| 1083 ParseFunctionLiteral(name, scanner()->location(), |
| 1084 is_strict_reserved ? kFunctionNameIsStrictReserved |
| 1085 : kFunctionNameValidityUnknown, |
| 1086 FunctionKind::kAsyncFunction, pos, type, language_mode(), |
| 1087 CHECK_OK); |
| 1088 return Expression::Default(); |
| 1089 } |
1019 | 1090 |
1020 void PreParser::ParseLazyFunctionLiteralBody(bool* ok, | 1091 void PreParser::ParseLazyFunctionLiteralBody(bool* ok, |
1021 Scanner::BookmarkScope* bookmark) { | 1092 Scanner::BookmarkScope* bookmark) { |
1022 int body_start = position(); | 1093 int body_start = position(); |
1023 ParseStatementList(Token::RBRACE, ok, bookmark); | 1094 ParseStatementList(Token::RBRACE, ok, bookmark); |
1024 if (!*ok) return; | 1095 if (!*ok) return; |
1025 if (bookmark && bookmark->HasBeenReset()) return; | 1096 if (bookmark && bookmark->HasBeenReset()) return; |
1026 | 1097 |
1027 // Position right after terminal '}'. | 1098 // Position right after terminal '}'. |
1028 DCHECK_EQ(Token::RBRACE, scanner()->peek()); | 1099 DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1124 Expect(Token::RBRACE, CHECK_OK); | 1195 Expect(Token::RBRACE, CHECK_OK); |
1125 return PreParserExpression::Default(); | 1196 return PreParserExpression::Default(); |
1126 } | 1197 } |
1127 } | 1198 } |
1128 | 1199 |
1129 #undef CHECK_OK | 1200 #undef CHECK_OK |
1130 | 1201 |
1131 | 1202 |
1132 } // namespace internal | 1203 } // namespace internal |
1133 } // namespace v8 | 1204 } // namespace v8 |
OLD | NEW |