diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2023-09-26 07:56:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-26 07:56:33 (GMT) |
commit | 8ac2085b80eca4d9b2a1093d0a7da020fd12e11a (patch) | |
tree | 8b8d71d95b130ed511f4d8d53a13a6da1f2dd1cc | |
parent | 7c61a361fc2e93375e22849fffbc20b60e94dbde (diff) | |
download | cpython-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.rst | 3 | ||||
-rw-r--r-- | Modules/_sre/sre.h | 1 | ||||
-rw-r--r-- | Modules/_sre/sre_lib.h | 6 |
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) { |