diff options
author | Hiroya Fujinami <make.just.on@gmail.com> | 2023-12-29 19:30:24 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-29 19:30:24 +0900 |
commit | bb59696614083660241ef272f222628cbfa95844 (patch) | |
tree | 91986179da74b49189f6c58ef8c97341b1939eba | |
parent | 1ade170a6cac402d362d90bbf12e566d6a4f9ba1 (diff) | |
download | ruby-bb59696614083660241ef272f222628cbfa95844.tar.gz |
Fix [Bug #20098]: set counter value for {n,m} repetition correctly (#9391)
-rw-r--r-- | regexec.c | 5 | ||||
-rw-r--r-- | test/ruby/test_regexp.rb | 8 |
2 files changed, 11 insertions, 2 deletions
@@ -704,11 +704,11 @@ init_cache_opcodes(const regex_t* reg, OnigCacheOpcode* cache_opcodes, long* num OnigRepeatRange *repeat_range = ®->repeat_range[repeat_mem]; if (repeat_range->lower < repeat_range->upper) { INC_CACHE_OPCODES; - cache_point--; + cache_point -= lookaround_nesting != 0 ? 2 : 1; } cache_point -= num_cache_points_in_repeat; int repeat_bounds = repeat_range->upper == 0x7fffffff ? 1 : repeat_range->upper - repeat_range->lower; - cache_point += num_cache_points_in_repeat * repeat_range->lower + (num_cache_points_in_repeat + 1) * repeat_bounds; + cache_point += num_cache_points_in_repeat * repeat_range->lower + (num_cache_points_in_repeat + (lookaround_nesting != 0 ? 2 : 1)) * repeat_bounds; OnigCacheOpcode* cache_opcodes_in_repeat = cache_opcodes - 1; while (cache_opcodes_at_repeat <= cache_opcodes_in_repeat) { cache_opcodes_in_repeat->num_cache_points_in_outer_repeat = num_cache_points_in_repeat; @@ -2542,6 +2542,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, MATCH_CACHE_DEBUG;\ if (msa->match_cache_buf[match_cache_point_index] & match_cache_point_mask) {\ MATCH_CACHE_DEBUG_HIT;\ + if (*pbegin == OP_REPEAT_INC) stkp->u.repeat.count--;\ if (cache_opcode->lookaround_nesting == 0) goto fail;\ else if (cache_opcode->lookaround_nesting < 0) {\ if (check_extended_match_cache_point(msa->match_cache_buf, match_cache_point_index, match_cache_point_mask)) {\ diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb index b889b1a64e..be563dfa52 100644 --- a/test/ruby/test_regexp.rb +++ b/test/ruby/test_regexp.rb @@ -1987,6 +1987,14 @@ class TestRegexp < Test::Unit::TestCase end end + def test_bug_20098 # [Bug #20098] + assert /a((.|.)|bc){,4}z/.match? 'abcbcbcbcz' + assert /a(b+?c*){4,5}z/.match? 'abbbccbbbccbcbcz' + assert /a(b+?(.|.)){2,3}z/.match? 'abbbcbbbcbbbcz' + assert /a(b*?(.|.)[bc]){2,5}z/.match? 'abcbbbcbcccbcz' + assert /^(?:.+){2,4}?b|b/.match? "aaaabaa" + end + def test_linear_time_p assert_send [Regexp, :linear_time?, /a/] assert_send [Regexp, :linear_time?, 'a'] |