]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-109631: Allow interruption of short repeated regex matches (GH-109867)...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 26 Sep 2023 08:19:29 +0000 (01:19 -0700)
committerGitHub <noreply@github.com>
Tue, 26 Sep 2023 08:19:29 +0000 (08:19 +0000)
Counting for signal checking now continues in new match from the point where
it ended in the previous match instead of starting from 0.
(cherry picked from commit 8ac2085b80eca4d9b2a1093d0a7da020fd12e11a)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst [new file with mode: 0644]
Modules/_sre/sre.h
Modules/_sre/sre_lib.h

diff --git a/Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst b/Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst
new file mode 100644 (file)
index 0000000..58af2e5
--- /dev/null
@@ -0,0 +1,3 @@
+:mod:`re` functions such as :func:`re.findall`, :func:`re.split`,
+:func:`re.search` and :func:`re.sub` which perform short repeated matches
+can now be interrupted by user.
index 52ae3e11b5f750e57f2adc25efcd330efbd2eed1..8d09b110ede11c4d2888db18183362a90aa31db3 100644 (file)
@@ -83,6 +83,7 @@ typedef struct {
     size_t data_stack_base;
     /* current repeat context */
     SRE_REPEAT *repeat;
+    unsigned int sigcount;
 } SRE_STATE;
 
 typedef struct {
index e83149825e2cdb899162ebb79ad2fc5cf3d6ae9f..f8d556b2db85c0576aafc968668bd73691a6054d 100644 (file)
@@ -563,7 +563,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
     Py_ssize_t alloc_pos, ctx_pos = -1;
     Py_ssize_t ret = 0;
     int jump;
-    unsigned int sigcount=0;
+    unsigned int sigcount = state->sigcount;
 
     SRE(match_context)* ctx;
     SRE(match_context)* nextctx;
@@ -1565,8 +1565,10 @@ exit:
     ctx_pos = ctx->last_ctx_pos;
     jump = ctx->jump;
     DATA_POP_DISCARD(ctx);
-    if (ctx_pos == -1)
+    if (ctx_pos == -1) {
+        state->sigcount = sigcount;
         return ret;
+    }
     DATA_LOOKUP_AT(SRE(match_context), ctx, ctx_pos);
 
     switch (jump) {