OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/ast-expression-rewriter.h" | 9 #include "src/ast/ast-expression-rewriter.h" |
10 #include "src/ast/ast-expression-visitor.h" | 10 #include "src/ast/ast-expression-visitor.h" |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
301 | 301 |
302 | 302 |
303 // ---------------------------------------------------------------------------- | 303 // ---------------------------------------------------------------------------- |
304 // The CHECK_OK macro is a convenient macro to enforce error | 304 // The CHECK_OK macro is a convenient macro to enforce error |
305 // handling for functions that may fail (by returning !*ok). | 305 // handling for functions that may fail (by returning !*ok). |
306 // | 306 // |
307 // CAUTION: This macro appends extra statements after a call, | 307 // CAUTION: This macro appends extra statements after a call, |
308 // thus it must never be used where only a single statement | 308 // thus it must never be used where only a single statement |
309 // is correct (e.g. an if statement branch w/o braces)! | 309 // is correct (e.g. an if statement branch w/o braces)! |
310 | 310 |
311 #define CHECK_OK ok); \ | 311 #define CHECK_OK ok); \ |
312 if (!*ok) return NULL; \ | 312 if (!*ok) return nullptr; \ |
313 ((void)0 | 313 ((void)0 |
314 #define DUMMY ) // to make indentation work | 314 #define DUMMY ) // to make indentation work |
315 #undef DUMMY | 315 #undef DUMMY |
316 | 316 |
317 // Used in functions where the return type is not ExpressionT. | 317 #define CHECK_OK_VOID ok); \ |
318 #define CHECK_OK_CUSTOM(x) ok); \ | 318 if (!*ok) return; \ |
319 if (!*ok) return this->x(); \ | |
320 ((void)0 | 319 ((void)0 |
321 #define DUMMY ) // to make indentation work | 320 #define DUMMY ) // to make indentation work |
322 #undef DUMMY | 321 #undef DUMMY |
323 | 322 |
324 #define CHECK_FAILED /**/); \ | 323 #define CHECK_FAILED /**/); \ |
325 if (failed_) return NULL; \ | 324 if (failed_) return NULL; \ |
nickie
2016/07/19 10:56:07
Well, since you changed NULL to nullptr in line 31
neis
2016/07/19 15:21:21
Done.
| |
326 ((void)0 | 325 ((void)0 |
327 #define DUMMY ) // to make indentation work | 326 #define DUMMY ) // to make indentation work |
328 #undef DUMMY | 327 #undef DUMMY |
329 | 328 |
330 // ---------------------------------------------------------------------------- | 329 // ---------------------------------------------------------------------------- |
331 // Implementation of Parser | 330 // Implementation of Parser |
332 | 331 |
333 bool ParserTraits::IsEval(const AstRawString* identifier) const { | 332 bool ParserTraits::IsEval(const AstRawString* identifier) const { |
334 return identifier == parser_->ast_value_factory()->eval_string(); | 333 return identifier == parser_->ast_value_factory()->eval_string(); |
335 } | 334 } |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1194 DCHECK(target_stack_ == NULL); | 1193 DCHECK(target_stack_ == NULL); |
1195 | 1194 |
1196 if (result != NULL) { | 1195 if (result != NULL) { |
1197 Handle<String> inferred_name(shared_info->inferred_name()); | 1196 Handle<String> inferred_name(shared_info->inferred_name()); |
1198 result->set_inferred_name(inferred_name); | 1197 result->set_inferred_name(inferred_name); |
1199 } | 1198 } |
1200 return result; | 1199 return result; |
1201 } | 1200 } |
1202 | 1201 |
1203 | 1202 |
1204 void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token, | 1203 void Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token, |
1205 bool* ok) { | 1204 bool* ok) { |
1206 // StatementList :: | 1205 // StatementList :: |
1207 // (StatementListItem)* <end_token> | 1206 // (StatementListItem)* <end_token> |
1208 | 1207 |
1209 // Allocate a target stack to use for this set of source | 1208 // Allocate a target stack to use for this set of source |
1210 // elements. This way, all scripts and functions get their own | 1209 // elements. This way, all scripts and functions get their own |
1211 // target stack thus avoiding illegal breaks and continues across | 1210 // target stack thus avoiding illegal breaks and continues across |
1212 // functions. | 1211 // functions. |
1213 TargetScope scope(&this->target_stack_); | 1212 TargetScope scope(&this->target_stack_); |
1214 | 1213 |
1215 DCHECK(body != NULL); | 1214 DCHECK(body != NULL); |
1216 bool directive_prologue = true; // Parsing directive prologue. | 1215 bool directive_prologue = true; // Parsing directive prologue. |
1217 | 1216 |
1218 while (peek() != end_token) { | 1217 while (peek() != end_token) { |
1219 if (directive_prologue && peek() != Token::STRING) { | 1218 if (directive_prologue && peek() != Token::STRING) { |
1220 directive_prologue = false; | 1219 directive_prologue = false; |
1221 } | 1220 } |
1222 | 1221 |
1223 Scanner::Location token_loc = scanner()->peek_location(); | 1222 Scanner::Location token_loc = scanner()->peek_location(); |
1224 Statement* stat = ParseStatementListItem(CHECK_OK); | 1223 Statement* stat = ParseStatementListItem(CHECK_OK_VOID); |
1225 if (stat == NULL || stat->IsEmpty()) { | 1224 if (stat == NULL || stat->IsEmpty()) { |
1226 directive_prologue = false; // End of directive prologue. | 1225 directive_prologue = false; // End of directive prologue. |
1227 continue; | 1226 continue; |
1228 } | 1227 } |
1229 | 1228 |
1230 if (directive_prologue) { | 1229 if (directive_prologue) { |
1231 // A shot at a directive. | 1230 // A shot at a directive. |
1232 ExpressionStatement* e_stat; | 1231 ExpressionStatement* e_stat; |
1233 Literal* literal; | 1232 Literal* literal; |
1234 // Still processing directive prologue? | 1233 // Still processing directive prologue? |
(...skipping 13 matching lines...) Expand all Loading... | |
1248 | 1247 |
1249 if (!scope_->HasSimpleParameters()) { | 1248 if (!scope_->HasSimpleParameters()) { |
1250 // TC39 deemed "use strict" directives to be an error when occurring | 1249 // TC39 deemed "use strict" directives to be an error when occurring |
1251 // in the body of a function with non-simple parameter list, on | 1250 // in the body of a function with non-simple parameter list, on |
1252 // 29/7/2015. https://goo.gl/ueA7Ln | 1251 // 29/7/2015. https://goo.gl/ueA7Ln |
1253 const AstRawString* string = literal->raw_value()->AsString(); | 1252 const AstRawString* string = literal->raw_value()->AsString(); |
1254 ParserTraits::ReportMessageAt( | 1253 ParserTraits::ReportMessageAt( |
1255 token_loc, MessageTemplate::kIllegalLanguageModeDirective, | 1254 token_loc, MessageTemplate::kIllegalLanguageModeDirective, |
1256 string); | 1255 string); |
1257 *ok = false; | 1256 *ok = false; |
1258 return nullptr; | 1257 return; |
1259 } | 1258 } |
1260 // Because declarations in strict eval code don't leak into the scope | 1259 // Because declarations in strict eval code don't leak into the scope |
1261 // of the eval call, it is likely that functions declared in strict | 1260 // of the eval call, it is likely that functions declared in strict |
1262 // eval code will be used within the eval code, so lazy parsing is | 1261 // eval code will be used within the eval code, so lazy parsing is |
1263 // probably not a win. | 1262 // probably not a win. |
1264 if (scope_->is_eval_scope()) mode_ = PARSE_EAGERLY; | 1263 if (scope_->is_eval_scope()) mode_ = PARSE_EAGERLY; |
1265 } else if (literal->raw_value()->AsString() == | 1264 } else if (literal->raw_value()->AsString() == |
1266 ast_value_factory()->use_asm_string() && | 1265 ast_value_factory()->use_asm_string() && |
1267 token_loc.end_pos - token_loc.beg_pos == | 1266 token_loc.end_pos - token_loc.beg_pos == |
1268 ast_value_factory()->use_asm_string()->length() + 2) { | 1267 ast_value_factory()->use_asm_string()->length() + 2) { |
(...skipping 10 matching lines...) Expand all Loading... | |
1279 // End of the directive prologue. | 1278 // End of the directive prologue. |
1280 directive_prologue = false; | 1279 directive_prologue = false; |
1281 RaiseLanguageMode(SLOPPY); | 1280 RaiseLanguageMode(SLOPPY); |
1282 } | 1281 } |
1283 } else { | 1282 } else { |
1284 RaiseLanguageMode(SLOPPY); | 1283 RaiseLanguageMode(SLOPPY); |
1285 } | 1284 } |
1286 | 1285 |
1287 body->Add(stat, zone()); | 1286 body->Add(stat, zone()); |
1288 } | 1287 } |
1289 | |
1290 return 0; | |
1291 } | 1288 } |
1292 | 1289 |
1293 | 1290 |
1294 Statement* Parser::ParseStatementListItem(bool* ok) { | 1291 Statement* Parser::ParseStatementListItem(bool* ok) { |
1295 // (Ecma 262 6th Edition, 13.1): | 1292 // (Ecma 262 6th Edition, 13.1): |
1296 // StatementListItem: | 1293 // StatementListItem: |
1297 // Statement | 1294 // Statement |
1298 // Declaration | 1295 // Declaration |
1299 const Token::Value peeked = peek(); | 1296 const Token::Value peeked = peek(); |
1300 switch (peeked) { | 1297 switch (peeked) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1338 ParseImportDeclaration(CHECK_OK); | 1335 ParseImportDeclaration(CHECK_OK); |
1339 return factory()->NewEmptyStatement(kNoSourcePosition); | 1336 return factory()->NewEmptyStatement(kNoSourcePosition); |
1340 case Token::EXPORT: | 1337 case Token::EXPORT: |
1341 return ParseExportDeclaration(ok); | 1338 return ParseExportDeclaration(ok); |
1342 default: | 1339 default: |
1343 return ParseStatementListItem(ok); | 1340 return ParseStatementListItem(ok); |
1344 } | 1341 } |
1345 } | 1342 } |
1346 | 1343 |
1347 | 1344 |
1348 void* Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) { | 1345 void Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) { |
1349 // ecma262/#prod-Module | 1346 // ecma262/#prod-Module |
1350 // Module : | 1347 // Module : |
1351 // ModuleBody? | 1348 // ModuleBody? |
1352 // | 1349 // |
1353 // ecma262/#prod-ModuleItemList | 1350 // ecma262/#prod-ModuleItemList |
1354 // ModuleBody : | 1351 // ModuleBody : |
1355 // ModuleItem* | 1352 // ModuleItem* |
1356 | 1353 |
1357 DCHECK(scope_->is_module_scope()); | 1354 DCHECK(scope_->is_module_scope()); |
1358 while (peek() != Token::EOS) { | 1355 while (peek() != Token::EOS) { |
1359 Statement* stat = ParseModuleItem(CHECK_OK); | 1356 Statement* stat = ParseModuleItem(CHECK_OK_VOID); |
1360 if (stat && !stat->IsEmpty()) { | 1357 if (stat && !stat->IsEmpty()) { |
1361 body->Add(stat, zone()); | 1358 body->Add(stat, zone()); |
1362 } | 1359 } |
1363 } | 1360 } |
1364 return nullptr; | |
1365 } | 1361 } |
1366 | 1362 |
1367 | 1363 |
1368 const AstRawString* Parser::ParseModuleSpecifier(bool* ok) { | 1364 const AstRawString* Parser::ParseModuleSpecifier(bool* ok) { |
1369 // ModuleSpecifier : | 1365 // ModuleSpecifier : |
1370 // StringLiteral | 1366 // StringLiteral |
1371 | 1367 |
1372 Expect(Token::STRING, CHECK_OK); | 1368 Expect(Token::STRING, CHECK_OK); |
1373 return GetSymbol(scanner()); | 1369 return GetSymbol(scanner()); |
1374 } | 1370 } |
1375 | 1371 |
1376 | 1372 |
1377 void* Parser::ParseExportClause(ZoneList<const AstRawString*>* export_names, | 1373 void Parser::ParseExportClause(ZoneList<const AstRawString*>* export_names, |
1378 ZoneList<Scanner::Location>* export_locations, | 1374 ZoneList<Scanner::Location>* export_locations, |
1379 ZoneList<const AstRawString*>* local_names, | 1375 ZoneList<const AstRawString*>* local_names, |
1380 Scanner::Location* reserved_loc, bool* ok) { | 1376 Scanner::Location* reserved_loc, bool* ok) { |
1381 // ExportClause : | 1377 // ExportClause : |
1382 // '{' '}' | 1378 // '{' '}' |
1383 // '{' ExportsList '}' | 1379 // '{' ExportsList '}' |
1384 // '{' ExportsList ',' '}' | 1380 // '{' ExportsList ',' '}' |
1385 // | 1381 // |
1386 // ExportsList : | 1382 // ExportsList : |
1387 // ExportSpecifier | 1383 // ExportSpecifier |
1388 // ExportsList ',' ExportSpecifier | 1384 // ExportsList ',' ExportSpecifier |
1389 // | 1385 // |
1390 // ExportSpecifier : | 1386 // ExportSpecifier : |
1391 // IdentifierName | 1387 // IdentifierName |
1392 // IdentifierName 'as' IdentifierName | 1388 // IdentifierName 'as' IdentifierName |
1393 | 1389 |
1394 Expect(Token::LBRACE, CHECK_OK); | 1390 Expect(Token::LBRACE, CHECK_OK_VOID); |
1395 | 1391 |
1396 Token::Value name_tok; | 1392 Token::Value name_tok; |
1397 while ((name_tok = peek()) != Token::RBRACE) { | 1393 while ((name_tok = peek()) != Token::RBRACE) { |
1398 // Keep track of the first reserved word encountered in case our | 1394 // Keep track of the first reserved word encountered in case our |
1399 // caller needs to report an error. | 1395 // caller needs to report an error. |
1400 if (!reserved_loc->IsValid() && | 1396 if (!reserved_loc->IsValid() && |
1401 !Token::IsIdentifier(name_tok, STRICT, false, parsing_module_)) { | 1397 !Token::IsIdentifier(name_tok, STRICT, false, parsing_module_)) { |
1402 *reserved_loc = scanner()->location(); | 1398 *reserved_loc = scanner()->location(); |
1403 } | 1399 } |
1404 const AstRawString* local_name = ParseIdentifierName(CHECK_OK); | 1400 const AstRawString* local_name = ParseIdentifierName(CHECK_OK_VOID); |
1405 const AstRawString* export_name = NULL; | 1401 const AstRawString* export_name = NULL; |
1406 if (CheckContextualKeyword(CStrVector("as"))) { | 1402 if (CheckContextualKeyword(CStrVector("as"))) { |
1407 export_name = ParseIdentifierName(CHECK_OK); | 1403 export_name = ParseIdentifierName(CHECK_OK_VOID); |
1408 } | 1404 } |
1409 if (export_name == NULL) { | 1405 if (export_name == NULL) { |
1410 export_name = local_name; | 1406 export_name = local_name; |
1411 } | 1407 } |
1412 export_names->Add(export_name, zone()); | 1408 export_names->Add(export_name, zone()); |
1413 local_names->Add(local_name, zone()); | 1409 local_names->Add(local_name, zone()); |
1414 export_locations->Add(scanner()->location(), zone()); | 1410 export_locations->Add(scanner()->location(), zone()); |
1415 if (peek() == Token::RBRACE) break; | 1411 if (peek() == Token::RBRACE) break; |
1416 Expect(Token::COMMA, CHECK_OK); | 1412 Expect(Token::COMMA, CHECK_OK_VOID); |
1417 } | 1413 } |
1418 | 1414 |
1419 Expect(Token::RBRACE, CHECK_OK); | 1415 Expect(Token::RBRACE, CHECK_OK_VOID); |
1420 | |
1421 return nullptr; | |
1422 } | 1416 } |
1423 | 1417 |
1424 | 1418 |
1425 ZoneList<const Parser::NamedImport*>* Parser::ParseNamedImports( | 1419 ZoneList<const Parser::NamedImport*>* Parser::ParseNamedImports( |
1426 int pos, bool* ok) { | 1420 int pos, bool* ok) { |
1427 // NamedImports : | 1421 // NamedImports : |
1428 // '{' '}' | 1422 // '{' '}' |
1429 // '{' ImportsList '}' | 1423 // '{' ImportsList '}' |
1430 // '{' ImportsList ',' '}' | 1424 // '{' ImportsList ',' '}' |
1431 // | 1425 // |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1468 | 1462 |
1469 if (peek() == Token::RBRACE) break; | 1463 if (peek() == Token::RBRACE) break; |
1470 Expect(Token::COMMA, CHECK_OK); | 1464 Expect(Token::COMMA, CHECK_OK); |
1471 } | 1465 } |
1472 | 1466 |
1473 Expect(Token::RBRACE, CHECK_OK); | 1467 Expect(Token::RBRACE, CHECK_OK); |
1474 return result; | 1468 return result; |
1475 } | 1469 } |
1476 | 1470 |
1477 | 1471 |
1478 void* Parser::ParseImportDeclaration(bool* ok) { | 1472 void Parser::ParseImportDeclaration(bool* ok) { |
1479 // ImportDeclaration : | 1473 // ImportDeclaration : |
1480 // 'import' ImportClause 'from' ModuleSpecifier ';' | 1474 // 'import' ImportClause 'from' ModuleSpecifier ';' |
1481 // 'import' ModuleSpecifier ';' | 1475 // 'import' ModuleSpecifier ';' |
1482 // | 1476 // |
1483 // ImportClause : | 1477 // ImportClause : |
1484 // ImportedDefaultBinding | 1478 // ImportedDefaultBinding |
1485 // NameSpaceImport | 1479 // NameSpaceImport |
1486 // NamedImports | 1480 // NamedImports |
1487 // ImportedDefaultBinding ',' NameSpaceImport | 1481 // ImportedDefaultBinding ',' NameSpaceImport |
1488 // ImportedDefaultBinding ',' NamedImports | 1482 // ImportedDefaultBinding ',' NamedImports |
1489 // | 1483 // |
1490 // NameSpaceImport : | 1484 // NameSpaceImport : |
1491 // '*' 'as' ImportedBinding | 1485 // '*' 'as' ImportedBinding |
1492 | 1486 |
1493 int pos = peek_position(); | 1487 int pos = peek_position(); |
1494 Expect(Token::IMPORT, CHECK_OK); | 1488 Expect(Token::IMPORT, CHECK_OK_VOID); |
1495 | 1489 |
1496 Token::Value tok = peek(); | 1490 Token::Value tok = peek(); |
1497 | 1491 |
1498 // 'import' ModuleSpecifier ';' | 1492 // 'import' ModuleSpecifier ';' |
1499 if (tok == Token::STRING) { | 1493 if (tok == Token::STRING) { |
1500 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); | 1494 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK_VOID); |
1501 ExpectSemicolon(CHECK_OK); | 1495 ExpectSemicolon(CHECK_OK_VOID); |
1502 scope_->module()->AddEmptyImport( | 1496 scope_->module()->AddEmptyImport( |
1503 module_specifier, scanner()->location(), zone()); | 1497 module_specifier, scanner()->location(), zone()); |
1504 return nullptr; | 1498 return; |
1505 } | 1499 } |
1506 | 1500 |
1507 // Parse ImportedDefaultBinding if present. | 1501 // Parse ImportedDefaultBinding if present. |
1508 const AstRawString* import_default_binding = nullptr; | 1502 const AstRawString* import_default_binding = nullptr; |
1509 Scanner::Location import_default_binding_loc; | 1503 Scanner::Location import_default_binding_loc; |
1510 if (tok != Token::MUL && tok != Token::LBRACE) { | 1504 if (tok != Token::MUL && tok != Token::LBRACE) { |
1511 import_default_binding = | 1505 import_default_binding = |
1512 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); | 1506 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK_VOID); |
1513 import_default_binding_loc = scanner()->location(); | 1507 import_default_binding_loc = scanner()->location(); |
1514 DeclareImport(import_default_binding, pos, CHECK_OK); | 1508 DeclareImport(import_default_binding, pos, CHECK_OK_VOID); |
1515 } | 1509 } |
1516 | 1510 |
1517 // Parse NameSpaceImport or NamedImports if present. | 1511 // Parse NameSpaceImport or NamedImports if present. |
1518 const AstRawString* module_namespace_binding = nullptr; | 1512 const AstRawString* module_namespace_binding = nullptr; |
1519 Scanner::Location module_namespace_binding_loc; | 1513 Scanner::Location module_namespace_binding_loc; |
1520 const ZoneList<const NamedImport*>* named_imports = nullptr; | 1514 const ZoneList<const NamedImport*>* named_imports = nullptr; |
1521 if (import_default_binding == nullptr || Check(Token::COMMA)) { | 1515 if (import_default_binding == nullptr || Check(Token::COMMA)) { |
1522 switch (peek()) { | 1516 switch (peek()) { |
1523 case Token::MUL: { | 1517 case Token::MUL: { |
1524 Consume(Token::MUL); | 1518 Consume(Token::MUL); |
1525 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); | 1519 ExpectContextualKeyword(CStrVector("as"), CHECK_OK_VOID); |
1526 module_namespace_binding = | 1520 module_namespace_binding = |
1527 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); | 1521 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK_VOID); |
1528 module_namespace_binding_loc = scanner()->location(); | 1522 module_namespace_binding_loc = scanner()->location(); |
1529 break; | 1523 break; |
1530 } | 1524 } |
1531 | 1525 |
1532 case Token::LBRACE: | 1526 case Token::LBRACE: |
1533 named_imports = ParseNamedImports(pos, CHECK_OK); | 1527 named_imports = ParseNamedImports(pos, CHECK_OK_VOID); |
1534 break; | 1528 break; |
1535 | 1529 |
1536 default: | 1530 default: |
1537 *ok = false; | 1531 *ok = false; |
1538 ReportUnexpectedToken(scanner()->current_token()); | 1532 ReportUnexpectedToken(scanner()->current_token()); |
1539 return nullptr; | 1533 return; |
1540 } | 1534 } |
1541 } | 1535 } |
1542 | 1536 |
1543 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); | 1537 ExpectContextualKeyword(CStrVector("from"), CHECK_OK_VOID); |
1544 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); | 1538 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK_VOID); |
1545 ExpectSemicolon(CHECK_OK); | 1539 ExpectSemicolon(CHECK_OK_VOID); |
1546 | 1540 |
1547 // Now that we have all the information, we can make the appropriate | 1541 // Now that we have all the information, we can make the appropriate |
1548 // declarations. | 1542 // declarations. |
1549 | 1543 |
1550 if (module_namespace_binding != nullptr) { | 1544 if (module_namespace_binding != nullptr) { |
1551 scope_->module()->AddStarImport( | 1545 scope_->module()->AddStarImport( |
1552 module_namespace_binding, module_specifier, | 1546 module_namespace_binding, module_specifier, |
1553 module_namespace_binding_loc, zone()); | 1547 module_namespace_binding_loc, zone()); |
1554 // TODO(neis): Create special immutable binding for the namespace object. | 1548 // TODO(neis): Create special immutable binding for the namespace object. |
1555 } | 1549 } |
1556 | 1550 |
1557 // TODO(neis): Would prefer to call DeclareImport below rather than above and | 1551 // TODO(neis): Would prefer to call DeclareImport below rather than above and |
1558 // in ParseNamedImports, but then a possible error message would point to the | 1552 // in ParseNamedImports, but then a possible error message would point to the |
1559 // wrong location. Maybe have a DeclareAt version of Declare that takes a | 1553 // wrong location. Maybe have a DeclareAt version of Declare that takes a |
1560 // location? | 1554 // location? |
1561 | 1555 |
1562 if (import_default_binding != nullptr) { | 1556 if (import_default_binding != nullptr) { |
1563 scope_->module()->AddImport( | 1557 scope_->module()->AddImport( |
1564 ast_value_factory()->default_string(), import_default_binding, | 1558 ast_value_factory()->default_string(), import_default_binding, |
1565 module_specifier, import_default_binding_loc, zone()); | 1559 module_specifier, import_default_binding_loc, zone()); |
1566 // DeclareImport(import_default_binding, pos, CHECK_OK); | 1560 // DeclareImport(import_default_binding, pos, CHECK_OK_VOID); |
1567 } | 1561 } |
1568 | 1562 |
1569 if (named_imports != nullptr) { | 1563 if (named_imports != nullptr) { |
1570 if (named_imports->length() == 0) { | 1564 if (named_imports->length() == 0) { |
1571 scope_->module()->AddEmptyImport( | 1565 scope_->module()->AddEmptyImport( |
1572 module_specifier, scanner()->location(), zone()); | 1566 module_specifier, scanner()->location(), zone()); |
1573 } else { | 1567 } else { |
1574 for (int i = 0; i < named_imports->length(); ++i) { | 1568 for (int i = 0; i < named_imports->length(); ++i) { |
1575 const NamedImport* import = named_imports->at(i); | 1569 const NamedImport* import = named_imports->at(i); |
1576 scope_->module()->AddImport( | 1570 scope_->module()->AddImport( |
1577 import->import_name, import->local_name, | 1571 import->import_name, import->local_name, |
1578 module_specifier, import->location, zone()); | 1572 module_specifier, import->location, zone()); |
1579 // DeclareImport(import->local_name, pos, CHECK_OK); | 1573 // DeclareImport(import->local_name, pos, CHECK_OK_VOID); |
1580 } | 1574 } |
1581 } | 1575 } |
1582 } | 1576 } |
1583 | |
1584 return nullptr; | |
1585 } | 1577 } |
1586 | 1578 |
1587 | 1579 |
1588 Statement* Parser::ParseExportDefault(bool* ok) { | 1580 Statement* Parser::ParseExportDefault(bool* ok) { |
1589 // Supports the following productions, starting after the 'default' token: | 1581 // Supports the following productions, starting after the 'default' token: |
1590 // 'export' 'default' HoistableDeclaration | 1582 // 'export' 'default' HoistableDeclaration |
1591 // 'export' 'default' ClassDeclaration | 1583 // 'export' 'default' ClassDeclaration |
1592 // 'export' 'default' AssignmentExpression[In] ';' | 1584 // 'export' 'default' AssignmentExpression[In] ';' |
1593 | 1585 |
1594 Expect(Token::DEFAULT, CHECK_OK); | 1586 Expect(Token::DEFAULT, CHECK_OK); |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1911 // scope. | 1903 // scope. |
1912 // Let/const variables are always added to the immediately enclosing scope. | 1904 // Let/const variables are always added to the immediately enclosing scope. |
1913 Scope* scope = | 1905 Scope* scope = |
1914 IsLexicalVariableMode(mode) ? scope_ : scope_->DeclarationScope(); | 1906 IsLexicalVariableMode(mode) ? scope_ : scope_->DeclarationScope(); |
1915 return scope->NewUnresolved(factory(), name, Variable::NORMAL, | 1907 return scope->NewUnresolved(factory(), name, Variable::NORMAL, |
1916 scanner()->location().beg_pos, | 1908 scanner()->location().beg_pos, |
1917 scanner()->location().end_pos); | 1909 scanner()->location().end_pos); |
1918 } | 1910 } |
1919 | 1911 |
1920 | 1912 |
1921 void* Parser::DeclareImport(const AstRawString* local_name, int pos, bool* ok) { | 1913 void Parser::DeclareImport(const AstRawString* local_name, int pos, bool* ok) { |
1922 DCHECK_NOT_NULL(local_name); | 1914 DCHECK_NOT_NULL(local_name); |
1923 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); | 1915 VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
1924 Declaration* declaration = | 1916 Declaration* declaration = |
1925 factory()->NewVariableDeclaration(proxy, IMPORT, scope_, pos); | 1917 factory()->NewVariableDeclaration(proxy, IMPORT, scope_, pos); |
1926 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); | 1918 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK_VOID); |
1927 return nullptr; | |
1928 } | 1919 } |
1929 | 1920 |
1930 | 1921 |
1931 Variable* Parser::Declare(Declaration* declaration, | 1922 Variable* Parser::Declare(Declaration* declaration, |
1932 DeclarationDescriptor::Kind declaration_kind, | 1923 DeclarationDescriptor::Kind declaration_kind, |
1933 bool resolve, bool* ok, Scope* scope) { | 1924 bool resolve, bool* ok, Scope* scope) { |
1934 VariableProxy* proxy = declaration->proxy(); | 1925 VariableProxy* proxy = declaration->proxy(); |
1935 DCHECK(proxy->raw_name() != NULL); | 1926 DCHECK(proxy->raw_name() != NULL); |
1936 const AstRawString* name = proxy->raw_name(); | 1927 const AstRawString* name = proxy->raw_name(); |
1937 VariableMode mode = declaration->mode(); | 1928 VariableMode mode = declaration->mode(); |
(...skipping 2151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4089 // | 4080 // |
4090 if (expr->IsBinaryOperation()) { | 4081 if (expr->IsBinaryOperation()) { |
4091 BinaryOperation* binop = expr->AsBinaryOperation(); | 4082 BinaryOperation* binop = expr->AsBinaryOperation(); |
4092 // The classifier has already run, so we know that the expression is a valid | 4083 // The classifier has already run, so we know that the expression is a valid |
4093 // arrow function formals production. | 4084 // arrow function formals production. |
4094 DCHECK_EQ(binop->op(), Token::COMMA); | 4085 DCHECK_EQ(binop->op(), Token::COMMA); |
4095 Expression* left = binop->left(); | 4086 Expression* left = binop->left(); |
4096 Expression* right = binop->right(); | 4087 Expression* right = binop->right(); |
4097 int comma_pos = binop->position(); | 4088 int comma_pos = binop->position(); |
4098 ParseArrowFunctionFormalParameters(parameters, left, comma_pos, | 4089 ParseArrowFunctionFormalParameters(parameters, left, comma_pos, |
4099 CHECK_OK_CUSTOM(Void)); | 4090 CHECK_OK_VOID); |
4100 // LHS of comma expression should be unparenthesized. | 4091 // LHS of comma expression should be unparenthesized. |
4101 expr = right; | 4092 expr = right; |
4102 } | 4093 } |
4103 | 4094 |
4104 // Only the right-most expression may be a rest parameter. | 4095 // Only the right-most expression may be a rest parameter. |
4105 DCHECK(!parameters->has_rest); | 4096 DCHECK(!parameters->has_rest); |
4106 | 4097 |
4107 bool is_rest = expr->IsSpread(); | 4098 bool is_rest = expr->IsSpread(); |
4108 if (is_rest) { | 4099 if (is_rest) { |
4109 expr = expr->AsSpread()->expression(); | 4100 expr = expr->AsSpread()->expression(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4168 body->Add(factory()->NewExpressionStatement(init_generator_variable, | 4159 body->Add(factory()->NewExpressionStatement(init_generator_variable, |
4169 kNoSourcePosition), | 4160 kNoSourcePosition), |
4170 zone()); | 4161 zone()); |
4171 | 4162 |
4172 Block* try_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); | 4163 Block* try_block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); |
4173 | 4164 |
4174 ZoneList<Statement*>* inner_body = try_block->statements(); | 4165 ZoneList<Statement*>* inner_body = try_block->statements(); |
4175 | 4166 |
4176 Expression* return_value = nullptr; | 4167 Expression* return_value = nullptr; |
4177 if (body_type == FunctionBody::Normal) { | 4168 if (body_type == FunctionBody::Normal) { |
4178 ParseStatementList(inner_body, Token::RBRACE, CHECK_OK_CUSTOM(Void)); | 4169 ParseStatementList(inner_body, Token::RBRACE, CHECK_OK_VOID); |
4179 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition); | 4170 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition); |
4180 } else { | 4171 } else { |
4181 return_value = | 4172 return_value = |
4182 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_CUSTOM(Void)); | 4173 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_VOID); |
4183 ParserTraits::RewriteNonPattern(classifier, CHECK_OK_CUSTOM(Void)); | 4174 ParserTraits::RewriteNonPattern(classifier, CHECK_OK_VOID); |
4184 } | 4175 } |
4185 | 4176 |
4186 return_value = BuildPromiseResolve(return_value, return_value->position()); | 4177 return_value = BuildPromiseResolve(return_value, return_value->position()); |
4187 inner_body->Add( | 4178 inner_body->Add( |
4188 factory()->NewReturnStatement(return_value, return_value->position()), | 4179 factory()->NewReturnStatement(return_value, return_value->position()), |
4189 zone()); | 4180 zone()); |
4190 body->Add(BuildRejectPromiseOnException(try_block), zone()); | 4181 body->Add(BuildRejectPromiseOnException(try_block), zone()); |
4191 scope->set_end_position(scanner()->location().end_pos); | 4182 scope->set_end_position(scanner()->location().end_pos); |
4192 } | 4183 } |
4193 | 4184 |
(...skipping 16 matching lines...) Expand all Loading... | |
4210 } | 4201 } |
4211 | 4202 |
4212 | 4203 |
4213 void ParserTraits::ParseArrowFunctionFormalParameterList( | 4204 void ParserTraits::ParseArrowFunctionFormalParameterList( |
4214 ParserFormalParameters* parameters, Expression* expr, | 4205 ParserFormalParameters* parameters, Expression* expr, |
4215 const Scanner::Location& params_loc, | 4206 const Scanner::Location& params_loc, |
4216 Scanner::Location* duplicate_loc, bool* ok) { | 4207 Scanner::Location* duplicate_loc, bool* ok) { |
4217 if (expr->IsEmptyParentheses()) return; | 4208 if (expr->IsEmptyParentheses()) return; |
4218 | 4209 |
4219 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos, | 4210 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos, |
4220 CHECK_OK_CUSTOM(Void)); | 4211 CHECK_OK_VOID); |
4221 | 4212 |
4222 if (parameters->Arity() > Code::kMaxArguments) { | 4213 if (parameters->Arity() > Code::kMaxArguments) { |
4223 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); | 4214 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
4224 *ok = false; | 4215 *ok = false; |
4225 return; | 4216 return; |
4226 } | 4217 } |
4227 | 4218 |
4228 Type::ExpressionClassifier classifier(parser_); | 4219 Type::ExpressionClassifier classifier(parser_); |
4229 if (!parameters->is_simple) { | 4220 if (!parameters->is_simple) { |
4230 classifier.RecordNonSimpleParameter(); | 4221 classifier.RecordNonSimpleParameter(); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4534 // data contains the information we need to construct the lazy function. | 4525 // data contains the information we need to construct the lazy function. |
4535 FunctionEntry entry = | 4526 FunctionEntry entry = |
4536 cached_parse_data_->GetFunctionEntry(function_block_pos); | 4527 cached_parse_data_->GetFunctionEntry(function_block_pos); |
4537 // Check that cached data is valid. If not, mark it as invalid (the embedder | 4528 // Check that cached data is valid. If not, mark it as invalid (the embedder |
4538 // handles it). Note that end position greater than end of stream is safe, | 4529 // handles it). Note that end position greater than end of stream is safe, |
4539 // and hard to check. | 4530 // and hard to check. |
4540 if (entry.is_valid() && entry.end_pos() > function_block_pos) { | 4531 if (entry.is_valid() && entry.end_pos() > function_block_pos) { |
4541 scanner()->SeekForward(entry.end_pos() - 1); | 4532 scanner()->SeekForward(entry.end_pos() - 1); |
4542 | 4533 |
4543 scope_->set_end_position(entry.end_pos()); | 4534 scope_->set_end_position(entry.end_pos()); |
4544 Expect(Token::RBRACE, CHECK_OK_CUSTOM(Void)); | 4535 Expect(Token::RBRACE, CHECK_OK_VOID); |
4545 total_preparse_skipped_ += scope_->end_position() - function_block_pos; | 4536 total_preparse_skipped_ += scope_->end_position() - function_block_pos; |
4546 *materialized_literal_count = entry.literal_count(); | 4537 *materialized_literal_count = entry.literal_count(); |
4547 *expected_property_count = entry.property_count(); | 4538 *expected_property_count = entry.property_count(); |
4548 SetLanguageMode(scope_, entry.language_mode()); | 4539 SetLanguageMode(scope_, entry.language_mode()); |
4549 if (entry.uses_super_property()) scope_->RecordSuperPropertyUsage(); | 4540 if (entry.uses_super_property()) scope_->RecordSuperPropertyUsage(); |
4550 if (entry.calls_eval()) scope_->RecordEvalCall(); | 4541 if (entry.calls_eval()) scope_->RecordEvalCall(); |
4551 return; | 4542 return; |
4552 } | 4543 } |
4553 cached_parse_data_->Reject(); | 4544 cached_parse_data_->Reject(); |
4554 } | 4545 } |
(...skipping 12 matching lines...) Expand all Loading... | |
4567 return; | 4558 return; |
4568 } | 4559 } |
4569 if (logger.has_error()) { | 4560 if (logger.has_error()) { |
4570 ParserTraits::ReportMessageAt( | 4561 ParserTraits::ReportMessageAt( |
4571 Scanner::Location(logger.start(), logger.end()), logger.message(), | 4562 Scanner::Location(logger.start(), logger.end()), logger.message(), |
4572 logger.argument_opt(), logger.error_type()); | 4563 logger.argument_opt(), logger.error_type()); |
4573 *ok = false; | 4564 *ok = false; |
4574 return; | 4565 return; |
4575 } | 4566 } |
4576 scope_->set_end_position(logger.end()); | 4567 scope_->set_end_position(logger.end()); |
4577 Expect(Token::RBRACE, CHECK_OK_CUSTOM(Void)); | 4568 Expect(Token::RBRACE, CHECK_OK_VOID); |
4578 total_preparse_skipped_ += scope_->end_position() - function_block_pos; | 4569 total_preparse_skipped_ += scope_->end_position() - function_block_pos; |
4579 *materialized_literal_count = logger.literals(); | 4570 *materialized_literal_count = logger.literals(); |
4580 *expected_property_count = logger.properties(); | 4571 *expected_property_count = logger.properties(); |
4581 SetLanguageMode(scope_, logger.language_mode()); | 4572 SetLanguageMode(scope_, logger.language_mode()); |
4582 if (logger.uses_super_property()) { | 4573 if (logger.uses_super_property()) { |
4583 scope_->RecordSuperPropertyUsage(); | 4574 scope_->RecordSuperPropertyUsage(); |
4584 } | 4575 } |
4585 if (logger.calls_eval()) { | 4576 if (logger.calls_eval()) { |
4586 scope_->RecordEvalCall(); | 4577 scope_->RecordEvalCall(); |
4587 } | 4578 } |
(...skipping 1268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5856 if (property == nullptr) return; | 5847 if (property == nullptr) return; |
5857 // Do not rewrite (computed) key expressions | 5848 // Do not rewrite (computed) key expressions |
5858 AST_REWRITE_PROPERTY(Expression, property, value); | 5849 AST_REWRITE_PROPERTY(Expression, property, value); |
5859 } | 5850 } |
5860 | 5851 |
5861 Parser* parser_; | 5852 Parser* parser_; |
5862 }; | 5853 }; |
5863 | 5854 |
5864 | 5855 |
5865 void Parser::RewriteNonPattern(ExpressionClassifier* classifier, bool* ok) { | 5856 void Parser::RewriteNonPattern(ExpressionClassifier* classifier, bool* ok) { |
5866 ValidateExpression(classifier, CHECK_OK_CUSTOM(Void)); | 5857 ValidateExpression(classifier, CHECK_OK_VOID); |
5867 auto non_patterns_to_rewrite = function_state_->non_patterns_to_rewrite(); | 5858 auto non_patterns_to_rewrite = function_state_->non_patterns_to_rewrite(); |
5868 int begin = classifier->GetNonPatternBegin(); | 5859 int begin = classifier->GetNonPatternBegin(); |
5869 int end = non_patterns_to_rewrite->length(); | 5860 int end = non_patterns_to_rewrite->length(); |
5870 if (begin < end) { | 5861 if (begin < end) { |
5871 NonPatternRewriter rewriter(stack_limit_, this); | 5862 NonPatternRewriter rewriter(stack_limit_, this); |
5872 for (int i = begin; i < end; i++) { | 5863 for (int i = begin; i < end; i++) { |
5873 DCHECK(non_patterns_to_rewrite->at(i)->IsRewritableExpression()); | 5864 DCHECK(non_patterns_to_rewrite->at(i)->IsRewritableExpression()); |
5874 rewriter.Rewrite(non_patterns_to_rewrite->at(i)); | 5865 rewriter.Rewrite(non_patterns_to_rewrite->at(i)); |
5875 } | 5866 } |
5876 non_patterns_to_rewrite->Rewind(begin); | 5867 non_patterns_to_rewrite->Rewind(begin); |
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7058 } | 7049 } |
7059 | 7050 |
7060 #ifdef DEBUG | 7051 #ifdef DEBUG |
7061 void Parser::Print(AstNode* node) { | 7052 void Parser::Print(AstNode* node) { |
7062 ast_value_factory()->Internalize(Isolate::Current()); | 7053 ast_value_factory()->Internalize(Isolate::Current()); |
7063 node->Print(Isolate::Current()); | 7054 node->Print(Isolate::Current()); |
7064 } | 7055 } |
7065 #endif // DEBUG | 7056 #endif // DEBUG |
7066 | 7057 |
7067 #undef CHECK_OK | 7058 #undef CHECK_OK |
7068 #undef CHECK_OK_CUSTOM | 7059 #undef CHECK_OK_VOID |
7069 #undef CHECK_FAILED | 7060 #undef CHECK_FAILED |
7070 | 7061 |
7071 } // namespace internal | 7062 } // namespace internal |
7072 } // namespace v8 | 7063 } // namespace v8 |
OLD | NEW |