summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-09-26 07:56:33 (GMT)
committerGitHub <noreply@github.com>2023-09-26 07:56:33 (GMT)
commit8ac2085b80eca4d9b2a1093d0a7da020fd12e11a (patch)
tree8b8d71d95b130ed511f4d8d53a13a6da1f2dd1cc
parent7c61a361fc2e93375e22849fffbc20b60e94dbde (diff)
downloadcpython-8ac2085b80eca4d9b2a1093d0a7da020fd12e11a.zip
cpython-8ac2085b80eca4d9b2a1093d0a7da020fd12e11a.tar.gz
cpython-8ac2085b80eca4d9b2a1093d0a7da020fd12e11a.tar.bz2
gh-109631: Allow interruption of short repeated regex matches (GH-109867)
Counting for signal checking now continues in new match from the point where it ended in the previous match instead of starting from 0.
-rw-r--r--Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst3
-rw-r--r--Modules/_sre/sre.h1
-rw-r--r--Modules/_sre/sre_lib.h6
3 files changed, 8 insertions, 2 deletions
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
index 0000000..58af2e5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-09-25-23-00-37.gh-issue-109631.eWSqpO.rst
@@ -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.
diff --git a/Modules/_sre/sre.h b/Modules/_sre/sre.h
index f60078d..83d89d5 100644
--- a/Modules/_sre/sre.h
+++ b/Modules/_sre/sre.h
@@ -95,6 +95,7 @@ typedef struct {
size_t data_stack_base;
/* current repeat context */
SRE_REPEAT *repeat;
+ unsigned int sigcount;
} SRE_STATE;
typedef struct {
diff --git a/Modules/_sre/sre_lib.h b/Modules/_sre/sre_lib.h
index ae80009..3c805ae 100644
--- a/Modules/_sre/sre_lib.h
+++ b/Modules/_sre/sre_lib.h
@@ -564,7 +564,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;
@@ -1567,8 +1567,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) {