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

Side by Side Diff: src/parser.cc

Issue 5850002: Merge 5953 and 5974 to trunk to fix RegExp parsing incompatability. (Closed)
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 | src/version.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 4391 matching lines...) Expand 10 before | Expand all | Expand 10 after
4402 uc32 c = ParseClassCharacterEscape(CHECK_FAILED); 4402 uc32 c = ParseClassCharacterEscape(CHECK_FAILED);
4403 return CharacterRange::Singleton(c); 4403 return CharacterRange::Singleton(c);
4404 } 4404 }
4405 } else { 4405 } else {
4406 Advance(); 4406 Advance();
4407 return CharacterRange::Singleton(first); 4407 return CharacterRange::Singleton(first);
4408 } 4408 }
4409 } 4409 }
4410 4410
4411 4411
4412 static const uc16 kNoCharClass = 0;
4413
4414 // Adds range or pre-defined character class to character ranges.
4415 // If char_class is not kInvalidClass, it's interpreted as a class
4416 // escape (i.e., 's' means whitespace, from '\s').
4417 static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges,
4418 uc16 char_class,
4419 CharacterRange range) {
4420 if (char_class != kNoCharClass) {
4421 CharacterRange::AddClassEscape(char_class, ranges);
4422 } else {
4423 ranges->Add(range);
4424 }
4425 }
4426
4427
4412 RegExpTree* RegExpParser::ParseCharacterClass() { 4428 RegExpTree* RegExpParser::ParseCharacterClass() {
4413 static const char* kUnterminated = "Unterminated character class"; 4429 static const char* kUnterminated = "Unterminated character class";
4414 static const char* kRangeOutOfOrder = "Range out of order in character class"; 4430 static const char* kRangeOutOfOrder = "Range out of order in character class";
4415 static const char* kInvalidRange = "Invalid character range";
4416 4431
4417 ASSERT_EQ(current(), '['); 4432 ASSERT_EQ(current(), '[');
4418 Advance(); 4433 Advance();
4419 bool is_negated = false; 4434 bool is_negated = false;
4420 if (current() == '^') { 4435 if (current() == '^') {
4421 is_negated = true; 4436 is_negated = true;
4422 Advance(); 4437 Advance();
4423 } 4438 }
4424 // A CharacterClass is a sequence of single characters, character class
4425 // escapes or ranges. Ranges are on the form "x-y" where x and y are
4426 // single characters (and not character class escapes like \s).
4427 // A "-" may occur at the start or end of the character class (just after
4428 // "[" or "[^", or just before "]") without being considered part of a
4429 // range. A "-" may also appear as the beginning or end of a range.
4430 // I.e., [--+] is valid, so is [!--].
4431
4432 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); 4439 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2);
4433 while (has_more() && current() != ']') { 4440 while (has_more() && current() != ']') {
4434 uc16 char_class = 0; 4441 uc16 char_class = kNoCharClass;
4435 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); 4442 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
4436 if (char_class) {
4437 CharacterRange::AddClassEscape(char_class, ranges);
4438 if (current() == '-') {
4439 Advance();
4440 ranges->Add(CharacterRange::Singleton('-'));
4441 if (current() != ']') {
4442 ReportError(CStrVector(kInvalidRange) CHECK_FAILED);
4443 }
4444 break;
4445 }
4446 continue;
4447 }
4448 if (current() == '-') { 4443 if (current() == '-') {
4449 Advance(); 4444 Advance();
4450 if (current() == kEndMarker) { 4445 if (current() == kEndMarker) {
4451 // If we reach the end we break out of the loop and let the 4446 // If we reach the end we break out of the loop and let the
4452 // following code report an error. 4447 // following code report an error.
4453 break; 4448 break;
4454 } else if (current() == ']') { 4449 } else if (current() == ']') {
4455 ranges->Add(first); 4450 AddRangeOrEscape(ranges, char_class, first);
4456 ranges->Add(CharacterRange::Singleton('-')); 4451 ranges->Add(CharacterRange::Singleton('-'));
4457 break; 4452 break;
4458 } 4453 }
4459 CharacterRange next = ParseClassAtom(&char_class CHECK_FAILED); 4454 uc16 char_class_2 = kNoCharClass;
4460 if (char_class) { 4455 CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED);
4461 ReportError(CStrVector(kInvalidRange) CHECK_FAILED); 4456 if (char_class != kNoCharClass || char_class_2 != kNoCharClass) {
4457 // Either end is an escaped character class. Treat the '-' verbatim.
4458 AddRangeOrEscape(ranges, char_class, first);
4459 ranges->Add(CharacterRange::Singleton('-'));
4460 AddRangeOrEscape(ranges, char_class_2, next);
4461 continue;
4462 } 4462 }
4463 if (first.from() > next.to()) { 4463 if (first.from() > next.to()) {
4464 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED); 4464 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED);
4465 } 4465 }
4466 ranges->Add(CharacterRange::Range(first.from(), next.to())); 4466 ranges->Add(CharacterRange::Range(first.from(), next.to()));
4467 } else { 4467 } else {
4468 ranges->Add(first); 4468 AddRangeOrEscape(ranges, char_class, first);
4469 } 4469 }
4470 } 4470 }
4471 if (!has_more()) { 4471 if (!has_more()) {
4472 return ReportError(CStrVector(kUnterminated) CHECK_FAILED); 4472 return ReportError(CStrVector(kUnterminated) CHECK_FAILED);
4473 } 4473 }
4474 Advance(); 4474 Advance();
4475 if (ranges->length() == 0) { 4475 if (ranges->length() == 0) {
4476 ranges->Add(CharacterRange::Everything()); 4476 ranges->Add(CharacterRange::Everything());
4477 is_negated = !is_negated; 4477 is_negated = !is_negated;
4478 } 4478 }
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
4658 Handle<String> source = Handle<String>(String::cast(script->source())); 4658 Handle<String> source = Handle<String>(String::cast(script->source()));
4659 result = parser.ParseProgram(source, info->is_global()); 4659 result = parser.ParseProgram(source, info->is_global());
4660 } 4660 }
4661 } 4661 }
4662 4662
4663 info->SetFunction(result); 4663 info->SetFunction(result);
4664 return (result != NULL); 4664 return (result != NULL);
4665 } 4665 }
4666 4666
4667 } } // namespace v8::internal 4667 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/version.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698