Don't let DFA execution bail when slow for RE2::Set.
Change-Id: I0e6b8c32cc78a4d37ecf241f2c42c3d2303f388d
Reviewed-on: https://code-review.googlesource.com/c/re2/+/42012
Reviewed-by: Paul Wankadia <junyer@google.com>
diff --git a/re2/dfa.cc b/re2/dfa.cc
index 91292d4..81adb30 100644
--- a/re2/dfa.cc
+++ b/re2/dfa.cc
@@ -1415,9 +1415,11 @@
// byte runs at about 0.2 MB/s, while the NFA (nfa.cc) can do the
// same at about 2 MB/s. Unless we're processing an average
// of 10 bytes per state computation, fail so that RE2 can
- // fall back to the NFA.
+ // fall back to the NFA. However, RE2::Set cannot fall back,
+ // so we just have to keep on keeping on in that case.
if (dfa_should_bail_when_slow && resetp != NULL &&
- static_cast<size_t>(p - resetp) < 10*state_cache_.size()) {
+ static_cast<size_t>(p - resetp) < 10*state_cache_.size() &&
+ kind_ != Prog::kManyMatch) {
params->failed = true;
return false;
}
diff --git a/re2/testing/set_test.cc b/re2/testing/set_test.cc
index ad20ed7..61d1cf2 100644
--- a/re2/testing/set_test.cc
+++ b/re2/testing/set_test.cc
@@ -201,18 +201,4 @@
ASSERT_EQ(v[0], 0);
}
-TEST(Set, OutOfMemory) {
- RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);
-
- std::string a(10000, 'a');
- ASSERT_EQ(s.Add(a, NULL), 0);
- ASSERT_EQ(s.Compile(), true);
-
- std::vector<int> v;
- RE2::Set::ErrorInfo ei;
- ASSERT_EQ(s.Match(a, &v, &ei), false);
- ASSERT_EQ(v.size(), 0);
- ASSERT_EQ(ei.kind, RE2::Set::kOutOfMemory);
-}
-
} // namespace re2