[Python-checkins] r59862 - in python/trunk: Misc/NEWS Modules/_sre.c

facundo.batista python-checkins at python.org
Tue Jan 8 22:10:12 CET 2008


Author: facundo.batista
Date: Tue Jan 8 22:10:12 2008
New Revision: 59862
Modified:
 python/trunk/Misc/NEWS
 python/trunk/Modules/_sre.c
Log:
Issue 846388. Adds a call to PyErr_CheckSignals to
SRE_MATCH so that signal handlers can be invoked during
long regular expression matches. It also adds a new
error return value indicating that an exception
occurred in a signal handler during the match, allowing
exceptions in the signal handler to propagate up to the
main loop. Thanks Josh Hoyt and Ralf Schmitt.
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Tue Jan 8 22:10:12 2008
@@ -348,6 +348,9 @@
 Library
 -------
 
+- Issue #846388. re.match is interruptible now, which is particularly
+ good for long regular expression matches.
+
 - pyexpat, patch #1137: allow setting buffer_size attribute 
 on Parser objects to set the character data buffer size.
 
Modified: python/trunk/Modules/_sre.c
==============================================================================
--- python/trunk/Modules/_sre.c	(original)
+++ python/trunk/Modules/_sre.c	Tue Jan 8 22:10:12 2008
@@ -99,6 +99,7 @@
 #define SRE_ERROR_STATE -2 /* illegal state */
 #define SRE_ERROR_RECURSION_LIMIT -3 /* runaway recursion */
 #define SRE_ERROR_MEMORY -9 /* out of memory */
+#define SRE_ERROR_INTERRUPTED -10 /* signal handler raised exception */
 
 #if defined(VERBOSE)
 #define TRACE(v) printf v
@@ -809,6 +810,7 @@
 Py_ssize_t alloc_pos, ctx_pos = -1;
 Py_ssize_t i, ret = 0;
 Py_ssize_t jump;
+ unsigned int sigcount=0;
 
 SRE_MATCH_CONTEXT* ctx;
 SRE_MATCH_CONTEXT* nextctx;
@@ -837,6 +839,9 @@
 }
 
 for (;;) {
+ ++sigcount;
+ if ((0 == (sigcount & 0xfff)) && PyErr_CheckSignals())
+ RETURN_ERROR(SRE_ERROR_INTERRUPTED);
 
 switch (*ctx->pattern++) {
 
@@ -1834,6 +1839,9 @@
 case SRE_ERROR_MEMORY:
 PyErr_NoMemory();
 break;
+ case SRE_ERROR_INTERRUPTED:
+ /* An exception has already been raised, so let it fly */
+ break;
 default:
 /* other error codes indicate compiler/engine bugs */
 PyErr_SetString(


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /