diff options
author | timshen <timshen@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-04-28 04:16:48 +0000 |
---|---|---|
committer | timshen <timshen@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-04-28 04:16:48 +0000 |
commit | 4d95a3c467f28b87b595951c48bac9847e60886b (patch) | |
tree | 75c7357e8bb4da104798be4dbbf37bed80aa534e /libstdc++-v3 | |
parent | fd762ec155f222bcd944ded0b14057b3a7708bcc (diff) | |
download | gcc-4d95a3c467f28b87b595951c48bac9847e60886b.tar.gz |
* include/bits/regex.tcc: Handle regex_constants::__polynomial.
* include/bits/regex_automaton.tcc: Throw exception when parsing
back-reference with flag __polynomial.
* include/bits/regex_constants.h: Add extension flag
syntax_option_type __polynomial.
* bits/regex_executor.tcc: Still let BFS process ECMAScript.
Alternative operation will be fixed in the coming refactoring.
* testsuite/28_regex/algorithms/regex_search/61424.cc: Turn
loose match_search_debug to use DFS only.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222500 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex.tcc | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_automaton.tcc | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_constants.h | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex_executor.tcc | 3 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/28_regex/algorithms/regex_search/61424.cc | 4 |
6 files changed, 31 insertions, 19 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3580f39a453..c25f2a239c4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2015-04-28 Tim Shen <timshen@google.com> + + * include/bits/regex.tcc: Handle regex_constants::__polynomial. + * include/bits/regex_automaton.tcc: Throw exception when parsing + back-reference with flag __polynomial. + * include/bits/regex_constants.h: Add extension flag + syntax_option_type __polynomial. + * bits/regex_executor.tcc: Still let BFS process ECMAScript. + Alternative operation will be fixed in the coming refactoring. + * testsuite/28_regex/algorithms/regex_search/61424.cc: Turn + loose match_search_debug to use DFS only. + 2015-04-27 Sandra Loosemore <sandra@codesourcery.com> PR libstdc++/65909 diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc index 823ad51c3e8..fedc2b9edff 100644 --- a/libstdc++-v3/include/bits/regex.tcc +++ b/libstdc++-v3/include/bits/regex.tcc @@ -28,13 +28,6 @@ * Do not attempt to use it directly. @headername{regex} */ -// A non-standard switch to let the user pick the matching algorithm. -// If _GLIBCXX_REGEX_USE_THOMPSON_NFA is defined, the thompson NFA -// algorithm will be used. This algorithm is not enabled by default, -// and cannot be used if the regex contains back-references, but has better -// (polynomial instead of exponential) worst case performance. -// See __regex_algo_impl below. - namespace std _GLIBCXX_VISIBILITY(default) { namespace __detail @@ -67,16 +60,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION for (auto& __it : __res) __it.matched = false; - // __policy is used by testsuites so that they can use Thompson NFA - // without defining a macro. Users should define - // _GLIBCXX_REGEX_USE_THOMPSON_NFA if they need to use this approach. bool __ret; - if (!__re._M_automaton->_M_has_backref - && !(__re._M_flags & regex_constants::ECMAScript) -#ifndef _GLIBCXX_REGEX_USE_THOMPSON_NFA - && __policy == _RegexExecutorPolicy::_S_alternate -#endif - ) + if ((__re.flags() & regex_constants::__polynomial) + || (__policy == _RegexExecutorPolicy::_S_alternate + && !__re._M_automaton->_M_has_backref)) { _Executor<_BiIter, _Alloc, _TraitsT, false> __executor(__s, __e, __m, __re, __flags); diff --git a/libstdc++-v3/include/bits/regex_automaton.tcc b/libstdc++-v3/include/bits/regex_automaton.tcc index fbc33897574..72fe978d68c 100644 --- a/libstdc++-v3/include/bits/regex_automaton.tcc +++ b/libstdc++-v3/include/bits/regex_automaton.tcc @@ -148,6 +148,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _StateIdT _NFA<_TraitsT>::_M_insert_backref(size_t __index) { + if (this->_M_flags & regex_constants::__polynomial) + __throw_regex_error(regex_constants::error_complexity); // To figure out whether a backref is valid, a stack is used to store // unfinished sub-expressions. For example, when parsing // "(a(b)(c\\1(d)))" at '\\1', _M_subexpr_count is 3, indicating that 3 diff --git a/libstdc++-v3/include/bits/regex_constants.h b/libstdc++-v3/include/bits/regex_constants.h index e2c763178ea..80ec7612fc2 100644 --- a/libstdc++-v3/include/bits/regex_constants.h +++ b/libstdc++-v3/include/bits/regex_constants.h @@ -63,6 +63,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _S_awk, _S_grep, _S_egrep, + _S_polynomial, _S_syntax_last }; @@ -169,6 +170,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr syntax_option_type egrep = static_cast<syntax_option_type>(1 << _S_egrep); + /** + * Extension: Ensure both space complexity of compiled regex and + * time complexity execution are not exponential. + * If specified in a regex with back-references, the exception + * regex_constants::error_complexity will be thrown. + */ + constexpr syntax_option_type __polynomial = + static_cast<syntax_option_type>(1 << _S_polynomial); + constexpr inline syntax_option_type operator&(syntax_option_type __a, syntax_option_type __b) { diff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc index f06549964dc..9b5c1c672d2 100644 --- a/libstdc++-v3/include/bits/regex_executor.tcc +++ b/libstdc++-v3/include/bits/regex_executor.tcc @@ -382,8 +382,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION case _S_opcode_alternative: if (_M_nfa._M_flags & regex_constants::ECMAScript) { - // TODO: Let BFS support ECMAScript's alternative operation. - _GLIBCXX_DEBUG_ASSERT(__dfs_mode); + // TODO: Fix BFS support. It is wrong. _M_dfs(__match_mode, __state._M_alt); // Pick lhs if it matches. Only try rhs if it doesn't. if (!_M_has_sol) diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/61424.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/61424.cc index 784be297873..82449cef895 100644 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/61424.cc +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/61424.cc @@ -45,7 +45,9 @@ int main() regex re("tour|tournament|tourn", g); const char str[] = "tournament"; cmatch m; - VERIFY(regex_search_debug(str, m, re)); + VERIFY(regex_search(str, m, re)); + // TODO: Fix ECMAScript BFS matcher. + //VERIFY(regex_search_debug(str, m, re)); VERIFY(sol[i] == m[0]); i++; } |