Merge pull request #164 from zhangyiru/develop

sync PR 162 and PR 163 to v4
This commit is contained in:
jzmaddock
2021-10-20 18:06:23 +01:00
committed by GitHub
3 changed files with 12 additions and 3 deletions

View File

@ -1055,6 +1055,7 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
case syntax_element_jump: case syntax_element_jump:
case syntax_element_startmark: case syntax_element_startmark:
case syntax_element_backstep: case syntax_element_backstep:
case syntax_element_toggle_case:
// can't legally repeat any of the above: // can't legally repeat any of the above:
fail(regex_constants::error_badrepeat, m_position - m_base); fail(regex_constants::error_badrepeat, m_position - m_base);
return false; return false;
@ -3140,7 +3141,13 @@ bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_st
m_alt_jumps.pop_back(); m_alt_jumps.pop_back();
this->m_pdata->m_data.align(); this->m_pdata->m_data.align();
re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset)); re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
BOOST_REGEX_ASSERT(jmp->type == syntax_element_jump); if (jmp->type != syntax_element_jump)
{
// Something really bad happened, this used to be an assert,
// but we'll make it an error just in case we should ever get here.
fail(regex_constants::error_unknown, this->m_position - this->m_base, "Internal logic failed while compiling the expression, probably you added a repeat to something non-repeatable!");
return false;
}
jmp->alt.i = this->m_pdata->m_data.size() - jump_offset; jmp->alt.i = this->m_pdata->m_data.size() - jump_offset;
} }
return true; return true;

View File

@ -88,7 +88,8 @@ typedef regex_error bad_expression;
namespace BOOST_REGEX_DETAIL_NS{ namespace BOOST_REGEX_DETAIL_NS{
inline void BOOST_REGEX_CALL raise_runtime_error(const std::runtime_error& ex) template <class E>
inline void raise_runtime_error(const E& ex)
{ {
#ifndef BOOST_REGEX_STANDALONE #ifndef BOOST_REGEX_STANDALONE
::boost::throw_exception(ex); ::boost::throw_exception(ex);
@ -101,7 +102,7 @@ template <class traits>
void raise_error(const traits& t, regex_constants::error_type code) void raise_error(const traits& t, regex_constants::error_type code)
{ {
(void)t; // warning suppression (void)t; // warning suppression
std::runtime_error e(t.error_string(code)); regex_error e(t.error_string(code), code, 0);
::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(e); ::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(e);
} }

View File

@ -1354,6 +1354,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_alt(bool r)
template <class BidiIterator, class Allocator, class traits> template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool) bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool)
{ {
++used_block_count;
saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state); saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++); boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp; m_backup_state = pmp;