From: Ilya Zakharevich Date: Wed, 4 Mar 1998 23:55:54 +0000 (-0500) Subject: [5.004_61 PATCH] Make incompatible changes to RE engine NOW X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2779dcf1a3ceec167d36a36fc44de44737edcc4c;p=p5sagit%2Fp5-mst-13.2.git [5.004_61 PATCH] Make incompatible changes to RE engine NOW p4raw-id: //depot/perl@785 --- diff --git a/op.c b/op.c index 28e05f1..907e975 100644 --- a/op.c +++ b/op.c @@ -4261,7 +4261,7 @@ ck_index(OP *o) if (o->op_flags & OPf_KIDS) { OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */ if (kid && kid->op_type == OP_CONST) - fbm_compile(((SVOP*)kid)->op_sv); + fbm_compile(((SVOP*)kid)->op_sv, 0); } return ck_fun(o); } diff --git a/proto.h b/proto.h index 4df73df..037e154 100644 --- a/proto.h +++ b/proto.h @@ -137,7 +137,7 @@ void dump_op _((OP* arg)); void dump_pm _((PMOP* pm)); void dump_packsubs _((HV* stash)); void dump_sub _((GV* gv)); -void fbm_compile _((SV* sv)); +void fbm_compile _((SV* sv, U32 flags)); char* fbm_instr _((unsigned char* big, unsigned char* bigend, SV* littlesv)); #ifdef USE_THREADS PADOFFSET find_threadsv _((char *name)); diff --git a/regcomp.c b/regcomp.c index 4a46c7a..11358db 100644 --- a/regcomp.c +++ b/regcomp.c @@ -812,6 +812,11 @@ pregcomp(char *exp, char *xend, PMOP *pm) r->regstclass = NULL; r->naughty = regnaughty >= 10; /* Probably an expensive pattern. */ scan = r->program + 1; /* First BRANCH. */ + + /* XXXX To minimize changes to RE engine we always allocate + 3-units-long substrs field. */ + Newz(1004, r->substrs, 1, struct reg_substr_data); + if (OP(scan) != BRANCH) { /* Only one top-level choice. */ scan_data_t data; I32 fake; @@ -906,7 +911,7 @@ pregcomp(char *exp, char *xend, PMOP *pm) r->float_substr = data.longest_float; r->float_min_offset = data.offset_float_min; r->float_max_offset = data.offset_float_max; - fbm_compile(r->float_substr); + fbm_compile(r->float_substr, 0); BmUSEFUL(r->float_substr) = 100; if (data.flags & SF_FL_BEFORE_EOL /* Cannot have SEOL and MULTI */ && (!(data.flags & SF_FL_BEFORE_MEOL) @@ -926,7 +931,7 @@ pregcomp(char *exp, char *xend, PMOP *pm) || (regflags & PMf_MULTILINE)))) { r->anchored_substr = data.longest_fixed; r->anchored_offset = data.offset_fixed; - fbm_compile(r->anchored_substr); + fbm_compile(r->anchored_substr, 0); BmUSEFUL(r->anchored_substr) = 100; if (data.flags & SF_FIX_BEFORE_EOL /* Cannot have SEOL and MULTI */ && (!(data.flags & SF_FIX_BEFORE_MEOL) @@ -2565,6 +2570,8 @@ pregfree(struct regexp *r) Safefree(r->precomp); if (r->subbase) Safefree(r->subbase); + if (r->substrs) + Safefree(r->substrs); if (r->anchored_substr) SvREFCNT_dec(r->anchored_substr); if (r->float_substr) diff --git a/regexp.h b/regexp.h index 7137ffc..cb6b0c6 100644 --- a/regexp.h +++ b/regexp.h @@ -23,6 +23,16 @@ struct reg_data { void* data[1]; }; +struct reg_substr_datum { + I32 min_offset; + I32 max_offset; + SV *substr; +}; + +struct reg_substr_data { + struct reg_substr_datum data[3]; /* Actual array */ +}; + typedef struct regexp { I32 refcnt; char **startp; @@ -39,6 +49,7 @@ typedef struct regexp { U16 naughty; /* how exponential is this pattern? */ U16 reganch; /* Internal use only + Tainted information used by regexec? */ +#if 0 SV *anchored_substr; /* Substring at fixed position wrt start. */ I32 anchored_offset; /* Position of it. */ SV *float_substr; /* Substring at variable position wrt start. */ @@ -47,10 +58,22 @@ typedef struct regexp { SV *check_substr; /* Substring to check before matching. */ I32 check_offset_min; /* Offset of the above. */ I32 check_offset_max; /* Offset of the above. */ +#else + struct reg_substr_data *substrs; +#endif struct reg_data *data; /* Additional data. */ regnode program[1]; /* Unwarranted chumminess with compiler. */ } regexp; +#define anchored_substr substrs->data[0].substr +#define anchored_offset substrs->data[0].min_offset +#define float_substr substrs->data[1].substr +#define float_min_offset substrs->data[1].min_offset +#define float_max_offset substrs->data[1].max_offset +#define check_substr substrs->data[2].substr +#define check_offset_min substrs->data[2].min_offset +#define check_offset_max substrs->data[2].max_offset + #define ROPT_ANCH (ROPT_ANCH_BOL|ROPT_ANCH_MBOL|ROPT_ANCH_GPOS) #define ROPT_ANCH_SINGLE (ROPT_ANCH_BOL|ROPT_ANCH_GPOS) #define ROPT_ANCH_BOL 1 diff --git a/util.c b/util.c index 770aa29..6cb8e69 100644 --- a/util.c +++ b/util.c @@ -891,7 +891,7 @@ mem_collxfrm(const char *s, STRLEN len, STRLEN *xlen) #endif /* USE_LOCALE_COLLATE */ void -fbm_compile(SV *sv) +fbm_compile(SV *sv, U32 flags /* not used yet */) { register unsigned char *s; register unsigned char *table;