diff --git a/include/boost/regex/v4/perl_matcher.hpp b/include/boost/regex/v4/perl_matcher.hpp index 52e0bcec..190ff84e 100644 --- a/include/boost/regex/v4/perl_matcher.hpp +++ b/include/boost/regex/v4/perl_matcher.hpp @@ -366,7 +366,7 @@ public: BidiIterator l_base) : m_result(what), base(first), last(end), position(first), backstop(l_base), re(e), traits_inst(e.get_traits()), - m_independent(false), next_count(&rep_obj), rep_obj(&next_count), recursion_stack_position(0) + m_independent(false), next_count(&rep_obj), rep_obj(&next_count)/*, recursion_stack_position(0)*/ { construct_init(e, f); } @@ -488,8 +488,8 @@ private: // the bitmask to use when determining whether a match_any matches a newline or not: unsigned char match_any_mask; // recursion information: - recursion_info recursion_stack[50]; - unsigned recursion_stack_position; + std::vector > recursion_stack; + //unsigned recursion_stack_position; #ifdef BOOST_REGEX_NON_RECURSIVE // diff --git a/include/boost/regex/v4/perl_matcher_common.hpp b/include/boost/regex/v4/perl_matcher_common.hpp index fd439f84..1657d483 100644 --- a/include/boost/regex/v4/perl_matcher_common.hpp +++ b/include/boost/regex/v4/perl_matcher_common.hpp @@ -735,7 +735,7 @@ inline bool perl_matcher::match_assert_backref( int id = -index-1; if(id >= 10000) id = re.get_data().get_id(id); - result = recursion_stack_position && ((recursion_stack[recursion_stack_position-1].id == id) || (index == 0)); + result = !recursion_stack.empty() && ((recursion_stack.back().id == id) || (index == 0)); pstate = pstate->next.p; } return result; diff --git a/include/boost/regex/v4/perl_matcher_non_recursive.hpp b/include/boost/regex/v4/perl_matcher_non_recursive.hpp index 0fcd4548..a3bc61f8 100644 --- a/include/boost/regex/v4/perl_matcher_non_recursive.hpp +++ b/include/boost/regex/v4/perl_matcher_non_recursive.hpp @@ -898,19 +898,20 @@ bool perl_matcher::match_recursion() // // Set new call stack: // - if(recursion_stack_position >= static_cast(sizeof(recursion_stack)/sizeof(recursion_stack[0]))) + if(recursion_stack.capacity() == 0) { - return false; + recursion_stack.reserve(50); } - recursion_stack[recursion_stack_position].preturn_address = pstate->next.p; - recursion_stack[recursion_stack_position].results = *m_presult; + recursion_stack.push_back(recursion_info()); + recursion_stack.back().preturn_address = pstate->next.p; + recursion_stack.back().results = *m_presult; if(static_cast(pstate)->state_id > 0) { push_repeater_count(static_cast(pstate)->state_id, &next_count); } pstate = static_cast(pstate)->alt.p; - recursion_stack[recursion_stack_position].id = static_cast(pstate)->index; - ++recursion_stack_position; + recursion_stack.back().id = static_cast(pstate)->index; + //++recursion_stack_position; //BOOST_ASSERT(recursion_stack[recursion_stack_position-1].id); return true; @@ -927,14 +928,15 @@ bool perl_matcher::match_endmark() { m_presult->set_second(position, index); } - if(recursion_stack_position) + if(!recursion_stack.empty()) { - if(index == recursion_stack[recursion_stack_position-1].id) + if(index == recursion_stack.back().id) { - --recursion_stack_position; - pstate = recursion_stack[recursion_stack_position].preturn_address; - *m_presult = recursion_stack[recursion_stack_position].results; - push_recursion(recursion_stack[recursion_stack_position].id, recursion_stack[recursion_stack_position].preturn_address, &recursion_stack[recursion_stack_position].results); + //--recursion_stack_position; + pstate = recursion_stack.back().preturn_address; + *m_presult = recursion_stack.back().results; + push_recursion(recursion_stack.back().id, recursion_stack.back().preturn_address, &recursion_stack.back().results); + recursion_stack.pop_back(); } } } @@ -951,13 +953,14 @@ bool perl_matcher::match_endmark() template bool perl_matcher::match_match() { - if(recursion_stack_position) + if(!recursion_stack.empty()) { - BOOST_ASSERT(0 == recursion_stack[recursion_stack_position-1].id); - --recursion_stack_position; - pstate = recursion_stack[recursion_stack_position].preturn_address; - *m_presult = recursion_stack[recursion_stack_position].results; - push_recursion(recursion_stack[recursion_stack_position].id, recursion_stack[recursion_stack_position].preturn_address, &recursion_stack[recursion_stack_position].results); + BOOST_ASSERT(0 == recursion_stack.back().id); + //--recursion_stack_position; + pstate = recursion_stack.back().preturn_address; + *m_presult = recursion_stack.back().results; + push_recursion(recursion_stack.back().id, recursion_stack.back().preturn_address, &recursion_stack.back().results); + recursion_stack.pop_back(); return true; } if((m_match_flags & match_not_null) && (position == (*m_presult)[0].first)) @@ -1523,10 +1526,11 @@ bool perl_matcher::unwind_recursion(bool r) saved_recursion* pmp = static_cast*>(m_backup_state); if(!r) { - recursion_stack[recursion_stack_position].id = pmp->recursion_id; - recursion_stack[recursion_stack_position].preturn_address = pmp->preturn_address; - recursion_stack[recursion_stack_position].results = pmp->results; - ++recursion_stack_position; + recursion_stack.push_back(recursion_info()); + recursion_stack.back().id = pmp->recursion_id; + recursion_stack.back().preturn_address = pmp->preturn_address; + recursion_stack.back().results = pmp->results; + //++recursion_stack_position; } boost::re_detail::inplace_destroy(pmp++); m_backup_state = pmp; @@ -1539,7 +1543,7 @@ bool perl_matcher::unwind_recursion_pop(bool r) saved_state* pmp = static_cast(m_backup_state); if(!r) { - --recursion_stack_position; + recursion_stack.pop_back(); } boost::re_detail::inplace_destroy(pmp++); m_backup_state = pmp; diff --git a/include/boost/regex/v4/perl_matcher_recursive.hpp b/include/boost/regex/v4/perl_matcher_recursive.hpp index d0de8025..92bb2136 100644 --- a/include/boost/regex/v4/perl_matcher_recursive.hpp +++ b/include/boost/regex/v4/perl_matcher_recursive.hpp @@ -857,16 +857,17 @@ bool perl_matcher::match_recursion() // // Set new call stack: // - if(recursion_stack_position >= static_cast(sizeof(recursion_stack)/sizeof(recursion_stack[0]))) + if(recursion_stack.capacity() == 0) { - return false; + recursion_stack.reserve(50); } - recursion_stack[recursion_stack_position].preturn_address = pstate->next.p; - recursion_stack[recursion_stack_position].results = *m_presult; - recursion_stack[recursion_stack_position].repeater_stack = next_count; + recursion_stack.push_back(recursion_info()); + recursion_stack.back().preturn_address = pstate->next.p; + recursion_stack.back().results = *m_presult; + recursion_stack.back().repeater_stack = next_count; pstate = static_cast(pstate)->alt.p; - recursion_stack[recursion_stack_position].id = static_cast(pstate)->index; - ++recursion_stack_position; + recursion_stack.back().id = static_cast(pstate)->index; + //++recursion_stack_position; repeater_count* saved = next_count; repeater_count r(&next_count); // resets all repeat counts since we're recursing and starting fresh on those @@ -876,9 +877,10 @@ bool perl_matcher::match_recursion() if(!result) { - --recursion_stack_position; - next_count = recursion_stack[recursion_stack_position].repeater_stack; - *m_presult = recursion_stack[recursion_stack_position].results; + //--recursion_stack_position; + next_count = recursion_stack.back().repeater_stack; + *m_presult = recursion_stack.back().results; + recursion_stack.pop_back(); return false; } return true; @@ -895,20 +897,21 @@ bool perl_matcher::match_endmark() { m_presult->set_second(position, index); } - if(recursion_stack_position) + if(!recursion_stack.empty()) { - if(index == recursion_stack[recursion_stack_position-1].id) + if(index == recursion_stack.back().id) { - --recursion_stack_position; - recursion_info saved = recursion_stack[recursion_stack_position]; + //--recursion_stack_position; + recursion_info saved = recursion_stack.back(); + recursion_stack.pop_back(); const re_syntax_base* saved_state = pstate = saved.preturn_address; repeater_count* saved_count = next_count; next_count = saved.repeater_stack; *m_presult = saved.results; if(!match_all_states()) { - recursion_stack[recursion_stack_position] = saved; - ++recursion_stack_position; + recursion_stack.push_back(saved); + //++recursion_stack_position; next_count = saved_count; return false; } @@ -928,17 +931,19 @@ bool perl_matcher::match_endmark() template bool perl_matcher::match_match() { - if(recursion_stack_position) + if(!recursion_stack.empty()) { - BOOST_ASSERT(0 == recursion_stack[recursion_stack_position-1].id); - --recursion_stack_position; - const re_syntax_base* saved_state = pstate = recursion_stack[recursion_stack_position].preturn_address; - *m_presult = recursion_stack[recursion_stack_position].results; + BOOST_ASSERT(0 == recursion_stack.back().id); + //--recursion_stack_position; + const re_syntax_base* saved_state = pstate = recursion_stack.back().preturn_address; + *m_presult = recursion_stack.back().results; + recursion_stack.pop_back(); if(!match_all_states()) { - recursion_stack[recursion_stack_position].preturn_address = saved_state; - recursion_stack[recursion_stack_position].results = *m_presult; - ++recursion_stack_position; + recursion_stack.push_back(recursion_info()); + recursion_stack.back().preturn_address = saved_state; + recursion_stack.back().results = *m_presult; + //++recursion_stack_position; return false; } return true; diff --git a/performance/command_line.cpp b/performance/command_line.cpp index 114dceba..7c7a5a68 100644 --- a/performance/command_line.cpp +++ b/performance/command_line.cpp @@ -100,6 +100,9 @@ int handle_argument(const std::string& what) #endif #ifdef BOOST_HAS_PCRE time_pcre = true; +#endif +#ifdef BOOST_HAS_XPRESSIVE + time_xpressive = true; #endif } else if(what == "-test-matches")