@@ -373,6 +373,19 @@ SRE(count)(SRE_STATE* state, const SRE_CODE* pattern, Py_ssize_t maxcount)
373
373
state->lastindex = ctx->lastindex; \
374
374
} while (0)
375
375
376
+ #define LAST_PTR_PUSH () \
377
+ do { \
378
+ TRACE(("push last_ptr: %zd", \
379
+ PTR_TO_INDEX(ctx->u.rep->last_ptr))); \
380
+ DATA_PUSH(&ctx->u.rep->last_ptr); \
381
+ } while (0)
382
+ #define LAST_PTR_POP () \
383
+ do { \
384
+ DATA_POP(&ctx->u.rep->last_ptr); \
385
+ TRACE(("pop last_ptr: %zd", \
386
+ PTR_TO_INDEX(ctx->u.rep->last_ptr))); \
387
+ } while (0)
388
+
376
389
#define RETURN_ERROR (i ) do { return i; } while(0)
377
390
#define RETURN_FAILURE do { ret = 0; goto exit; } while(0)
378
391
#define RETURN_SUCCESS do { ret = 1; goto exit; } while(0)
@@ -449,25 +462,47 @@ do { \
449
462
#define DATA_LOOKUP_AT (t ,p ,pos ) \
450
463
DATA_STACK_LOOKUP_AT(state,t,p,pos)
451
464
465
+ #define PTR_TO_INDEX (ptr ) \
466
+ ((ptr) ? ((char*)(ptr) - (char*)state->beginning) / state->charsize : -1)
467
+
468
+ #if VERBOSE
469
+ # define MARK_TRACE (label , lastmark ) \
470
+ do if (DO_TRACE) { \
471
+ TRACE(("%s %d marks:", (label), (lastmark)+1)); \
472
+ for (int j = 0; j <= (lastmark); j++) { \
473
+ if (j && (j & 1) == 0) { \
474
+ TRACE((" ")); \
475
+ } \
476
+ TRACE((" %zd", PTR_TO_INDEX(state->mark[j]))); \
477
+ } \
478
+ TRACE(("\n")); \
479
+ } while (0)
480
+ #else
481
+ # define MARK_TRACE (label , lastmark )
482
+ #endif
452
483
#define MARK_PUSH (lastmark ) \
453
484
do if (lastmark >= 0) { \
485
+ MARK_TRACE("push", (lastmark)); \
454
486
size_t _marks_size = (lastmark+1) * sizeof(void*); \
455
487
DATA_STACK_PUSH(state, state->mark, _marks_size); \
456
488
} while (0)
457
489
#define MARK_POP (lastmark ) \
458
490
do if (lastmark >= 0) { \
459
491
size_t _marks_size = (lastmark+1) * sizeof(void*); \
460
492
DATA_STACK_POP(state, state->mark, _marks_size, 1); \
493
+ MARK_TRACE("pop", (lastmark)); \
461
494
} while (0)
462
495
#define MARK_POP_KEEP (lastmark ) \
463
496
do if (lastmark >= 0) { \
464
497
size_t _marks_size = (lastmark+1) * sizeof(void*); \
465
498
DATA_STACK_POP(state, state->mark, _marks_size, 0); \
499
+ MARK_TRACE("pop keep", (lastmark)); \
466
500
} while (0)
467
501
#define MARK_POP_DISCARD (lastmark ) \
468
502
do if (lastmark >= 0) { \
469
503
size_t _marks_size = (lastmark+1) * sizeof(void*); \
470
504
DATA_STACK_POP_DISCARD(state, _marks_size); \
505
+ MARK_TRACE("pop discard", (lastmark)); \
471
506
} while (0)
472
507
473
508
#define JUMP_NONE 0
@@ -1150,11 +1185,11 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
1150
1185
LASTMARK_SAVE ();
1151
1186
MARK_PUSH (ctx -> lastmark );
1152
1187
/* zero-width match protection */
1153
- DATA_PUSH ( & ctx -> u . rep -> last_ptr );
1188
+ LAST_PTR_PUSH ( );
1154
1189
ctx -> u .rep -> last_ptr = state -> ptr ;
1155
1190
DO_JUMP (JUMP_MAX_UNTIL_2 , jump_max_until_2 ,
1156
1191
ctx -> u .rep -> pattern + 3 );
1157
- DATA_POP ( & ctx -> u . rep -> last_ptr );
1192
+ LAST_PTR_POP ( );
1158
1193
if (ret ) {
1159
1194
MARK_POP_DISCARD (ctx -> lastmark );
1160
1195
RETURN_ON_ERROR (ret );
@@ -1235,11 +1270,11 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel)
1235
1270
1236
1271
ctx -> u .rep -> count = ctx -> count ;
1237
1272
/* zero-width match protection */
1238
- DATA_PUSH ( & ctx -> u . rep -> last_ptr );
1273
+ LAST_PTR_PUSH ( );
1239
1274
ctx -> u .rep -> last_ptr = state -> ptr ;
1240
1275
DO_JUMP (JUMP_MIN_UNTIL_3 ,jump_min_until_3 ,
1241
1276
ctx -> u .rep -> pattern + 3 );
1242
- DATA_POP ( & ctx -> u . rep -> last_ptr );
1277
+ LAST_PTR_POP ( );
1243
1278
if (ret ) {
1244
1279
RETURN_ON_ERROR (ret );
1245
1280
RETURN_SUCCESS ;
0 commit comments