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

Side by Side Diff: src/parser.cc

Issue 5703001: Revert 5911 (RegExp fail on invalid range syntax).
Patch Set: Created 10 years 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 | « no previous file | test/cctest/test-regexp.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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 4434 matching lines...) Expand 10 before | Expand all | Expand 10 after
4445 } else { 4445 } else {
4446 Advance(); 4446 Advance();
4447 return CharacterRange::Singleton(first); 4447 return CharacterRange::Singleton(first);
4448 } 4448 }
4449 } 4449 }
4450 4450
4451 4451
4452 RegExpTree* RegExpParser::ParseCharacterClass() { 4452 RegExpTree* RegExpParser::ParseCharacterClass() {
4453 static const char* kUnterminated = "Unterminated character class"; 4453 static const char* kUnterminated = "Unterminated character class";
4454 static const char* kRangeOutOfOrder = "Range out of order in character class"; 4454 static const char* kRangeOutOfOrder = "Range out of order in character class";
4455 static const char* kInvalidRange = "Invalid character range";
4456 4455
4457 ASSERT_EQ(current(), '['); 4456 ASSERT_EQ(current(), '[');
4458 Advance(); 4457 Advance();
4459 bool is_negated = false; 4458 bool is_negated = false;
4460 if (current() == '^') { 4459 if (current() == '^') {
4461 is_negated = true; 4460 is_negated = true;
4462 Advance(); 4461 Advance();
4463 } 4462 }
4464 // A CharacterClass is a sequence of single characters, character class
4465 // escapes or ranges. Ranges are on the form "x-y" where x and y are
4466 // single characters (and not character class escapes like \s).
4467 // A "-" may occur at the start or end of the character class (just after
4468 // "[" or "[^", or just before "]") without being considered part of a
4469 // range. A "-" may also appear as the beginning or end of a range.
4470 // I.e., [--+] is valid, so is [!--].
4471
4472 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); 4463 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2);
4473 while (has_more() && current() != ']') { 4464 while (has_more() && current() != ']') {
4474 uc16 char_class = 0; 4465 uc16 char_class = 0;
4475 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); 4466 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
4476 if (char_class) { 4467 if (char_class) {
4477 CharacterRange::AddClassEscape(char_class, ranges); 4468 CharacterRange::AddClassEscape(char_class, ranges);
4478 if (current() == '-') {
4479 Advance();
4480 ranges->Add(CharacterRange::Singleton('-'));
4481 if (current() != ']') {
4482 ReportError(CStrVector(kInvalidRange) CHECK_FAILED);
4483 }
4484 break;
4485 }
4486 continue; 4469 continue;
4487 } 4470 }
4488 if (current() == '-') { 4471 if (current() == '-') {
4489 Advance(); 4472 Advance();
4490 if (current() == kEndMarker) { 4473 if (current() == kEndMarker) {
4491 // If we reach the end we break out of the loop and let the 4474 // If we reach the end we break out of the loop and let the
4492 // following code report an error. 4475 // following code report an error.
4493 break; 4476 break;
4494 } else if (current() == ']') { 4477 } else if (current() == ']') {
4495 ranges->Add(first); 4478 ranges->Add(first);
4496 ranges->Add(CharacterRange::Singleton('-')); 4479 ranges->Add(CharacterRange::Singleton('-'));
4497 break; 4480 break;
4498 } 4481 }
4499 CharacterRange next = ParseClassAtom(&char_class CHECK_FAILED); 4482 CharacterRange next = ParseClassAtom(&char_class CHECK_FAILED);
4500 if (char_class) { 4483 if (char_class) {
4501 ReportError(CStrVector(kInvalidRange) CHECK_FAILED); 4484 ranges->Add(first);
4485 ranges->Add(CharacterRange::Singleton('-'));
4486 CharacterRange::AddClassEscape(char_class, ranges);
4487 continue;
4502 } 4488 }
4503 if (first.from() > next.to()) { 4489 if (first.from() > next.to()) {
4504 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED); 4490 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED);
4505 } 4491 }
4506 ranges->Add(CharacterRange::Range(first.from(), next.to())); 4492 ranges->Add(CharacterRange::Range(first.from(), next.to()));
4507 } else { 4493 } else {
4508 ranges->Add(first); 4494 ranges->Add(first);
4509 } 4495 }
4510 } 4496 }
4511 if (!has_more()) { 4497 if (!has_more()) {
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
4693 Handle<String> source = Handle<String>(String::cast(script->source())); 4679 Handle<String> source = Handle<String>(String::cast(script->source()));
4694 result = parser.ParseProgram(source, info->is_global()); 4680 result = parser.ParseProgram(source, info->is_global());
4695 } 4681 }
4696 } 4682 }
4697 4683
4698 info->SetFunction(result); 4684 info->SetFunction(result);
4699 return (result != NULL); 4685 return (result != NULL);
4700 } 4686 }
4701 4687
4702 } } // namespace v8::internal 4688 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-regexp.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698