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()) { |