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

Side by Side Diff: src/preparser.cc

Issue 149253010: Tests and fixes for (pre)parse errors related to strict reserved words. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/parser.cc ('k') | test/cctest/test-parsing.cc » ('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 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 return ReportMessageAt(source_location, "unexpected_token_number", NULL); 114 return ReportMessageAt(source_location, "unexpected_token_number", NULL);
115 case Token::STRING: 115 case Token::STRING:
116 return ReportMessageAt(source_location, "unexpected_token_string", NULL); 116 return ReportMessageAt(source_location, "unexpected_token_string", NULL);
117 case Token::IDENTIFIER: 117 case Token::IDENTIFIER:
118 return ReportMessageAt(source_location, 118 return ReportMessageAt(source_location,
119 "unexpected_token_identifier", NULL); 119 "unexpected_token_identifier", NULL);
120 case Token::FUTURE_RESERVED_WORD: 120 case Token::FUTURE_RESERVED_WORD:
121 return ReportMessageAt(source_location, "unexpected_reserved", NULL); 121 return ReportMessageAt(source_location, "unexpected_reserved", NULL);
122 case Token::FUTURE_STRICT_RESERVED_WORD: 122 case Token::FUTURE_STRICT_RESERVED_WORD:
123 return ReportMessageAt(source_location, 123 return ReportMessageAt(source_location,
124 "unexpected_strict_reserved", NULL); 124 is_classic_mode() ? "unexpected_token_identifier"
125 : "unexpected_strict_reserved",
126 NULL);
125 default: 127 default:
126 const char* name = Token::String(token); 128 const char* name = Token::String(token);
127 ReportMessageAt(source_location, "unexpected_token", name); 129 ReportMessageAt(source_location, "unexpected_token", name);
128 } 130 }
129 } 131 }
130 132
131 133
132 #define CHECK_OK ok); \ 134 #define CHECK_OK ok); \
133 if (!*ok) return kUnknownSourceElements; \ 135 if (!*ok) return kUnknownSourceElements; \
134 ((void)0 136 ((void)0
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 Scanner::Location location = scanner()->location(); 299 Scanner::Location location = scanner()->location();
298 300
299 Expression function_value = ParseFunctionLiteral(is_generator, CHECK_OK); 301 Expression function_value = ParseFunctionLiteral(is_generator, CHECK_OK);
300 302
301 if (function_value.IsStrictFunction() && 303 if (function_value.IsStrictFunction() &&
302 !identifier.IsValidStrictVariable()) { 304 !identifier.IsValidStrictVariable()) {
303 // Strict mode violation, using either reserved word or eval/arguments 305 // Strict mode violation, using either reserved word or eval/arguments
304 // as name of strict function. 306 // as name of strict function.
305 const char* type = "strict_function_name"; 307 const char* type = "strict_function_name";
306 if (identifier.IsFutureStrictReserved() || identifier.IsYield()) { 308 if (identifier.IsFutureStrictReserved() || identifier.IsYield()) {
307 type = "strict_reserved_word"; 309 type = "unexpected_strict_reserved";
308 } 310 }
309 ReportMessageAt(location, type, NULL); 311 ReportMessageAt(location, type, NULL);
310 *ok = false; 312 *ok = false;
311 } 313 }
312 return Statement::FunctionDeclaration(); 314 return Statement::FunctionDeclaration();
313 } 315 }
314 316
315 317
316 PreParser::Statement PreParser::ParseBlock(bool* ok) { 318 PreParser::Statement PreParser::ParseBlock(bool* ok) {
317 // Block :: 319 // Block ::
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1504 // 'yield' in a generator is only valid as part of a YieldExpression. 1506 // 'yield' in a generator is only valid as part of a YieldExpression.
1505 ReportMessageAt(scanner()->location(), "unexpected_token", "yield"); 1507 ReportMessageAt(scanner()->location(), "unexpected_token", "yield");
1506 *ok = false; 1508 *ok = false;
1507 return Identifier::Yield(); 1509 return Identifier::Yield();
1508 } 1510 }
1509 // FALLTHROUGH 1511 // FALLTHROUGH
1510 case Token::FUTURE_STRICT_RESERVED_WORD: 1512 case Token::FUTURE_STRICT_RESERVED_WORD:
1511 if (!is_classic_mode()) { 1513 if (!is_classic_mode()) {
1512 Scanner::Location location = scanner()->location(); 1514 Scanner::Location location = scanner()->location();
1513 ReportMessageAt(location.beg_pos, location.end_pos, 1515 ReportMessageAt(location.beg_pos, location.end_pos,
1514 "strict_reserved_word", NULL); 1516 "unexpected_strict_reserved", NULL);
1515 *ok = false; 1517 *ok = false;
1516 } 1518 }
1517 // FALLTHROUGH 1519 // FALLTHROUGH
1518 case Token::IDENTIFIER: 1520 case Token::IDENTIFIER:
1519 return GetIdentifierSymbol(); 1521 return GetIdentifierSymbol();
1520 default: 1522 default:
1521 *ok = false; 1523 *ok = false;
1522 return Identifier::Default(); 1524 return Identifier::Default();
1523 } 1525 }
1524 } 1526 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 1560
1559 1561
1560 void PreParser::StrictModeIdentifierViolation(Scanner::Location location, 1562 void PreParser::StrictModeIdentifierViolation(Scanner::Location location,
1561 const char* eval_args_type, 1563 const char* eval_args_type,
1562 Identifier identifier, 1564 Identifier identifier,
1563 bool* ok) { 1565 bool* ok) {
1564 const char* type = eval_args_type; 1566 const char* type = eval_args_type;
1565 if (identifier.IsFutureReserved()) { 1567 if (identifier.IsFutureReserved()) {
1566 type = "reserved_word"; 1568 type = "reserved_word";
1567 } else if (identifier.IsFutureStrictReserved() || identifier.IsYield()) { 1569 } else if (identifier.IsFutureStrictReserved() || identifier.IsYield()) {
1568 type = "strict_reserved_word"; 1570 type = "unexpected_strict_reserved";
1569 } 1571 }
1570 if (!is_classic_mode()) { 1572 if (!is_classic_mode()) {
1571 ReportMessageAt(location, type, NULL); 1573 ReportMessageAt(location, type, NULL);
1572 *ok = false; 1574 *ok = false;
1573 return; 1575 return;
1574 } 1576 }
1575 strict_mode_violation_location_ = location; 1577 strict_mode_violation_location_ = location;
1576 strict_mode_violation_type_ = type; 1578 strict_mode_violation_type_ = type;
1577 } 1579 }
1578 1580
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1640 ASSERT(IsAccessorAccessorConflict(old_type, type)); 1642 ASSERT(IsAccessorAccessorConflict(old_type, type));
1641 // Both accessors of the same type. 1643 // Both accessors of the same type.
1642 parser()->ReportMessageAt(scanner()->location(), 1644 parser()->ReportMessageAt(scanner()->location(),
1643 "accessor_get_set"); 1645 "accessor_get_set");
1644 } 1646 }
1645 *ok = false; 1647 *ok = false;
1646 } 1648 }
1647 } 1649 }
1648 1650
1649 } } // v8::internal 1651 } } // v8::internal
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698