Skip to content

Commit

Permalink
pythongh-106508: Improve debugging of the _sre module
Browse files Browse the repository at this point in the history
Now the VERBOSE macro can control tracing on per-pattern basis:

* 0 -- disabled
* 1 -- only if the DEBUG flag set
* 2 -- always
  • Loading branch information
serhiy-storchaka committed Jul 7, 2023
1 parent 24fb627 commit f216019
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 5 deletions.
32 changes: 27 additions & 5 deletions Modules/_sre/sre.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,14 @@ static const char copyright[] =

#include <ctype.h>

/* defining this one enables tracing */
#undef VERBOSE
/* Defining this one controls tracing:
* 0 -- disabled
* 1 -- only if the DEBUG flag set
* 2 -- always
*/
#ifndef VERBOSE
# define VERBOSE 0
#endif

/* -------------------------------------------------------------------- */

Expand All @@ -70,10 +76,21 @@ static const char copyright[] =
#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
#if VERBOSE == 0
# define INIT_TRACE(state)
# define TRACE(v)
#elif VERBOSE == 1
# define INIT_TRACE(state) int _debug = (state)->debug
# define TRACE(v) do { \
if (_debug) { \
printf v; \
} \
} while (0)
#elif VERBOSE == 2
# define INIT_TRACE(state)
# define TRACE(v) printf v
#else
#define TRACE(v)
# error VERBOSE must be 0, 1 or 2
#endif

/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -198,6 +215,7 @@ data_stack_dealloc(SRE_STATE* state)
static int
data_stack_grow(SRE_STATE* state, Py_ssize_t size)
{
INIT_TRACE(state);
Py_ssize_t minsize, cursize;
minsize = state->data_stack_base+size;
cursize = state->data_stack_size;
Expand Down Expand Up @@ -449,6 +467,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
state->charsize = charsize;
state->match_all = 0;
state->must_advance = 0;
state->debug = ((pattern->flags & SRE_FLAG_DEBUG) != 0);

state->beginning = ptr;

Expand Down Expand Up @@ -641,6 +660,7 @@ _sre_SRE_Pattern_match_impl(PatternObject *self, PyTypeObject *cls,
if (!state_init(&state, (PatternObject *)self, string, pos, endpos))
return NULL;

INIT_TRACE(&state);
state.ptr = state.start;

TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr));
Expand Down Expand Up @@ -684,6 +704,7 @@ _sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyTypeObject *cls,
if (!state_init(&state, self, string, pos, endpos))
return NULL;

INIT_TRACE(&state);
state.ptr = state.start;

TRACE(("|%p|%p|FULLMATCH\n", PatternObject_GetCode(self), state.ptr));
Expand Down Expand Up @@ -730,6 +751,7 @@ _sre_SRE_Pattern_search_impl(PatternObject *self, PyTypeObject *cls,
if (!state_init(&state, self, string, pos, endpos))
return NULL;

INIT_TRACE(&state);
TRACE(("|%p|%p|SEARCH\n", PatternObject_GetCode(self), state.ptr));

status = sre_search(&state, PatternObject_GetCode(self));
Expand Down
1 change: 1 addition & 0 deletions Modules/_sre/sre.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ typedef struct {
int charsize; /* character size */
int match_all;
int must_advance;
int debug;
/* marks */
int lastmark;
int lastindex;
Expand Down
3 changes: 3 additions & 0 deletions Modules/_sre/sre_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ SRE(count)(SRE_STATE* state, const SRE_CODE* pattern, Py_ssize_t maxcount)
const SRE_CHAR* ptr = (const SRE_CHAR *)state->ptr;
const SRE_CHAR* end = (const SRE_CHAR *)state->end;
Py_ssize_t i;
INIT_TRACE(state);

/* adjust end */
if (maxcount < end - ptr && maxcount != SRE_MAXREPEAT)
Expand Down Expand Up @@ -567,6 +568,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)

SRE(match_context)* ctx;
SRE(match_context)* nextctx;
INIT_TRACE(state);

TRACE(("|%p|%p|ENTER\n", pattern, state->ptr));

Expand Down Expand Up @@ -1639,6 +1641,7 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
SRE_CODE* charset = NULL;
SRE_CODE* overlap = NULL;
int flags = 0;
INIT_TRACE(state);

if (ptr > end)
return 0;
Expand Down

0 comments on commit f216019

Please sign in to comment.