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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 | 46 |
47 #ifdef _MSC_VER | 47 #ifdef _MSC_VER |
48 // Usually defined in math.h, but not in MSVC. | 48 // Usually defined in math.h, but not in MSVC. |
49 // Abstracted to work | 49 // Abstracted to work |
50 int isfinite(double value); | 50 int isfinite(double value); |
51 #endif | 51 #endif |
52 | 52 |
53 namespace preparser { | 53 namespace preparser { |
54 | 54 |
55 PreParser::PreParseResult PreParser::PreParseLazyFunction( | 55 PreParser::PreParseResult PreParser::PreParseLazyFunction( |
56 i::LanguageMode mode, i::ParserRecorder* log) { | 56 i::LanguageMode mode, bool is_generator, i::ParserRecorder* log) { |
57 log_ = log; | 57 log_ = log; |
58 // Lazy functions always have trivial outer scopes (no with/catch scopes). | 58 // Lazy functions always have trivial outer scopes (no with/catch scopes). |
59 Scope top_scope(&scope_, kTopLevelScope); | 59 Scope top_scope(&scope_, kTopLevelScope); |
60 set_language_mode(mode); | 60 set_language_mode(mode); |
61 Scope function_scope(&scope_, kFunctionScope); | 61 Scope function_scope(&scope_, kFunctionScope); |
| 62 function_scope.set_is_generator(is_generator); |
62 ASSERT_EQ(i::Token::LBRACE, scanner_->current_token()); | 63 ASSERT_EQ(i::Token::LBRACE, scanner_->current_token()); |
63 bool ok = true; | 64 bool ok = true; |
64 int start_position = scanner_->peek_location().beg_pos; | 65 int start_position = scanner_->peek_location().beg_pos; |
65 ParseLazyFunctionLiteralBody(&ok); | 66 ParseLazyFunctionLiteralBody(&ok); |
66 if (stack_overflow_) return kPreParseStackOverflow; | 67 if (stack_overflow_) return kPreParseStackOverflow; |
67 if (!ok) { | 68 if (!ok) { |
68 ReportUnexpectedToken(scanner_->current_token()); | 69 ReportUnexpectedToken(scanner_->current_token()); |
69 } else { | 70 } else { |
70 ASSERT_EQ(i::Token::RBRACE, scanner_->peek()); | 71 ASSERT_EQ(i::Token::RBRACE, scanner_->peek()); |
71 if (!is_classic_mode()) { | 72 if (!is_classic_mode()) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 PreParser::Statement PreParser::ParseSourceElement(bool* ok) { | 148 PreParser::Statement PreParser::ParseSourceElement(bool* ok) { |
148 // (Ecma 262 5th Edition, clause 14): | 149 // (Ecma 262 5th Edition, clause 14): |
149 // SourceElement: | 150 // SourceElement: |
150 // Statement | 151 // Statement |
151 // FunctionDeclaration | 152 // FunctionDeclaration |
152 // | 153 // |
153 // In harmony mode we allow additionally the following productions | 154 // In harmony mode we allow additionally the following productions |
154 // SourceElement: | 155 // SourceElement: |
155 // LetDeclaration | 156 // LetDeclaration |
156 // ConstDeclaration | 157 // ConstDeclaration |
| 158 // GeneratorDeclaration |
157 | 159 |
158 switch (peek()) { | 160 switch (peek()) { |
159 case i::Token::FUNCTION: | 161 case i::Token::FUNCTION: |
160 return ParseFunctionDeclaration(ok); | 162 return ParseFunctionDeclaration(ok); |
161 case i::Token::LET: | 163 case i::Token::LET: |
162 case i::Token::CONST: | 164 case i::Token::CONST: |
163 return ParseVariableStatement(kSourceElement, ok); | 165 return ParseVariableStatement(kSourceElement, ok); |
164 default: | 166 default: |
165 return ParseStatement(ok); | 167 return ParseStatement(ok); |
166 } | 168 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 | 289 |
288 default: | 290 default: |
289 return ParseExpressionOrLabelledStatement(ok); | 291 return ParseExpressionOrLabelledStatement(ok); |
290 } | 292 } |
291 } | 293 } |
292 | 294 |
293 | 295 |
294 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { | 296 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { |
295 // FunctionDeclaration :: | 297 // FunctionDeclaration :: |
296 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | 298 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| 299 // GeneratorDeclaration :: |
| 300 // 'function' '*' Identifier '(' FormalParameterListopt ')' |
| 301 // '{' FunctionBody '}' |
297 Expect(i::Token::FUNCTION, CHECK_OK); | 302 Expect(i::Token::FUNCTION, CHECK_OK); |
298 | 303 |
| 304 bool is_generator = allow_generators_ && Check(i::Token::MUL); |
299 Identifier identifier = ParseIdentifier(CHECK_OK); | 305 Identifier identifier = ParseIdentifier(CHECK_OK); |
300 i::Scanner::Location location = scanner_->location(); | 306 i::Scanner::Location location = scanner_->location(); |
301 | 307 |
302 Expression function_value = ParseFunctionLiteral(CHECK_OK); | 308 Expression function_value = ParseFunctionLiteral(is_generator, CHECK_OK); |
303 | 309 |
304 if (function_value.IsStrictFunction() && | 310 if (function_value.IsStrictFunction() && |
305 !identifier.IsValidStrictVariable()) { | 311 !identifier.IsValidStrictVariable()) { |
306 // Strict mode violation, using either reserved word or eval/arguments | 312 // Strict mode violation, using either reserved word or eval/arguments |
307 // as name of strict function. | 313 // as name of strict function. |
308 const char* type = "strict_function_name"; | 314 const char* type = "strict_function_name"; |
309 if (identifier.IsFutureStrictReserved()) { | 315 if (identifier.IsFutureStrictReserved() || identifier.IsYield()) { |
310 type = "strict_reserved_word"; | 316 type = "strict_reserved_word"; |
311 } | 317 } |
312 ReportMessageAt(location, type, NULL); | 318 ReportMessageAt(location, type, NULL); |
313 *ok = false; | 319 *ok = false; |
314 } | 320 } |
315 return Statement::FunctionDeclaration(); | 321 return Statement::FunctionDeclaration(); |
316 } | 322 } |
317 | 323 |
318 | 324 |
319 PreParser::Statement PreParser::ParseBlock(bool* ok) { | 325 PreParser::Statement PreParser::ParseBlock(bool* ok) { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 | 474 |
469 | 475 |
470 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { | 476 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) { |
471 // ExpressionStatement | LabelledStatement :: | 477 // ExpressionStatement | LabelledStatement :: |
472 // Expression ';' | 478 // Expression ';' |
473 // Identifier ':' Statement | 479 // Identifier ':' Statement |
474 | 480 |
475 Expression expr = ParseExpression(true, CHECK_OK); | 481 Expression expr = ParseExpression(true, CHECK_OK); |
476 if (expr.IsRawIdentifier()) { | 482 if (expr.IsRawIdentifier()) { |
477 ASSERT(!expr.AsIdentifier().IsFutureReserved()); | 483 ASSERT(!expr.AsIdentifier().IsFutureReserved()); |
478 ASSERT(is_classic_mode() || !expr.AsIdentifier().IsFutureStrictReserved()); | 484 ASSERT(is_classic_mode() || |
| 485 (!expr.AsIdentifier().IsFutureStrictReserved() && |
| 486 !expr.AsIdentifier().IsYield())); |
479 if (peek() == i::Token::COLON) { | 487 if (peek() == i::Token::COLON) { |
480 Consume(i::Token::COLON); | 488 Consume(i::Token::COLON); |
481 return ParseStatement(ok); | 489 return ParseStatement(ok); |
482 } | 490 } |
483 // Preparsing is disabled for extensions (because the extension details | 491 // Preparsing is disabled for extensions (because the extension details |
484 // aren't passed to lazily compiled functions), so we don't | 492 // aren't passed to lazily compiled functions), so we don't |
485 // accept "native function" in the preparser. | 493 // accept "native function" in the preparser. |
486 } | 494 } |
487 // Parsed expression statement. | 495 // Parsed expression statement. |
488 ExpectSemicolon(CHECK_OK); | 496 ExpectSemicolon(CHECK_OK); |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 } | 811 } |
804 return result; | 812 return result; |
805 } | 813 } |
806 | 814 |
807 | 815 |
808 // Precedence = 2 | 816 // Precedence = 2 |
809 PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN, | 817 PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN, |
810 bool* ok) { | 818 bool* ok) { |
811 // AssignmentExpression :: | 819 // AssignmentExpression :: |
812 // ConditionalExpression | 820 // ConditionalExpression |
| 821 // YieldExpression |
813 // LeftHandSideExpression AssignmentOperator AssignmentExpression | 822 // LeftHandSideExpression AssignmentOperator AssignmentExpression |
814 | 823 |
| 824 if (scope_->is_generator() && peek() == i::Token::YIELD) { |
| 825 return ParseYieldExpression(ok); |
| 826 } |
| 827 |
815 i::Scanner::Location before = scanner_->peek_location(); | 828 i::Scanner::Location before = scanner_->peek_location(); |
816 Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK); | 829 Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK); |
817 | 830 |
818 if (!i::Token::IsAssignmentOp(peek())) { | 831 if (!i::Token::IsAssignmentOp(peek())) { |
819 // Parsed conditional expression only (no assignment). | 832 // Parsed conditional expression only (no assignment). |
820 return expression; | 833 return expression; |
821 } | 834 } |
822 | 835 |
823 if (!is_classic_mode() && | 836 if (!is_classic_mode() && |
824 expression.IsIdentifier() && | 837 expression.IsIdentifier() && |
(...skipping 10 matching lines...) Expand all Loading... |
835 | 848 |
836 if ((op == i::Token::ASSIGN) && expression.IsThisProperty()) { | 849 if ((op == i::Token::ASSIGN) && expression.IsThisProperty()) { |
837 scope_->AddProperty(); | 850 scope_->AddProperty(); |
838 } | 851 } |
839 | 852 |
840 return Expression::Default(); | 853 return Expression::Default(); |
841 } | 854 } |
842 | 855 |
843 | 856 |
844 // Precedence = 3 | 857 // Precedence = 3 |
| 858 PreParser::Expression PreParser::ParseYieldExpression(bool* ok) { |
| 859 // YieldExpression :: |
| 860 // 'yield' '*'? AssignmentExpression |
| 861 Consume(i::Token::YIELD); |
| 862 Check(i::Token::MUL); |
| 863 |
| 864 ParseAssignmentExpression(false, CHECK_OK); |
| 865 |
| 866 return Expression::Default(); |
| 867 } |
| 868 |
| 869 |
| 870 // Precedence = 3 |
845 PreParser::Expression PreParser::ParseConditionalExpression(bool accept_IN, | 871 PreParser::Expression PreParser::ParseConditionalExpression(bool accept_IN, |
846 bool* ok) { | 872 bool* ok) { |
847 // ConditionalExpression :: | 873 // ConditionalExpression :: |
848 // LogicalOrExpression | 874 // LogicalOrExpression |
849 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression | 875 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression |
850 | 876 |
851 // We start using the binary expression parser for prec >= 4 only! | 877 // We start using the binary expression parser for prec >= 4 only! |
852 Expression expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); | 878 Expression expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); |
853 if (peek() != i::Token::CONDITIONAL) return expression; | 879 if (peek() != i::Token::CONDITIONAL) return expression; |
854 Consume(i::Token::CONDITIONAL); | 880 Consume(i::Token::CONDITIONAL); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 PreParser::Expression PreParser::ParseMemberWithNewPrefixesExpression( | 1053 PreParser::Expression PreParser::ParseMemberWithNewPrefixesExpression( |
1028 unsigned new_count, bool* ok) { | 1054 unsigned new_count, bool* ok) { |
1029 // MemberExpression :: | 1055 // MemberExpression :: |
1030 // (PrimaryExpression | FunctionLiteral) | 1056 // (PrimaryExpression | FunctionLiteral) |
1031 // ('[' Expression ']' | '.' Identifier | Arguments)* | 1057 // ('[' Expression ']' | '.' Identifier | Arguments)* |
1032 | 1058 |
1033 // Parse the initial primary or function expression. | 1059 // Parse the initial primary or function expression. |
1034 Expression result = Expression::Default(); | 1060 Expression result = Expression::Default(); |
1035 if (peek() == i::Token::FUNCTION) { | 1061 if (peek() == i::Token::FUNCTION) { |
1036 Consume(i::Token::FUNCTION); | 1062 Consume(i::Token::FUNCTION); |
| 1063 |
| 1064 bool is_generator = allow_generators_ && Check(i::Token::MUL); |
1037 Identifier identifier = Identifier::Default(); | 1065 Identifier identifier = Identifier::Default(); |
1038 if (peek_any_identifier()) { | 1066 if (peek_any_identifier()) { |
1039 identifier = ParseIdentifier(CHECK_OK); | 1067 identifier = ParseIdentifier(CHECK_OK); |
1040 } | 1068 } |
1041 result = ParseFunctionLiteral(CHECK_OK); | 1069 result = ParseFunctionLiteral(is_generator, CHECK_OK); |
1042 if (result.IsStrictFunction() && !identifier.IsValidStrictVariable()) { | 1070 if (result.IsStrictFunction() && !identifier.IsValidStrictVariable()) { |
1043 StrictModeIdentifierViolation(scanner_->location(), | 1071 StrictModeIdentifierViolation(scanner_->location(), |
1044 "strict_function_name", | 1072 "strict_function_name", |
1045 identifier, | 1073 identifier, |
1046 ok); | 1074 ok); |
1047 return Expression::Default(); | 1075 return Expression::Default(); |
1048 } | 1076 } |
1049 } else { | 1077 } else { |
1050 result = ParsePrimaryExpression(CHECK_OK); | 1078 result = ParsePrimaryExpression(CHECK_OK); |
1051 } | 1079 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 Expression result = Expression::Default(); | 1133 Expression result = Expression::Default(); |
1106 switch (peek()) { | 1134 switch (peek()) { |
1107 case i::Token::THIS: { | 1135 case i::Token::THIS: { |
1108 Next(); | 1136 Next(); |
1109 result = Expression::This(); | 1137 result = Expression::This(); |
1110 break; | 1138 break; |
1111 } | 1139 } |
1112 | 1140 |
1113 case i::Token::FUTURE_RESERVED_WORD: | 1141 case i::Token::FUTURE_RESERVED_WORD: |
1114 case i::Token::FUTURE_STRICT_RESERVED_WORD: | 1142 case i::Token::FUTURE_STRICT_RESERVED_WORD: |
| 1143 case i::Token::YIELD: |
1115 case i::Token::IDENTIFIER: { | 1144 case i::Token::IDENTIFIER: { |
1116 Identifier id = ParseIdentifier(CHECK_OK); | 1145 Identifier id = ParseIdentifier(CHECK_OK); |
1117 result = Expression::FromIdentifier(id); | 1146 result = Expression::FromIdentifier(id); |
1118 break; | 1147 break; |
1119 } | 1148 } |
1120 | 1149 |
1121 case i::Token::NULL_LITERAL: | 1150 case i::Token::NULL_LITERAL: |
1122 case i::Token::TRUE_LITERAL: | 1151 case i::Token::TRUE_LITERAL: |
1123 case i::Token::FALSE_LITERAL: | 1152 case i::Token::FALSE_LITERAL: |
1124 case i::Token::NUMBER: { | 1153 case i::Token::NUMBER: { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 name != i::Token::STRING && | 1279 name != i::Token::STRING && |
1251 !is_keyword) { | 1280 !is_keyword) { |
1252 *ok = false; | 1281 *ok = false; |
1253 return Expression::Default(); | 1282 return Expression::Default(); |
1254 } | 1283 } |
1255 if (!is_keyword) { | 1284 if (!is_keyword) { |
1256 LogSymbol(); | 1285 LogSymbol(); |
1257 } | 1286 } |
1258 PropertyType type = is_getter ? kGetterProperty : kSetterProperty; | 1287 PropertyType type = is_getter ? kGetterProperty : kSetterProperty; |
1259 CheckDuplicate(&duplicate_finder, name, type, CHECK_OK); | 1288 CheckDuplicate(&duplicate_finder, name, type, CHECK_OK); |
1260 ParseFunctionLiteral(CHECK_OK); | 1289 ParseFunctionLiteral(false, CHECK_OK); |
1261 if (peek() != i::Token::RBRACE) { | 1290 if (peek() != i::Token::RBRACE) { |
1262 Expect(i::Token::COMMA, CHECK_OK); | 1291 Expect(i::Token::COMMA, CHECK_OK); |
1263 } | 1292 } |
1264 continue; // restart the while | 1293 continue; // restart the while |
1265 } | 1294 } |
1266 CheckDuplicate(&duplicate_finder, next, kValueProperty, CHECK_OK); | 1295 CheckDuplicate(&duplicate_finder, next, kValueProperty, CHECK_OK); |
1267 break; | 1296 break; |
1268 } | 1297 } |
1269 case i::Token::STRING: | 1298 case i::Token::STRING: |
1270 Consume(next); | 1299 Consume(next); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 if (!done) { | 1366 if (!done) { |
1338 Expect(i::Token::COMMA, ok); | 1367 Expect(i::Token::COMMA, ok); |
1339 if (!*ok) return -1; | 1368 if (!*ok) return -1; |
1340 } | 1369 } |
1341 } | 1370 } |
1342 Expect(i::Token::RPAREN, ok); | 1371 Expect(i::Token::RPAREN, ok); |
1343 return argc; | 1372 return argc; |
1344 } | 1373 } |
1345 | 1374 |
1346 | 1375 |
1347 PreParser::Expression PreParser::ParseFunctionLiteral(bool* ok) { | 1376 PreParser::Expression PreParser::ParseFunctionLiteral(bool is_generator, |
| 1377 bool* ok) { |
1348 // Function :: | 1378 // Function :: |
1349 // '(' FormalParameterList? ')' '{' FunctionBody '}' | 1379 // '(' FormalParameterList? ')' '{' FunctionBody '}' |
1350 | 1380 |
1351 // Parse function body. | 1381 // Parse function body. |
1352 ScopeType outer_scope_type = scope_->type(); | 1382 ScopeType outer_scope_type = scope_->type(); |
1353 bool inside_with = scope_->IsInsideWith(); | 1383 bool inside_with = scope_->IsInsideWith(); |
1354 Scope function_scope(&scope_, kFunctionScope); | 1384 Scope function_scope(&scope_, kFunctionScope); |
| 1385 function_scope.set_is_generator(is_generator); |
1355 // FormalParameterList :: | 1386 // FormalParameterList :: |
1356 // '(' (Identifier)*[','] ')' | 1387 // '(' (Identifier)*[','] ')' |
1357 Expect(i::Token::LPAREN, CHECK_OK); | 1388 Expect(i::Token::LPAREN, CHECK_OK); |
1358 int start_position = scanner_->location().beg_pos; | 1389 int start_position = scanner_->location().beg_pos; |
1359 bool done = (peek() == i::Token::RPAREN); | 1390 bool done = (peek() == i::Token::RPAREN); |
1360 DuplicateFinder duplicate_finder(scanner_->unicode_cache()); | 1391 DuplicateFinder duplicate_finder(scanner_->unicode_cache()); |
1361 while (!done) { | 1392 while (!done) { |
1362 Identifier id = ParseIdentifier(CHECK_OK); | 1393 Identifier id = ParseIdentifier(CHECK_OK); |
1363 if (!id.IsValidStrictVariable()) { | 1394 if (!id.IsValidStrictVariable()) { |
1364 StrictModeIdentifierViolation(scanner_->location(), | 1395 StrictModeIdentifierViolation(scanner_->location(), |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 } | 1521 } |
1491 | 1522 |
1492 | 1523 |
1493 PreParser::Identifier PreParser::GetIdentifierSymbol() { | 1524 PreParser::Identifier PreParser::GetIdentifierSymbol() { |
1494 LogSymbol(); | 1525 LogSymbol(); |
1495 if (scanner_->current_token() == i::Token::FUTURE_RESERVED_WORD) { | 1526 if (scanner_->current_token() == i::Token::FUTURE_RESERVED_WORD) { |
1496 return Identifier::FutureReserved(); | 1527 return Identifier::FutureReserved(); |
1497 } else if (scanner_->current_token() == | 1528 } else if (scanner_->current_token() == |
1498 i::Token::FUTURE_STRICT_RESERVED_WORD) { | 1529 i::Token::FUTURE_STRICT_RESERVED_WORD) { |
1499 return Identifier::FutureStrictReserved(); | 1530 return Identifier::FutureStrictReserved(); |
| 1531 } else if (scanner_->current_token() == i::Token::YIELD) { |
| 1532 return Identifier::Yield(); |
1500 } | 1533 } |
1501 if (scanner_->is_literal_ascii()) { | 1534 if (scanner_->is_literal_ascii()) { |
1502 // Detect strict-mode poison words. | 1535 // Detect strict-mode poison words. |
1503 if (scanner_->literal_length() == 4 && | 1536 if (scanner_->literal_length() == 4 && |
1504 !strncmp(scanner_->literal_ascii_string().start(), "eval", 4)) { | 1537 !strncmp(scanner_->literal_ascii_string().start(), "eval", 4)) { |
1505 return Identifier::Eval(); | 1538 return Identifier::Eval(); |
1506 } | 1539 } |
1507 if (scanner_->literal_length() == 9 && | 1540 if (scanner_->literal_length() == 9 && |
1508 !strncmp(scanner_->literal_ascii_string().start(), "arguments", 9)) { | 1541 !strncmp(scanner_->literal_ascii_string().start(), "arguments", 9)) { |
1509 return Identifier::Arguments(); | 1542 return Identifier::Arguments(); |
1510 } | 1543 } |
1511 } | 1544 } |
1512 return Identifier::Default(); | 1545 return Identifier::Default(); |
1513 } | 1546 } |
1514 | 1547 |
1515 | 1548 |
1516 PreParser::Identifier PreParser::ParseIdentifier(bool* ok) { | 1549 PreParser::Identifier PreParser::ParseIdentifier(bool* ok) { |
1517 i::Token::Value next = Next(); | 1550 i::Token::Value next = Next(); |
1518 switch (next) { | 1551 switch (next) { |
1519 case i::Token::FUTURE_RESERVED_WORD: { | 1552 case i::Token::FUTURE_RESERVED_WORD: { |
1520 i::Scanner::Location location = scanner_->location(); | 1553 i::Scanner::Location location = scanner_->location(); |
1521 ReportMessageAt(location.beg_pos, location.end_pos, | 1554 ReportMessageAt(location.beg_pos, location.end_pos, |
1522 "reserved_word", NULL); | 1555 "reserved_word", NULL); |
1523 *ok = false; | 1556 *ok = false; |
1524 return GetIdentifierSymbol(); | 1557 return GetIdentifierSymbol(); |
1525 } | 1558 } |
| 1559 case i::Token::YIELD: |
| 1560 if (scope_->is_generator()) { |
| 1561 // 'yield' in a generator is only valid as part of a YieldExpression. |
| 1562 ReportMessageAt(scanner_->location(), "unexpected_token", "yield"); |
| 1563 *ok = false; |
| 1564 return Identifier::Yield(); |
| 1565 } |
| 1566 // FALLTHROUGH |
1526 case i::Token::FUTURE_STRICT_RESERVED_WORD: | 1567 case i::Token::FUTURE_STRICT_RESERVED_WORD: |
1527 if (!is_classic_mode()) { | 1568 if (!is_classic_mode()) { |
1528 i::Scanner::Location location = scanner_->location(); | 1569 i::Scanner::Location location = scanner_->location(); |
1529 ReportMessageAt(location.beg_pos, location.end_pos, | 1570 ReportMessageAt(location.beg_pos, location.end_pos, |
1530 "strict_reserved_word", NULL); | 1571 "strict_reserved_word", NULL); |
1531 *ok = false; | 1572 *ok = false; |
1532 } | 1573 } |
1533 // FALLTHROUGH | 1574 // FALLTHROUGH |
1534 case i::Token::IDENTIFIER: | 1575 case i::Token::IDENTIFIER: |
1535 return GetIdentifierSymbol(); | 1576 return GetIdentifierSymbol(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1573 } | 1614 } |
1574 | 1615 |
1575 | 1616 |
1576 void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location, | 1617 void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location, |
1577 const char* eval_args_type, | 1618 const char* eval_args_type, |
1578 Identifier identifier, | 1619 Identifier identifier, |
1579 bool* ok) { | 1620 bool* ok) { |
1580 const char* type = eval_args_type; | 1621 const char* type = eval_args_type; |
1581 if (identifier.IsFutureReserved()) { | 1622 if (identifier.IsFutureReserved()) { |
1582 type = "reserved_word"; | 1623 type = "reserved_word"; |
1583 } else if (identifier.IsFutureStrictReserved()) { | 1624 } else if (identifier.IsFutureStrictReserved() || identifier.IsYield()) { |
1584 type = "strict_reserved_word"; | 1625 type = "strict_reserved_word"; |
1585 } | 1626 } |
1586 if (!is_classic_mode()) { | 1627 if (!is_classic_mode()) { |
1587 ReportMessageAt(location, type, NULL); | 1628 ReportMessageAt(location, type, NULL); |
1588 *ok = false; | 1629 *ok = false; |
1589 return; | 1630 return; |
1590 } | 1631 } |
1591 strict_mode_violation_location_ = location; | 1632 strict_mode_violation_location_ = location; |
1592 strict_mode_violation_type_ = type; | 1633 strict_mode_violation_type_ = type; |
1593 } | 1634 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1627 *is_get = strncmp(token, "get", 3) == 0; | 1668 *is_get = strncmp(token, "get", 3) == 0; |
1628 *is_set = !*is_get && strncmp(token, "set", 3) == 0; | 1669 *is_set = !*is_get && strncmp(token, "set", 3) == 0; |
1629 } | 1670 } |
1630 return result; | 1671 return result; |
1631 } | 1672 } |
1632 | 1673 |
1633 bool PreParser::peek_any_identifier() { | 1674 bool PreParser::peek_any_identifier() { |
1634 i::Token::Value next = peek(); | 1675 i::Token::Value next = peek(); |
1635 return next == i::Token::IDENTIFIER || | 1676 return next == i::Token::IDENTIFIER || |
1636 next == i::Token::FUTURE_RESERVED_WORD || | 1677 next == i::Token::FUTURE_RESERVED_WORD || |
1637 next == i::Token::FUTURE_STRICT_RESERVED_WORD; | 1678 next == i::Token::FUTURE_STRICT_RESERVED_WORD || |
| 1679 next == i::Token::YIELD; |
1638 } | 1680 } |
1639 | 1681 |
1640 | 1682 |
1641 int DuplicateFinder::AddAsciiSymbol(i::Vector<const char> key, int value) { | 1683 int DuplicateFinder::AddAsciiSymbol(i::Vector<const char> key, int value) { |
1642 return AddSymbol(i::Vector<const byte>::cast(key), true, value); | 1684 return AddSymbol(i::Vector<const byte>::cast(key), true, value); |
1643 } | 1685 } |
1644 | 1686 |
1645 int DuplicateFinder::AddUtf16Symbol(i::Vector<const uint16_t> key, int value) { | 1687 int DuplicateFinder::AddUtf16Symbol(i::Vector<const uint16_t> key, int value) { |
1646 return AddSymbol(i::Vector<const byte>::cast(key), false, value); | 1688 return AddSymbol(i::Vector<const byte>::cast(key), false, value); |
1647 } | 1689 } |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); | 1806 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); |
1765 } | 1807 } |
1766 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); | 1808 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); |
1767 } | 1809 } |
1768 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); | 1810 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); |
1769 | 1811 |
1770 backing_store_.AddBlock(bytes); | 1812 backing_store_.AddBlock(bytes); |
1771 return backing_store_.EndSequence().start(); | 1813 return backing_store_.EndSequence().start(); |
1772 } | 1814 } |
1773 } } // v8::preparser | 1815 } } // v8::preparser |
OLD | NEW |