Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(911)

Side by Side Diff: src/parser.cc

Issue 952863006: Simplify error message logic in ParseImportNames (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed nit Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parser.h ('k') | test/message/import-as-eval.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 if (peek() == Token::RBRACE) break; 1331 if (peek() == Token::RBRACE) break;
1332 Expect(Token::COMMA, CHECK_OK); 1332 Expect(Token::COMMA, CHECK_OK);
1333 } 1333 }
1334 1334
1335 Expect(Token::RBRACE, CHECK_OK); 1335 Expect(Token::RBRACE, CHECK_OK);
1336 1336
1337 return 0; 1337 return 0;
1338 } 1338 }
1339 1339
1340 1340
1341 void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* names, 1341 void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* import_names,
1342 ZoneList<const AstRawString*>* local_names,
1342 bool* ok) { 1343 bool* ok) {
1343 // NamedImports : 1344 // NamedImports :
1344 // '{' '}' 1345 // '{' '}'
1345 // '{' ImportsList '}' 1346 // '{' ImportsList '}'
1346 // '{' ImportsList ',' '}' 1347 // '{' ImportsList ',' '}'
1347 // 1348 //
1348 // ImportsList : 1349 // ImportsList :
1349 // ImportSpecifier 1350 // ImportSpecifier
1350 // ImportsList ',' ImportSpecifier 1351 // ImportsList ',' ImportSpecifier
1351 // 1352 //
1352 // ImportSpecifier : 1353 // ImportSpecifier :
1353 // BindingIdentifier 1354 // BindingIdentifier
1354 // IdentifierName 'as' BindingIdentifier 1355 // IdentifierName 'as' BindingIdentifier
1355 1356
1356 Expect(Token::LBRACE, CHECK_OK); 1357 Expect(Token::LBRACE, CHECK_OK);
1357 1358
1358 Token::Value name_tok; 1359 while (peek() != Token::RBRACE) {
1359 while ((name_tok = peek()) != Token::RBRACE) { 1360 const AstRawString* import_name = ParseIdentifierName(CHECK_OK);
1360 const AstRawString* name = ParseIdentifierName(CHECK_OK); 1361 const AstRawString* local_name = import_name;
1361 const AstRawString* import_name = NULL;
1362 // In the presence of 'as', the left-side of the 'as' can 1362 // In the presence of 'as', the left-side of the 'as' can
1363 // be any IdentifierName. But without 'as', it must be a valid 1363 // be any IdentifierName. But without 'as', it must be a valid
1364 // BindingIdentiifer. 1364 // BindingIdentifier.
1365 if (CheckContextualKeyword(CStrVector("as"))) { 1365 if (CheckContextualKeyword(CStrVector("as"))) {
1366 import_name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1366 local_name = ParseIdentifierName(CHECK_OK);
1367 } else if (!Token::IsIdentifier(name_tok, STRICT, false)) { 1367 }
1368 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false)) {
1368 *ok = false; 1369 *ok = false;
1369 ReportMessageAt(scanner()->location(), "unexpected_reserved"); 1370 ReportMessage("unexpected_reserved");
1370 return NULL; 1371 return NULL;
1371 } else if (IsEvalOrArguments(name)) { 1372 } else if (IsEvalOrArguments(local_name)) {
1372 *ok = false; 1373 *ok = false;
1373 ReportMessageAt(scanner()->location(), "strict_eval_arguments"); 1374 ReportMessage("strict_eval_arguments");
1374 return NULL; 1375 return NULL;
1375 } 1376 }
1376 // TODO(ES6): Return the import_name as well as the name. 1377 import_names->Add(import_name, zone());
1377 names->Add(name, zone()); 1378 local_names->Add(local_name, zone());
1378 USE(import_name);
1379 if (peek() == Token::RBRACE) break; 1379 if (peek() == Token::RBRACE) break;
1380 Expect(Token::COMMA, CHECK_OK); 1380 Expect(Token::COMMA, CHECK_OK);
1381 } 1381 }
1382 1382
1383 Expect(Token::RBRACE, CHECK_OK); 1383 Expect(Token::RBRACE, CHECK_OK);
1384 1384
1385 return NULL; 1385 return NULL;
1386 } 1386 }
1387 1387
1388 1388
(...skipping 12 matching lines...) Expand all
1401 // NameSpaceImport : 1401 // NameSpaceImport :
1402 // '*' 'as' ImportedBinding 1402 // '*' 'as' ImportedBinding
1403 1403
1404 int pos = peek_position(); 1404 int pos = peek_position();
1405 Expect(Token::IMPORT, CHECK_OK); 1405 Expect(Token::IMPORT, CHECK_OK);
1406 1406
1407 Token::Value tok = peek(); 1407 Token::Value tok = peek();
1408 1408
1409 // 'import' ModuleSpecifier ';' 1409 // 'import' ModuleSpecifier ';'
1410 if (tok == Token::STRING) { 1410 if (tok == Token::STRING) {
1411 ParseModuleSpecifier(CHECK_OK); 1411 Literal* module_specifier = ParseModuleSpecifier(CHECK_OK);
1412 ExpectSemicolon(CHECK_OK); 1412 ExpectSemicolon(CHECK_OK);
1413 // TODO(ES6): Add module to the requested modules of scope_->module().
1414 USE(module_specifier);
1413 return factory()->NewEmptyStatement(pos); 1415 return factory()->NewEmptyStatement(pos);
1414 } 1416 }
1415 1417
1416 // Parse ImportedDefaultBinding if present. 1418 // Parse ImportedDefaultBinding if present.
1417 const AstRawString* imported_default_binding = NULL; 1419 const AstRawString* imported_default_binding = NULL;
1418 if (tok != Token::MUL && tok != Token::LBRACE) { 1420 if (tok != Token::MUL && tok != Token::LBRACE) {
1419 imported_default_binding = 1421 imported_default_binding =
1420 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1422 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
1421 } 1423 }
1422 1424
1423 const AstRawString* module_instance_binding = NULL; 1425 const AstRawString* module_instance_binding = NULL;
1424 ZoneList<const AstRawString*> names(1, zone()); 1426 ZoneList<const AstRawString*> local_names(1, zone());
1427 ZoneList<const AstRawString*> import_names(1, zone());
1425 if (imported_default_binding == NULL || Check(Token::COMMA)) { 1428 if (imported_default_binding == NULL || Check(Token::COMMA)) {
1426 switch (peek()) { 1429 switch (peek()) {
1427 case Token::MUL: { 1430 case Token::MUL: {
1428 Consume(Token::MUL); 1431 Consume(Token::MUL);
1429 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); 1432 ExpectContextualKeyword(CStrVector("as"), CHECK_OK);
1430 module_instance_binding = 1433 module_instance_binding =
1431 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 1434 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
1432 break; 1435 break;
1433 } 1436 }
1434 1437
1435 case Token::LBRACE: 1438 case Token::LBRACE:
1436 ParseNamedImports(&names, CHECK_OK); 1439 ParseNamedImports(&import_names, &local_names, CHECK_OK);
1437 break; 1440 break;
1438 1441
1439 default: 1442 default:
1440 *ok = false; 1443 *ok = false;
1441 ReportUnexpectedToken(scanner()->current_token()); 1444 ReportUnexpectedToken(scanner()->current_token());
1442 return NULL; 1445 return NULL;
1443 } 1446 }
1444 } 1447 }
1445 1448
1446 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); 1449 ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
1447 Literal* module = ParseModuleSpecifier(CHECK_OK); 1450 Literal* module = ParseModuleSpecifier(CHECK_OK);
1448 USE(module); 1451 USE(module);
1449 1452
1450 ExpectSemicolon(CHECK_OK); 1453 ExpectSemicolon(CHECK_OK);
1451 1454
1452 if (module_instance_binding != NULL) { 1455 if (module_instance_binding != NULL) {
1453 // TODO(ES6): Bind name to the Module Instance Object of module. 1456 // TODO(ES6): Bind name to the Module Instance Object of module.
1454 } 1457 }
1455 1458
1456 if (imported_default_binding != NULL) { 1459 if (imported_default_binding != NULL) {
1457 // TODO(ES6): Add an appropriate declaration. 1460 // TODO(ES6): Add an appropriate declaration.
1458 } 1461 }
1459 1462
1460 for (int i = 0; i < names.length(); ++i) { 1463 const int length = import_names.length();
1464 DCHECK_EQ(length, local_names.length());
1465 for (int i = 0; i < length; ++i) {
1461 // TODO(ES6): Add an appropriate declaration for each name 1466 // TODO(ES6): Add an appropriate declaration for each name
1462 } 1467 }
1463 1468
1464 return factory()->NewEmptyStatement(pos); 1469 return factory()->NewEmptyStatement(pos);
1465 } 1470 }
1466 1471
1467 1472
1468 Statement* Parser::ParseExportDefault(bool* ok) { 1473 Statement* Parser::ParseExportDefault(bool* ok) {
1469 // Supports the following productions, starting after the 'default' token: 1474 // Supports the following productions, starting after the 'default' token:
1470 // 'export' 'default' FunctionDeclaration 1475 // 'export' 'default' FunctionDeclaration
(...skipping 3943 matching lines...) Expand 10 before | Expand all | Expand 10 after
5414 } else { 5419 } else {
5415 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5420 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5416 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5421 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5417 raw_string->length()); 5422 raw_string->length());
5418 } 5423 }
5419 } 5424 }
5420 5425
5421 return running_hash; 5426 return running_hash;
5422 } 5427 }
5423 } } // namespace v8::internal 5428 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | test/message/import-as-eval.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698