56 lines
2.6 KiB
Diff
56 lines
2.6 KiB
Diff
Index: icu/source/i18n/regexcmp.cpp
|
|
===================================================================
|
|
--- icu/source/i18n/regexcmp.cpp (revision 36726)
|
|
+++ icu/source/i18n/regexcmp.cpp (revision 36727)
|
|
@@ -2340,5 +2340,13 @@
|
|
if (fIntervalUpper == 0) {
|
|
// Pathological case. Attempt no matches, as if the block doesn't exist.
|
|
+ // Discard the generated code for the block.
|
|
+ // If the block included parens, discard the info pertaining to them as well.
|
|
fRXPat->fCompiledPat->setSize(topOfBlock);
|
|
+ if (fMatchOpenParen >= topOfBlock) {
|
|
+ fMatchOpenParen = -1;
|
|
+ }
|
|
+ if (fMatchCloseParen >= topOfBlock) {
|
|
+ fMatchCloseParen = -1;
|
|
+ }
|
|
return TRUE;
|
|
}
|
|
Index: icu/source/i18n/regexcmp.h
|
|
===================================================================
|
|
--- icu/source/i18n/regexcmp.h (revision 36726)
|
|
+++ icu/source/i18n/regexcmp.h (revision 36727)
|
|
@@ -188,5 +188,7 @@
|
|
// of the slot reserved for a state save
|
|
// at the start of the most recently processed
|
|
- // parenthesized block.
|
|
+ // parenthesized block. Updated when processing
|
|
+ // a close to the location for the corresponding open.
|
|
+
|
|
int32_t fMatchCloseParen; // The position in the pattern of the first
|
|
// location after the most recently processed
|
|
Index: icu/source/test/testdata/regextst.txt
|
|
===================================================================
|
|
--- icu/source/test/testdata/regextst.txt (revision 36726)
|
|
+++ icu/source/test/testdata/regextst.txt (revision 36727)
|
|
@@ -1202,4 +1202,13 @@
|
|
"A|B|\U00010000" "hello \ud800"
|
|
|
|
+# Bug 11369
|
|
+# Incorrect optimization of patterns with a zero length quantifier {0}
|
|
+
|
|
+"(.|b)(|b){0}\$(?#xxx){3}(?>\D*)" "AAAAABBBBBCCCCCDDDDEEEEE"
|
|
+"(|b)ab(c)" "<0><1></1>ab<2>c</2></0>"
|
|
+"(|b){0}a{3}(D*)" "<0>aaa<2></2></0>"
|
|
+"(|b){0,1}a{3}(D*)" "<0><1></1>aaa<2></2></0>"
|
|
+"((|b){0})a{3}(D*)" "<0><1></1>aaa<3></3></0>"
|
|
+
|
|
# Bug 11370
|
|
# Max match length computation of look-behind expression gives result that is too big to fit in the
|
|
@@ -1209,4 +1218,5 @@
|
|
"(?<!(0123456789a){10000000})x" E "no match"
|
|
"(?<!\\ubeaf(\\ubeaf{11000}){11000})" E "no match"
|
|
+
|
|
|
|
# Random debugging, Temporary
|