From 2c96c0d61ce80822b81de2248e48b10f0182d790 Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Fri, 28 Dec 2007 22:19:00 +0000 Subject: [PATCH] Eliminate precomp from struct regexp. Store the offset of precomp from wrapped in pre_prefix, a 4 bit value. (Maybe only for now) reduce seen_evals from I32 to 28 bits. Will anyone have more than 268435456 eval groups in a regexp? p4raw-id: //depot/perl@32755 --- regcomp.c | 7 ++----- regexp.h | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/regcomp.c b/regcomp.c index 544bbbc..481d3a6 100644 --- a/regcomp.c +++ b/regcomp.c @@ -4319,7 +4319,8 @@ redo_first_pass: *p++ = ':'; Copy(RExC_precomp, p, RX_PRELEN(r), char); - RX_PRECOMP(r) = p; + assert ((r->wrapped - p) < 16); + r->pre_prefix = p - r->wrapped; p += RX_PRELEN(r); if (has_runon) *p++ = '\n'; @@ -9371,7 +9372,6 @@ Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param) dVAR; regexp *ret; I32 npar; - U32 precomp_offset; if (!r) return (REGEXP *)NULL; @@ -9420,10 +9420,7 @@ Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param) } } - precomp_offset = RX_PRECOMP(ret) - ret->wrapped; - ret->wrapped = SAVEPVN(ret->wrapped, ret->wraplen+1); - RX_PRECOMP(ret) = ret->wrapped + precomp_offset; ret->paren_names = hv_dup_inc(ret->paren_names, param); if (ret->pprivate) diff --git a/regexp.h b/regexp.h index ce3a485..5b58697 100644 --- a/regexp.h +++ b/regexp.h @@ -99,11 +99,11 @@ typedef struct regexp { /* Information about the match that isn't often used */ I32 prelen; /* length of precomp */ - const char *precomp; /* pre-compilation regular expression */ /* wrapped can't be const char*, as it is returned by sv_2pv_flags */ char *wrapped; /* wrapped version of the pattern */ I32 wraplen; /* length of wrapped */ - I32 seen_evals; /* number of eval groups in the pattern - for security checks */ + unsigned pre_prefix:4; /* offset from wrapped to the start of precomp */ + unsigned seen_evals:28; /* number of eval groups in the pattern - for security checks */ HV *paren_names; /* Optional hash of paren names */ /* Refcount of this regexp */ @@ -354,7 +354,7 @@ and check for NULL. : RX_MATCH_COPIED_off(prog)) /* For source compatibility. We used to store these explicitly. */ -#define RX_PRECOMP(prog) ((prog)->precomp) +#define RX_PRECOMP(prog) ((prog)->wrapped + (prog)->pre_prefix) #define RX_PRELEN(prog) ((prog)->prelen) #endif /* PLUGGABLE_RE_EXTENSION */ -- 2.7.4