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

Side by Side Diff: src/parser.cc

Issue 5723002: Make RegExp character class match JSC. (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 | no next file » | 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 4431 matching lines...) Expand 10 before | Expand all | Expand 10 after
4442 uc32 c = ParseClassCharacterEscape(CHECK_FAILED); 4442 uc32 c = ParseClassCharacterEscape(CHECK_FAILED);
4443 return CharacterRange::Singleton(c); 4443 return CharacterRange::Singleton(c);
4444 } 4444 }
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 static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges,
4453 uc16 char_class,
4454 CharacterRange range) {
4455 if (char_class) {
Erik Corry 2010/12/10 14:02:51 char_class == kInvalidCharClass?
4456 CharacterRange::AddClassEscape(char_class, ranges);
4457 } else {
4458 ranges->Add(range);
4459 }
4460 }
4461
4462
4452 RegExpTree* RegExpParser::ParseCharacterClass() { 4463 RegExpTree* RegExpParser::ParseCharacterClass() {
4453 static const char* kUnterminated = "Unterminated character class"; 4464 static const char* kUnterminated = "Unterminated character class";
4454 static const char* kRangeOutOfOrder = "Range out of order in character class"; 4465 static const char* kRangeOutOfOrder = "Range out of order in character class";
4455 4466
4456 ASSERT_EQ(current(), '['); 4467 ASSERT_EQ(current(), '[');
4457 Advance(); 4468 Advance();
4458 bool is_negated = false; 4469 bool is_negated = false;
4459 if (current() == '^') { 4470 if (current() == '^') {
4460 is_negated = true; 4471 is_negated = true;
4461 Advance(); 4472 Advance();
4462 } 4473 }
4463 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); 4474 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2);
4464 while (has_more() && current() != ']') { 4475 while (has_more() && current() != ']') {
4465 uc16 char_class = 0; 4476 uc16 char_class = 0;
4466 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); 4477 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
4467 if (char_class) {
4468 CharacterRange::AddClassEscape(char_class, ranges);
4469 continue;
4470 }
4471 if (current() == '-') { 4478 if (current() == '-') {
4472 Advance(); 4479 Advance();
4473 if (current() == kEndMarker) { 4480 if (current() == kEndMarker) {
4474 // If we reach the end we break out of the loop and let the 4481 // If we reach the end we break out of the loop and let the
4475 // following code report an error. 4482 // following code report an error.
4476 break; 4483 break;
4477 } else if (current() == ']') { 4484 } else if (current() == ']') {
4478 ranges->Add(first); 4485 AddRangeOrEscape(ranges, char_class, first);
4479 ranges->Add(CharacterRange::Singleton('-')); 4486 ranges->Add(CharacterRange::Singleton('-'));
4480 break; 4487 break;
4481 } 4488 }
4482 CharacterRange next = ParseClassAtom(&char_class CHECK_FAILED); 4489 uc16 char_class_2 = 0;
Erik Corry 2010/12/10 14:02:51 kInvalidCharClass
4483 if (char_class) { 4490 CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED);
4484 ranges->Add(first); 4491 if (char_class || char_class_2) {
Erik Corry 2010/12/10 14:02:51 And here.
4492 // Either end is an escaped character class. Treat the '-' verbatim.
4493 AddRangeOrEscape(ranges, char_class, first);
4485 ranges->Add(CharacterRange::Singleton('-')); 4494 ranges->Add(CharacterRange::Singleton('-'));
4486 CharacterRange::AddClassEscape(char_class, ranges); 4495 AddRangeOrEscape(ranges, char_class_2, next);
4487 continue; 4496 continue;
4488 } 4497 }
4489 if (first.from() > next.to()) { 4498 if (first.from() > next.to()) {
4490 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED); 4499 return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED);
4491 } 4500 }
4492 ranges->Add(CharacterRange::Range(first.from(), next.to())); 4501 ranges->Add(CharacterRange::Range(first.from(), next.to()));
4493 } else { 4502 } else {
4494 ranges->Add(first); 4503 AddRangeOrEscape(ranges, char_class, first);
4495 } 4504 }
4496 } 4505 }
4497 if (!has_more()) { 4506 if (!has_more()) {
4498 return ReportError(CStrVector(kUnterminated) CHECK_FAILED); 4507 return ReportError(CStrVector(kUnterminated) CHECK_FAILED);
4499 } 4508 }
4500 Advance(); 4509 Advance();
4501 if (ranges->length() == 0) { 4510 if (ranges->length() == 0) {
4502 ranges->Add(CharacterRange::Everything()); 4511 ranges->Add(CharacterRange::Everything());
4503 is_negated = !is_negated; 4512 is_negated = !is_negated;
4504 } 4513 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
4679 Handle<String> source = Handle<String>(String::cast(script->source())); 4688 Handle<String> source = Handle<String>(String::cast(script->source()));
4680 result = parser.ParseProgram(source, info->is_global()); 4689 result = parser.ParseProgram(source, info->is_global());
4681 } 4690 }
4682 } 4691 }
4683 4692
4684 info->SetFunction(result); 4693 info->SetFunction(result);
4685 return (result != NULL); 4694 return (result != NULL);
4686 } 4695 }
4687 4696
4688 } } // namespace v8::internal 4697 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698