diff options
author | Jeremy Evans <[email protected]> | 2020-11-23 14:40:59 -0800 |
---|---|---|
committer | Benoit Daloze <[email protected]> | 2020-12-02 18:42:02 +0100 |
commit | 9e73177d5362c1986814f411961b712967dc5f97 (patch) | |
tree | f0ddbddc3e24423cd39128c3bdebf07d7e6608d1 /regparse.c | |
parent | 7546be2ca0de45bcc2a72d9b4ae0cd44a1322031 (diff) |
Do not reduce quantifiers if it affects which text will be matched
Quantifier reduction when using +?)* and +?)+ should not be done
as it affects which text will be matched.
This removes the need for the RQ_PQ_Q ReduceType, so remove the
enum entry and related switch case.
Test that these are the only two patterns affected by testing all
quantifier reduction tuples for both the captured and uncaptured
cases and making sure the matched text is the same for both.
Fixes [Bug #17341]
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3808
Diffstat (limited to 'regparse.c')
-rw-r--r-- | regparse.c | 9 |
1 files changed, 1 insertions, 8 deletions
diff --git a/regparse.c b/regparse.c index 7639db3bbe..24ff5b9a18 100644 --- a/regparse.c +++ b/regparse.c @@ -2187,7 +2187,6 @@ enum ReduceType { RQ_AQ, /* to '*?' */ RQ_QQ, /* to '??' */ RQ_P_QQ, /* to '+)??' */ - RQ_PQ_Q /* to '+?)?' */ }; static enum ReduceType const ReduceTypeTable[6][6] = { @@ -2197,7 +2196,7 @@ static enum ReduceType const ReduceTypeTable[6][6] = { {RQ_A, RQ_A, RQ_DEL, RQ_ASIS, RQ_P_QQ, RQ_DEL}, /* '+' */ {RQ_DEL, RQ_AQ, RQ_AQ, RQ_DEL, RQ_AQ, RQ_AQ}, /* '??' */ {RQ_DEL, RQ_DEL, RQ_DEL, RQ_DEL, RQ_DEL, RQ_DEL}, /* '*?' */ - {RQ_ASIS, RQ_PQ_Q, RQ_DEL, RQ_AQ, RQ_AQ, RQ_DEL} /* '+?' */ + {RQ_ASIS, RQ_ASIS, RQ_ASIS, RQ_AQ, RQ_AQ, RQ_DEL} /* '+?' */ }; extern void @@ -2234,12 +2233,6 @@ onig_reduce_nested_quantifier(Node* pnode, Node* cnode) c->lower = 1; c->upper = REPEAT_INFINITE; c->greedy = 1; return ; break; - case RQ_PQ_Q: - p->target = cnode; - p->lower = 0; p->upper = 1; p->greedy = 1; - c->lower = 1; c->upper = REPEAT_INFINITE; c->greedy = 0; - return ; - break; case RQ_ASIS: p->target = cnode; return ; |