OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 case i::Token::EOS: | 70 case i::Token::EOS: |
71 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, | 71 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
72 "unexpected_eos", NULL); | 72 "unexpected_eos", NULL); |
73 case i::Token::NUMBER: | 73 case i::Token::NUMBER: |
74 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, | 74 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
75 "unexpected_token_number", NULL); | 75 "unexpected_token_number", NULL); |
76 case i::Token::STRING: | 76 case i::Token::STRING: |
77 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, | 77 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
78 "unexpected_token_string", NULL); | 78 "unexpected_token_string", NULL); |
79 case i::Token::IDENTIFIER: | 79 case i::Token::IDENTIFIER: |
| 80 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
| 81 "unexpected_token_identifier", NULL); |
80 case i::Token::FUTURE_RESERVED_WORD: | 82 case i::Token::FUTURE_RESERVED_WORD: |
81 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, | 83 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
82 "unexpected_token_identifier", NULL); | 84 "unexpected_reserved", NULL); |
| 85 case i::Token::FUTURE_STRICT_RESERVED_WORD: |
| 86 return ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
| 87 "unexpected_strict_reserved", NULL); |
83 default: | 88 default: |
84 const char* name = i::Token::String(token); | 89 const char* name = i::Token::String(token); |
85 ReportMessageAt(source_location.beg_pos, source_location.end_pos, | 90 ReportMessageAt(source_location.beg_pos, source_location.end_pos, |
86 "unexpected_token", name); | 91 "unexpected_token", name); |
87 } | 92 } |
88 } | 93 } |
89 | 94 |
90 | 95 |
91 // Checks whether octal literal last seen is between beg_pos and end_pos. | 96 // Checks whether octal literal last seen is between beg_pos and end_pos. |
92 // If so, reports an error. | 97 // If so, reports an error. |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 Identifier identifier = ParseIdentifier(CHECK_OK); | 231 Identifier identifier = ParseIdentifier(CHECK_OK); |
227 i::Scanner::Location location = scanner_->location(); | 232 i::Scanner::Location location = scanner_->location(); |
228 | 233 |
229 Expression function_value = ParseFunctionLiteral(CHECK_OK); | 234 Expression function_value = ParseFunctionLiteral(CHECK_OK); |
230 | 235 |
231 if (function_value.IsStrictFunction() && | 236 if (function_value.IsStrictFunction() && |
232 !identifier.IsValidStrictVariable()) { | 237 !identifier.IsValidStrictVariable()) { |
233 // Strict mode violation, using either reserved word or eval/arguments | 238 // Strict mode violation, using either reserved word or eval/arguments |
234 // as name of strict function. | 239 // as name of strict function. |
235 const char* type = "strict_function_name"; | 240 const char* type = "strict_function_name"; |
236 if (identifier.IsFutureReserved()) { | 241 if (identifier.IsFutureStrictReserved()) { |
237 type = "strict_reserved_word"; | 242 type = "strict_reserved_word"; |
238 } | 243 } |
239 ReportMessageAt(location.beg_pos, location.end_pos, type, NULL); | 244 ReportMessageAt(location.beg_pos, location.end_pos, type, NULL); |
240 *ok = false; | 245 *ok = false; |
241 } | 246 } |
242 return Statement::FunctionDeclaration(); | 247 return Statement::FunctionDeclaration(); |
243 } | 248 } |
244 | 249 |
245 | 250 |
246 PreParser::Statement PreParser::ParseBlock(bool* ok) { | 251 PreParser::Statement PreParser::ParseBlock(bool* ok) { |
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
972 // '(' Expression ')' | 977 // '(' Expression ')' |
973 | 978 |
974 Expression result = Expression::Default(); | 979 Expression result = Expression::Default(); |
975 switch (peek()) { | 980 switch (peek()) { |
976 case i::Token::THIS: { | 981 case i::Token::THIS: { |
977 Next(); | 982 Next(); |
978 result = Expression::This(); | 983 result = Expression::This(); |
979 break; | 984 break; |
980 } | 985 } |
981 | 986 |
982 case i::Token::FUTURE_RESERVED_WORD: | 987 case i::Token::FUTURE_RESERVED_WORD: { |
| 988 Next(); |
| 989 i::Scanner::Location location = scanner_->location(); |
| 990 ReportMessageAt(location.beg_pos, location.end_pos, |
| 991 "reserved_word", NULL); |
| 992 *ok = false; |
| 993 return Expression::Default(); |
| 994 } |
| 995 |
| 996 case i::Token::FUTURE_STRICT_RESERVED_WORD: |
983 if (strict_mode()) { | 997 if (strict_mode()) { |
984 Next(); | 998 Next(); |
985 i::Scanner::Location location = scanner_->location(); | 999 i::Scanner::Location location = scanner_->location(); |
986 ReportMessageAt(location.beg_pos, location.end_pos, | 1000 ReportMessageAt(location.beg_pos, location.end_pos, |
987 "strict_reserved_word", NULL); | 1001 "strict_reserved_word", NULL); |
988 *ok = false; | 1002 *ok = false; |
989 return Expression::Default(); | 1003 return Expression::Default(); |
990 } | 1004 } |
991 // FALLTHROUGH | 1005 // FALLTHROUGH |
992 case i::Token::IDENTIFIER: { | 1006 case i::Token::IDENTIFIER: { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 // '{' ( | 1085 // '{' ( |
1072 // ((IdentifierName | String | Number) ':' AssignmentExpression) | 1086 // ((IdentifierName | String | Number) ':' AssignmentExpression) |
1073 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) | 1087 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
1074 // )*[','] '}' | 1088 // )*[','] '}' |
1075 | 1089 |
1076 Expect(i::Token::LBRACE, CHECK_OK); | 1090 Expect(i::Token::LBRACE, CHECK_OK); |
1077 while (peek() != i::Token::RBRACE) { | 1091 while (peek() != i::Token::RBRACE) { |
1078 i::Token::Value next = peek(); | 1092 i::Token::Value next = peek(); |
1079 switch (next) { | 1093 switch (next) { |
1080 case i::Token::IDENTIFIER: | 1094 case i::Token::IDENTIFIER: |
1081 case i::Token::FUTURE_RESERVED_WORD: { | 1095 case i::Token::FUTURE_RESERVED_WORD: |
| 1096 case i::Token::FUTURE_STRICT_RESERVED_WORD: { |
1082 bool is_getter = false; | 1097 bool is_getter = false; |
1083 bool is_setter = false; | 1098 bool is_setter = false; |
1084 ParseIdentifierOrGetOrSet(&is_getter, &is_setter, CHECK_OK); | 1099 ParseIdentifierNameOrGetOrSet(&is_getter, &is_setter, CHECK_OK); |
1085 if ((is_getter || is_setter) && peek() != i::Token::COLON) { | 1100 if ((is_getter || is_setter) && peek() != i::Token::COLON) { |
1086 i::Token::Value name = Next(); | 1101 i::Token::Value name = Next(); |
1087 bool is_keyword = i::Token::IsKeyword(name); | 1102 bool is_keyword = i::Token::IsKeyword(name); |
1088 if (name != i::Token::IDENTIFIER && | 1103 if (name != i::Token::IDENTIFIER && |
1089 name != i::Token::FUTURE_RESERVED_WORD && | 1104 name != i::Token::FUTURE_RESERVED_WORD && |
| 1105 name != i::Token::FUTURE_STRICT_RESERVED_WORD && |
1090 name != i::Token::NUMBER && | 1106 name != i::Token::NUMBER && |
1091 name != i::Token::STRING && | 1107 name != i::Token::STRING && |
1092 !is_keyword) { | 1108 !is_keyword) { |
1093 *ok = false; | 1109 *ok = false; |
1094 return Expression::Default(); | 1110 return Expression::Default(); |
1095 } | 1111 } |
1096 if (!is_keyword) { | 1112 if (!is_keyword) { |
1097 LogSymbol(); | 1113 LogSymbol(); |
1098 } | 1114 } |
1099 ParseFunctionLiteral(CHECK_OK); | 1115 ParseFunctionLiteral(CHECK_OK); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 return Expression::UseStrictStringLiteral(); | 1321 return Expression::UseStrictStringLiteral(); |
1306 } | 1322 } |
1307 return Expression::StringLiteral(); | 1323 return Expression::StringLiteral(); |
1308 } | 1324 } |
1309 | 1325 |
1310 | 1326 |
1311 PreParser::Identifier PreParser::GetIdentifierSymbol() { | 1327 PreParser::Identifier PreParser::GetIdentifierSymbol() { |
1312 LogSymbol(); | 1328 LogSymbol(); |
1313 if (scanner_->current_token() == i::Token::FUTURE_RESERVED_WORD) { | 1329 if (scanner_->current_token() == i::Token::FUTURE_RESERVED_WORD) { |
1314 return Identifier::FutureReserved(); | 1330 return Identifier::FutureReserved(); |
| 1331 } else if (scanner_->current_token() == |
| 1332 i::Token::FUTURE_STRICT_RESERVED_WORD) { |
| 1333 return Identifier::FutureStrictReserved(); |
1315 } | 1334 } |
1316 if (scanner_->is_literal_ascii()) { | 1335 if (scanner_->is_literal_ascii()) { |
1317 // Detect strict-mode poison words. | 1336 // Detect strict-mode poison words. |
1318 if (scanner_->literal_length() == 4 && | 1337 if (scanner_->literal_length() == 4 && |
1319 !strncmp(scanner_->literal_ascii_string().start(), "eval", 4)) { | 1338 !strncmp(scanner_->literal_ascii_string().start(), "eval", 4)) { |
1320 return Identifier::Eval(); | 1339 return Identifier::Eval(); |
1321 } | 1340 } |
1322 if (scanner_->literal_length() == 9 && | 1341 if (scanner_->literal_length() == 9 && |
1323 !strncmp(scanner_->literal_ascii_string().start(), "arguments", 9)) { | 1342 !strncmp(scanner_->literal_ascii_string().start(), "arguments", 9)) { |
1324 return Identifier::Arguments(); | 1343 return Identifier::Arguments(); |
1325 } | 1344 } |
1326 } | 1345 } |
1327 return Identifier::Default(); | 1346 return Identifier::Default(); |
1328 } | 1347 } |
1329 | 1348 |
1330 | 1349 |
1331 PreParser::Identifier PreParser::ParseIdentifier(bool* ok) { | 1350 PreParser::Identifier PreParser::ParseIdentifier(bool* ok) { |
1332 if (!Check(i::Token::FUTURE_RESERVED_WORD)) { | 1351 i::Token::Value next = Next(); |
1333 Expect(i::Token::IDENTIFIER, ok); | 1352 switch (next) { |
1334 if (!*ok) return Identifier::Default(); | 1353 case i::Token::FUTURE_RESERVED_WORD: { |
| 1354 i::Scanner::Location location = scanner_->location(); |
| 1355 ReportMessageAt(location.beg_pos, location.end_pos, "reserved_word", NULL)
; |
| 1356 *ok = false; |
| 1357 } |
| 1358 // FALLTHROUGH |
| 1359 case i::Token::FUTURE_STRICT_RESERVED_WORD: |
| 1360 case i::Token::IDENTIFIER: |
| 1361 return GetIdentifierSymbol(); |
| 1362 default: |
| 1363 *ok = false; |
| 1364 return Identifier::Default(); |
1335 } | 1365 } |
1336 return GetIdentifierSymbol(); | |
1337 } | 1366 } |
1338 | 1367 |
1339 | 1368 |
1340 void PreParser::SetStrictModeViolation(i::Scanner::Location location, | 1369 void PreParser::SetStrictModeViolation(i::Scanner::Location location, |
1341 const char* type, | 1370 const char* type, |
1342 bool* ok) { | 1371 bool* ok) { |
1343 if (strict_mode()) { | 1372 if (strict_mode()) { |
1344 ReportMessageAt(location.beg_pos, location.end_pos, type, NULL); | 1373 ReportMessageAt(location.beg_pos, location.end_pos, type, NULL); |
1345 *ok = false; | 1374 *ok = false; |
1346 return; | 1375 return; |
(...skipping 19 matching lines...) Expand all Loading... |
1366 strict_mode_violation_location_ = i::Scanner::Location::invalid(); | 1395 strict_mode_violation_location_ = i::Scanner::Location::invalid(); |
1367 } | 1396 } |
1368 | 1397 |
1369 | 1398 |
1370 void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location, | 1399 void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location, |
1371 const char* eval_args_type, | 1400 const char* eval_args_type, |
1372 Identifier identifier, | 1401 Identifier identifier, |
1373 bool* ok) { | 1402 bool* ok) { |
1374 const char* type = eval_args_type; | 1403 const char* type = eval_args_type; |
1375 if (identifier.IsFutureReserved()) { | 1404 if (identifier.IsFutureReserved()) { |
| 1405 type = "reserved_word"; |
| 1406 } else if (identifier.IsFutureStrictReserved()) { |
1376 type = "strict_reserved_word"; | 1407 type = "strict_reserved_word"; |
1377 } | 1408 } |
1378 if (strict_mode()) { | 1409 if (strict_mode()) { |
1379 ReportMessageAt(location.beg_pos, location.end_pos, type, NULL); | 1410 ReportMessageAt(location.beg_pos, location.end_pos, type, NULL); |
1380 *ok = false; | 1411 *ok = false; |
1381 return; | 1412 return; |
1382 } | 1413 } |
1383 strict_mode_violation_location_ = location; | 1414 strict_mode_violation_location_ = location; |
1384 strict_mode_violation_type_ = type; | 1415 strict_mode_violation_type_ = type; |
1385 } | 1416 } |
1386 | 1417 |
1387 | 1418 |
1388 PreParser::Identifier PreParser::ParseIdentifierName(bool* ok) { | 1419 PreParser::Identifier PreParser::ParseIdentifierName(bool* ok) { |
1389 i::Token::Value next = Next(); | 1420 i::Token::Value next = Next(); |
1390 if (i::Token::IsKeyword(next)) { | 1421 if (i::Token::IsKeyword(next)) { |
1391 int pos = scanner_->location().beg_pos; | 1422 int pos = scanner_->location().beg_pos; |
1392 const char* keyword = i::Token::String(next); | 1423 const char* keyword = i::Token::String(next); |
1393 log_->LogAsciiSymbol(pos, i::Vector<const char>(keyword, | 1424 log_->LogAsciiSymbol(pos, i::Vector<const char>(keyword, |
1394 i::StrLength(keyword))); | 1425 i::StrLength(keyword))); |
1395 return Identifier::Default(); | 1426 return Identifier::Default(); |
1396 } | 1427 } |
1397 if (next == i::Token::IDENTIFIER || | 1428 if (next == i::Token::IDENTIFIER || |
1398 next == i::Token::FUTURE_RESERVED_WORD) { | 1429 next == i::Token::FUTURE_RESERVED_WORD || |
| 1430 next == i::Token::FUTURE_STRICT_RESERVED_WORD) { |
1399 return GetIdentifierSymbol(); | 1431 return GetIdentifierSymbol(); |
1400 } | 1432 } |
1401 *ok = false; | 1433 *ok = false; |
1402 return Identifier::Default(); | 1434 return Identifier::Default(); |
1403 } | 1435 } |
1404 | 1436 |
1405 #undef CHECK_OK | 1437 #undef CHECK_OK |
1406 | 1438 |
1407 | 1439 |
1408 // This function reads an identifier and determines whether or not it | 1440 // This function reads an identifier and determines whether or not it |
1409 // is 'get' or 'set'. | 1441 // is 'get' or 'set'. |
1410 PreParser::Identifier PreParser::ParseIdentifierOrGetOrSet(bool* is_get, | 1442 PreParser::Identifier PreParser::ParseIdentifierNameOrGetOrSet(bool* is_get, |
1411 bool* is_set, | 1443 bool* is_set, |
1412 bool* ok) { | 1444 bool* ok) { |
1413 Identifier result = ParseIdentifier(ok); | 1445 Identifier result = ParseIdentifierName(ok); |
1414 if (!*ok) return Identifier::Default(); | 1446 if (!*ok) return Identifier::Default(); |
1415 if (scanner_->is_literal_ascii() && | 1447 if (scanner_->is_literal_ascii() && |
1416 scanner_->literal_length() == 3) { | 1448 scanner_->literal_length() == 3) { |
1417 const char* token = scanner_->literal_ascii_string().start(); | 1449 const char* token = scanner_->literal_ascii_string().start(); |
1418 *is_get = strncmp(token, "get", 3) == 0; | 1450 *is_get = strncmp(token, "get", 3) == 0; |
1419 *is_set = !*is_get && strncmp(token, "set", 3) == 0; | 1451 *is_set = !*is_get && strncmp(token, "set", 3) == 0; |
1420 } | 1452 } |
1421 return result; | 1453 return result; |
1422 } | 1454 } |
1423 | 1455 |
1424 bool PreParser::peek_any_identifier() { | 1456 bool PreParser::peek_any_identifier() { |
1425 i::Token::Value next = peek(); | 1457 i::Token::Value next = peek(); |
1426 return next == i::Token::IDENTIFIER || | 1458 return next == i::Token::IDENTIFIER || |
1427 next == i::Token::FUTURE_RESERVED_WORD; | 1459 next == i::Token::FUTURE_RESERVED_WORD || |
| 1460 next == i::Token::FUTURE_STRICT_RESERVED_WORD; |
1428 } | 1461 } |
1429 } } // v8::preparser | 1462 } } // v8::preparser |
OLD | NEW |