[5.004_61 PATCH] Make incompatible changes to RE engine NOW
Ilya Zakharevich [Wed, 4 Mar 1998 23:55:54 +0000 (18:55 -0500)]
p4raw-id: //depot/perl@785

op.c
proto.h
regcomp.c
regexp.h
util.c

diff --git a/op.c b/op.c
index 28e05f1..907e975 100644 (file)
--- 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 (file)
--- 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));
index 4a46c7a..11358db 100644 (file)
--- 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)
index 7137ffc..cb6b0c6 100644 (file)
--- 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 (file)
--- 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;