 Chromium Code Reviews
 Chromium Code Reviews Issue 5723002:
  Make RegExp character class match JSC.   (Closed)
    
  
    Issue 5723002:
  Make RegExp character class match JSC.   (Closed) 
  | Index: src/parser.cc | 
| diff --git a/src/parser.cc b/src/parser.cc | 
| index fd93aae4241d7494dc26522ca4904081e746c4eb..103ab42e14cbd5f3d7fcace31e082d0cc50f6bb0 100644 | 
| --- a/src/parser.cc | 
| +++ b/src/parser.cc | 
| @@ -4449,6 +4449,17 @@ CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) { | 
| } | 
| +static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges, | 
| + uc16 char_class, | 
| + CharacterRange range) { | 
| + if (char_class) { | 
| 
Erik Corry
2010/12/10 14:02:51
char_class == kInvalidCharClass?
 | 
| + CharacterRange::AddClassEscape(char_class, ranges); | 
| + } else { | 
| + ranges->Add(range); | 
| + } | 
| +} | 
| + | 
| + | 
| RegExpTree* RegExpParser::ParseCharacterClass() { | 
| static const char* kUnterminated = "Unterminated character class"; | 
| static const char* kRangeOutOfOrder = "Range out of order in character class"; | 
| @@ -4464,10 +4475,6 @@ RegExpTree* RegExpParser::ParseCharacterClass() { | 
| while (has_more() && current() != ']') { | 
| uc16 char_class = 0; | 
| CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); | 
| - if (char_class) { | 
| - CharacterRange::AddClassEscape(char_class, ranges); | 
| - continue; | 
| - } | 
| if (current() == '-') { | 
| Advance(); | 
| if (current() == kEndMarker) { | 
| @@ -4475,15 +4482,17 @@ RegExpTree* RegExpParser::ParseCharacterClass() { | 
| // following code report an error. | 
| break; | 
| } else if (current() == ']') { | 
| - ranges->Add(first); | 
| + AddRangeOrEscape(ranges, char_class, first); | 
| ranges->Add(CharacterRange::Singleton('-')); | 
| break; | 
| } | 
| - CharacterRange next = ParseClassAtom(&char_class CHECK_FAILED); | 
| - if (char_class) { | 
| - ranges->Add(first); | 
| + uc16 char_class_2 = 0; | 
| 
Erik Corry
2010/12/10 14:02:51
kInvalidCharClass
 | 
| + CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED); | 
| + if (char_class || char_class_2) { | 
| 
Erik Corry
2010/12/10 14:02:51
And here.
 | 
| + // Either end is an escaped character class. Treat the '-' verbatim. | 
| + AddRangeOrEscape(ranges, char_class, first); | 
| ranges->Add(CharacterRange::Singleton('-')); | 
| - CharacterRange::AddClassEscape(char_class, ranges); | 
| + AddRangeOrEscape(ranges, char_class_2, next); | 
| continue; | 
| } | 
| if (first.from() > next.to()) { | 
| @@ -4491,7 +4500,7 @@ RegExpTree* RegExpParser::ParseCharacterClass() { | 
| } | 
| ranges->Add(CharacterRange::Range(first.from(), next.to())); | 
| } else { | 
| - ranges->Add(first); | 
| + AddRangeOrEscape(ranges, char_class, first); | 
| } | 
| } | 
| if (!has_more()) { |