| 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 | 128 |
| 129 // The PreParser checks that the syntax follows the grammar for JavaScript, | 129 // The PreParser checks that the syntax follows the grammar for JavaScript, |
| 130 // and collects some information about the program along the way. | 130 // and collects some information about the program along the way. |
| 131 // The grammar check is only performed in order to understand the program | 131 // The grammar check is only performed in order to understand the program |
| 132 // sufficiently to deduce some information about it, that can be used | 132 // sufficiently to deduce some information about it, that can be used |
| 133 // to speed up later parsing. Finding errors is not the goal of pre-parsing, | 133 // to speed up later parsing. Finding errors is not the goal of pre-parsing, |
| 134 // rather it is to speed up properly written and correct programs. | 134 // rather it is to speed up properly written and correct programs. |
| 135 // That means that contextual checks (like a label being declared where | 135 // That means that contextual checks (like a label being declared where |
| 136 // it is used) are generally omitted. | 136 // it is used) are generally omitted. |
| 137 | 137 |
| 138 PreParser::Statement PreParser::ParseAsyncFunctionDeclaration( | |
| 139 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | |
| 140 // AsyncFunctionDeclaration :: | |
| 141 // async [no LineTerminator here] function BindingIdentifier[Await] | |
| 142 // ( FormalParameters[Await] ) { AsyncFunctionBody } | |
| 143 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); | |
| 144 int pos = position(); | |
| 145 Expect(Token::FUNCTION, CHECK_OK); | |
| 146 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync; | |
| 147 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); | |
| 148 } | |
| 149 | |
| 150 PreParser::Statement PreParser::ParseClassDeclaration( | 138 PreParser::Statement PreParser::ParseClassDeclaration( |
| 151 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | 139 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { |
| 152 int pos = position(); | 140 int pos = position(); |
| 153 bool is_strict_reserved = false; | 141 bool is_strict_reserved = false; |
| 154 Identifier name = | 142 Identifier name = |
| 155 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 143 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 156 ExpressionClassifier no_classifier(this); | 144 ExpressionClassifier no_classifier(this); |
| 157 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, | 145 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, |
| 158 CHECK_OK); | 146 CHECK_OK); |
| 159 return Statement::Default(); | 147 return Statement::Default(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 | 224 |
| 237 if (is_strict(language_mode)) { | 225 if (is_strict(language_mode)) { |
| 238 int end_position = scanner()->location().end_pos; | 226 int end_position = scanner()->location().end_pos; |
| 239 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 227 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
| 240 CheckDecimalLiteralWithLeadingZero(start_position, end_position); | 228 CheckDecimalLiteralWithLeadingZero(start_position, end_position); |
| 241 } | 229 } |
| 242 | 230 |
| 243 return Expression::Default(); | 231 return Expression::Default(); |
| 244 } | 232 } |
| 245 | 233 |
| 246 PreParser::Expression PreParser::ParseAsyncFunctionExpression(bool* ok) { | |
| 247 // AsyncFunctionDeclaration :: | |
| 248 // async [no LineTerminator here] function ( FormalParameters[Await] ) | |
| 249 // { AsyncFunctionBody } | |
| 250 // | |
| 251 // async [no LineTerminator here] function BindingIdentifier[Await] | |
| 252 // ( FormalParameters[Await] ) { AsyncFunctionBody } | |
| 253 int pos = position(); | |
| 254 Expect(Token::FUNCTION, CHECK_OK); | |
| 255 bool is_strict_reserved = false; | |
| 256 Identifier name; | |
| 257 FunctionLiteral::FunctionType type = FunctionLiteral::kAnonymousExpression; | |
| 258 | |
| 259 if (peek_any_identifier()) { | |
| 260 type = FunctionLiteral::kNamedExpression; | |
| 261 name = ParseIdentifierOrStrictReservedWord(FunctionKind::kAsyncFunction, | |
| 262 &is_strict_reserved, CHECK_OK); | |
| 263 } | |
| 264 | |
| 265 ParseFunctionLiteral(name, scanner()->location(), | |
| 266 is_strict_reserved ? kFunctionNameIsStrictReserved | |
| 267 : kFunctionNameValidityUnknown, | |
| 268 FunctionKind::kAsyncFunction, pos, type, language_mode(), | |
| 269 CHECK_OK); | |
| 270 return Expression::Default(); | |
| 271 } | |
| 272 | |
| 273 PreParser::LazyParsingResult PreParser::ParseLazyFunctionLiteralBody( | 234 PreParser::LazyParsingResult PreParser::ParseLazyFunctionLiteralBody( |
| 274 bool may_abort, bool* ok) { | 235 bool may_abort, bool* ok) { |
| 275 int body_start = position(); | 236 int body_start = position(); |
| 276 PreParserStatementList body; | 237 PreParserStatementList body; |
| 277 LazyParsingResult result = ParseStatementList( | 238 LazyParsingResult result = ParseStatementList( |
| 278 body, Token::RBRACE, may_abort, CHECK_OK_VALUE(kLazyParsingComplete)); | 239 body, Token::RBRACE, may_abort, CHECK_OK_VALUE(kLazyParsingComplete)); |
| 279 if (result == kLazyParsingAborted) return result; | 240 if (result == kLazyParsingAborted) return result; |
| 280 | 241 |
| 281 // Position right after terminal '}'. | 242 // Position right after terminal '}'. |
| 282 DCHECK_EQ(Token::RBRACE, scanner()->peek()); | 243 DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 &has_seen_constructor, CHECK_OK); | 296 &has_seen_constructor, CHECK_OK); |
| 336 ValidateExpression(CHECK_OK); | 297 ValidateExpression(CHECK_OK); |
| 337 impl()->AccumulateFormalParameterContainmentErrors(); | 298 impl()->AccumulateFormalParameterContainmentErrors(); |
| 338 } | 299 } |
| 339 | 300 |
| 340 Expect(Token::RBRACE, CHECK_OK); | 301 Expect(Token::RBRACE, CHECK_OK); |
| 341 | 302 |
| 342 return Expression::Default(); | 303 return Expression::Default(); |
| 343 } | 304 } |
| 344 | 305 |
| 345 void PreParser::ParseAsyncArrowSingleExpressionBody(PreParserStatementList body, | |
| 346 bool accept_IN, int pos, | |
| 347 bool* ok) { | |
| 348 scope()->ForceContextAllocation(); | |
| 349 | |
| 350 PreParserExpression return_value = | |
| 351 ParseAssignmentExpression(accept_IN, CHECK_OK_VOID); | |
| 352 | |
| 353 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); | |
| 354 } | |
| 355 | |
| 356 PreParserExpression PreParser::ExpressionFromIdentifier( | 306 PreParserExpression PreParser::ExpressionFromIdentifier( |
| 357 PreParserIdentifier name, int start_position, int end_position, | 307 PreParserIdentifier name, int start_position, int end_position, |
| 358 InferName infer) { | 308 InferName infer) { |
| 359 if (track_unresolved_variables_) { | 309 if (track_unresolved_variables_) { |
| 360 AstNodeFactory factory(ast_value_factory()); | 310 AstNodeFactory factory(ast_value_factory()); |
| 361 // Setting the Zone is necessary because zone_ might be the temp Zone, and | 311 // Setting the Zone is necessary because zone_ might be the temp Zone, and |
| 362 // AstValueFactory doesn't know about it. | 312 // AstValueFactory doesn't know about it. |
| 363 factory.set_zone(zone()); | 313 factory.set_zone(zone()); |
| 364 DCHECK_NOT_NULL(name.string_); | 314 DCHECK_NOT_NULL(name.string_); |
| 365 scope()->NewUnresolved(&factory, name.string_, start_position, end_position, | 315 scope()->NewUnresolved(&factory, name.string_, start_position, end_position, |
| 366 NORMAL_VARIABLE); | 316 NORMAL_VARIABLE); |
| 367 } | 317 } |
| 368 return PreParserExpression::FromIdentifier(name); | 318 return PreParserExpression::FromIdentifier(name); |
| 369 } | 319 } |
| 370 | 320 |
| 371 #undef CHECK_OK | 321 #undef CHECK_OK |
| 372 #undef CHECK_OK_CUSTOM | 322 #undef CHECK_OK_CUSTOM |
| 373 | 323 |
| 374 | 324 |
| 375 } // namespace internal | 325 } // namespace internal |
| 376 } // namespace v8 | 326 } // namespace v8 |
| OLD | NEW |