Chromium Code Reviews| 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()) { |