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/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 936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 AstNodeFactory function_factory(ast_value_factory()); | 947 AstNodeFactory function_factory(ast_value_factory()); |
948 FunctionState function_state(&function_state_, &scope_, *scope, | 948 FunctionState function_state(&function_state_, &scope_, *scope, |
949 &function_factory); | 949 &function_factory); |
950 | 950 |
951 scope_->SetLanguageMode(info->language_mode()); | 951 scope_->SetLanguageMode(info->language_mode()); |
952 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); | 952 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
953 bool ok = true; | 953 bool ok = true; |
954 int beg_pos = scanner()->location().beg_pos; | 954 int beg_pos = scanner()->location().beg_pos; |
955 if (info->is_module()) { | 955 if (info->is_module()) { |
956 DCHECK(allow_harmony_modules()); | 956 DCHECK(allow_harmony_modules()); |
957 Module* module = ParseModule(&ok); | 957 Statement* stmt = ParseModule(&ok); |
958 if (ok) { | 958 if (ok) { |
959 // TODO(adamk): Do something with returned Module | 959 body->Add(stmt, zone()); |
960 CHECK(module); | |
961 body->Add(factory()->NewEmptyStatement(RelocInfo::kNoPosition), zone()); | |
962 } | 960 } |
963 } else { | 961 } else { |
964 ParseStatementList(body, Token::EOS, info->is_eval(), eval_scope, &ok); | 962 ParseStatementList(body, Token::EOS, info->is_eval(), eval_scope, &ok); |
965 } | 963 } |
966 | 964 |
967 if (ok && is_strict(language_mode())) { | 965 if (ok && is_strict(language_mode())) { |
968 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); | 966 CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok); |
969 } | 967 } |
970 | 968 |
971 if (ok && allow_harmony_scoping() && is_strict(language_mode())) { | 969 if (ok && allow_harmony_scoping() && is_strict(language_mode())) { |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 case Token::IMPORT: | 1245 case Token::IMPORT: |
1248 return ParseImportDeclaration(ok); | 1246 return ParseImportDeclaration(ok); |
1249 case Token::EXPORT: | 1247 case Token::EXPORT: |
1250 return ParseExportDeclaration(ok); | 1248 return ParseExportDeclaration(ok); |
1251 default: | 1249 default: |
1252 return ParseStatementListItem(ok); | 1250 return ParseStatementListItem(ok); |
1253 } | 1251 } |
1254 } | 1252 } |
1255 | 1253 |
1256 | 1254 |
1257 Module* Parser::ParseModule(bool* ok) { | 1255 Statement* Parser::ParseModule(bool* ok) { |
1258 // (Ecma 262 6th Edition, 15.2): | 1256 // (Ecma 262 6th Edition, 15.2): |
1259 // Module : | 1257 // Module : |
1260 // ModuleBody? | 1258 // ModuleBody? |
1261 // | 1259 // |
1262 // ModuleBody : | 1260 // ModuleBody : |
1263 // ModuleItem* | 1261 // ModuleItem* |
1264 | 1262 |
1265 int pos = peek_position(); | |
1266 // Construct block expecting 16 statements. | |
1267 Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition); | 1263 Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition); |
1268 #ifdef DEBUG | |
1269 if (FLAG_print_interface_details) PrintF("# Literal "); | |
1270 #endif | |
1271 Scope* scope = NewScope(scope_, MODULE_SCOPE); | 1264 Scope* scope = NewScope(scope_, MODULE_SCOPE); |
1272 | |
1273 scope->set_start_position(scanner()->location().beg_pos); | 1265 scope->set_start_position(scanner()->location().beg_pos); |
1274 scope->SetLanguageMode( | 1266 scope->SetLanguageMode( |
1275 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); | 1267 static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT)); |
1276 | 1268 |
1277 { | 1269 { |
1278 BlockState block_state(&scope_, scope); | 1270 BlockState block_state(&scope_, scope); |
1279 Target target(&this->target_stack_, body); | |
1280 | 1271 |
1281 while (peek() != Token::EOS) { | 1272 while (peek() != Token::EOS) { |
1282 Statement* stat = ParseModuleItem(CHECK_OK); | 1273 Statement* stat = ParseModuleItem(CHECK_OK); |
1283 if (stat && !stat->IsEmpty()) { | 1274 if (stat && !stat->IsEmpty()) { |
1284 body->AddStatement(stat, zone()); | 1275 body->AddStatement(stat, zone()); |
1285 } | 1276 } |
1286 } | 1277 } |
1287 } | 1278 } |
1288 | 1279 |
1289 scope->set_end_position(scanner()->location().end_pos); | 1280 scope->set_end_position(scanner()->location().end_pos); |
1290 body->set_scope(scope); | 1281 body->set_scope(scope); |
1291 | 1282 |
1292 // Check that all exports are bound. | 1283 // Check that all exports are bound. |
1293 Interface* interface = scope->interface(); | 1284 Interface* interface = scope->interface(); |
1294 for (Interface::Iterator it = interface->iterator(); | 1285 for (Interface::Iterator it = interface->iterator(); |
1295 !it.done(); it.Advance()) { | 1286 !it.done(); it.Advance()) { |
1296 if (scope->LookupLocal(it.name()) == NULL) { | 1287 if (scope->LookupLocal(it.name()) == NULL) { |
1297 ParserTraits::ReportMessage("module_export_undefined", it.name()); | 1288 ParserTraits::ReportMessage("module_export_undefined", it.name()); |
1298 *ok = false; | 1289 *ok = false; |
1299 return NULL; | 1290 return NULL; |
1300 } | 1291 } |
1301 } | 1292 } |
1302 | 1293 |
1303 interface->MakeModule(ok); | 1294 interface->MakeModule(ok); |
1304 DCHECK(*ok); | 1295 DCHECK(*ok); |
1305 interface->Freeze(ok); | 1296 interface->Freeze(ok); |
1306 DCHECK(*ok); | 1297 DCHECK(*ok); |
1307 return factory()->NewModuleLiteral(body, interface, pos); | 1298 return body; |
1308 } | 1299 } |
1309 | 1300 |
1310 | 1301 |
1311 Module* Parser::ParseModuleSpecifier(bool* ok) { | 1302 Literal* Parser::ParseModuleSpecifier(bool* ok) { |
1312 // Module: | 1303 // ModuleSpecifier : |
1313 // String | 1304 // StringLiteral |
1314 | 1305 |
1315 int pos = peek_position(); | 1306 int pos = peek_position(); |
1316 Expect(Token::STRING, CHECK_OK); | 1307 Expect(Token::STRING, CHECK_OK); |
1317 const AstRawString* symbol = GetSymbol(scanner()); | 1308 return factory()->NewStringLiteral(GetSymbol(scanner()), pos); |
1318 | |
1319 // TODO(ES6): Request JS resource from environment... | |
1320 | |
1321 #ifdef DEBUG | |
1322 if (FLAG_print_interface_details) PrintF("# Url "); | |
1323 #endif | |
1324 | |
1325 // Create an empty literal as long as the feature isn't finished. | |
1326 USE(symbol); | |
1327 Scope* scope = NewScope(scope_, MODULE_SCOPE); | |
1328 Block* body = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); | |
1329 body->set_scope(scope); | |
1330 Interface* interface = scope->interface(); | |
1331 Module* result = factory()->NewModuleLiteral(body, interface, pos); | |
1332 interface->Freeze(ok); | |
1333 DCHECK(*ok); | |
1334 interface->Unify(scope->interface(), zone(), ok); | |
1335 DCHECK(*ok); | |
1336 return result; | |
1337 } | 1309 } |
1338 | 1310 |
1339 | 1311 |
1340 void* Parser::ParseExportClause(ZoneList<const AstRawString*>* names, | 1312 void* Parser::ParseExportClause(ZoneList<const AstRawString*>* names, |
1341 Scanner::Location* reserved_loc, bool* ok) { | 1313 Scanner::Location* reserved_loc, bool* ok) { |
1342 // ExportClause : | 1314 // ExportClause : |
1343 // '{' '}' | 1315 // '{' '}' |
1344 // '{' ExportsList '}' | 1316 // '{' ExportsList '}' |
1345 // '{' ExportsList ',' '}' | 1317 // '{' ExportsList ',' '}' |
1346 // | 1318 // |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1479 break; | 1451 break; |
1480 | 1452 |
1481 default: | 1453 default: |
1482 *ok = false; | 1454 *ok = false; |
1483 ReportUnexpectedToken(scanner()->current_token()); | 1455 ReportUnexpectedToken(scanner()->current_token()); |
1484 return NULL; | 1456 return NULL; |
1485 } | 1457 } |
1486 } | 1458 } |
1487 | 1459 |
1488 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); | 1460 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); |
1489 Module* module = ParseModuleSpecifier(CHECK_OK); | 1461 Literal* module = ParseModuleSpecifier(CHECK_OK); |
1490 USE(module); | 1462 USE(module); |
1491 | 1463 |
1492 ExpectSemicolon(CHECK_OK); | 1464 ExpectSemicolon(CHECK_OK); |
1493 | 1465 |
1494 if (module_instance_binding != NULL) { | 1466 if (module_instance_binding != NULL) { |
1495 // TODO(ES6): Bind name to the Module Instance Object of module. | 1467 // TODO(ES6): Bind name to the Module Instance Object of module. |
1496 } | 1468 } |
1497 | 1469 |
1498 if (imported_default_binding != NULL) { | 1470 if (imported_default_binding != NULL) { |
1499 // TODO(ES6): Add an appropriate declaration. | 1471 // TODO(ES6): Add an appropriate declaration. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 ZoneList<const AstRawString*> names(1, zone()); | 1527 ZoneList<const AstRawString*> names(1, zone()); |
1556 bool is_export_from = false; | 1528 bool is_export_from = false; |
1557 switch (peek()) { | 1529 switch (peek()) { |
1558 case Token::DEFAULT: | 1530 case Token::DEFAULT: |
1559 Consume(Token::DEFAULT); | 1531 Consume(Token::DEFAULT); |
1560 return ParseExportDefault(ok); | 1532 return ParseExportDefault(ok); |
1561 | 1533 |
1562 case Token::MUL: { | 1534 case Token::MUL: { |
1563 Consume(Token::MUL); | 1535 Consume(Token::MUL); |
1564 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); | 1536 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); |
1565 Module* module = ParseModuleSpecifier(CHECK_OK); | 1537 Literal* module = ParseModuleSpecifier(CHECK_OK); |
1566 ExpectSemicolon(CHECK_OK); | 1538 ExpectSemicolon(CHECK_OK); |
1567 // TODO(ES6): Do something with the return value | 1539 // TODO(ES6): Do something with the return value |
1568 // of ParseModuleSpecifier. | 1540 // of ParseModuleSpecifier. |
1569 USE(module); | 1541 USE(module); |
1570 is_export_from = true; | 1542 is_export_from = true; |
1571 result = factory()->NewEmptyStatement(pos); | 1543 result = factory()->NewEmptyStatement(pos); |
1572 break; | 1544 break; |
1573 } | 1545 } |
1574 | 1546 |
1575 case Token::LBRACE: { | 1547 case Token::LBRACE: { |
1576 // There are two cases here: | 1548 // There are two cases here: |
1577 // | 1549 // |
1578 // 'export' ExportClause ';' | 1550 // 'export' ExportClause ';' |
1579 // and | 1551 // and |
1580 // 'export' ExportClause FromClause ';' | 1552 // 'export' ExportClause FromClause ';' |
1581 // | 1553 // |
1582 // In the first case, the exported identifiers in ExportClause must | 1554 // In the first case, the exported identifiers in ExportClause must |
1583 // not be reserved words, while in the latter they may be. We | 1555 // not be reserved words, while in the latter they may be. We |
1584 // pass in a location that gets filled with the first reserved word | 1556 // pass in a location that gets filled with the first reserved word |
1585 // encountered, and then throw a SyntaxError if we are in the | 1557 // encountered, and then throw a SyntaxError if we are in the |
1586 // non-FromClause case. | 1558 // non-FromClause case. |
1587 Scanner::Location reserved_loc = Scanner::Location::invalid(); | 1559 Scanner::Location reserved_loc = Scanner::Location::invalid(); |
1588 ParseExportClause(&names, &reserved_loc, CHECK_OK); | 1560 ParseExportClause(&names, &reserved_loc, CHECK_OK); |
1589 if (CheckContextualKeyword(CStrVector("from"))) { | 1561 if (CheckContextualKeyword(CStrVector("from"))) { |
1590 Module* module = ParseModuleSpecifier(CHECK_OK); | 1562 Literal* module = ParseModuleSpecifier(CHECK_OK); |
1591 // TODO(ES6): Do something with the return value | 1563 // TODO(ES6): Do something with the return value |
1592 // of ParseModuleSpecifier. | 1564 // of ParseModuleSpecifier. |
1593 USE(module); | 1565 USE(module); |
1594 is_export_from = true; | 1566 is_export_from = true; |
1595 } else if (reserved_loc.IsValid()) { | 1567 } else if (reserved_loc.IsValid()) { |
1596 // No FromClause, so reserved words are invalid in ExportClause. | 1568 // No FromClause, so reserved words are invalid in ExportClause. |
1597 *ok = false; | 1569 *ok = false; |
1598 ReportMessageAt(reserved_loc, "unexpected_reserved"); | 1570 ReportMessageAt(reserved_loc, "unexpected_reserved"); |
1599 return NULL; | 1571 return NULL; |
1600 } | 1572 } |
(...skipping 3828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5429 } else { | 5401 } else { |
5430 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5402 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
5431 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5403 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
5432 raw_string->length()); | 5404 raw_string->length()); |
5433 } | 5405 } |
5434 } | 5406 } |
5435 | 5407 |
5436 return running_hash; | 5408 return running_hash; |
5437 } | 5409 } |
5438 } } // namespace v8::internal | 5410 } } // namespace v8::internal |
OLD | NEW |