Enlarge dummy regex pass1 compilation node
authorKarl Williamson <public@khwilliamson.com>
Fri, 6 Sep 2013 04:40:54 +0000 (22:40 -0600)
committerKarl Williamson <public@khwilliamson.com>
Tue, 24 Sep 2013 17:36:18 +0000 (11:36 -0600)
In pass 1 of compiling regular expressions, the needed size is
calculated.  There is space allocated for a scratch node that can be
used for the things that the real one will hold in pass 2.  It is valid
only while working on the current node, and gets overwritten in the next
node.

Until this commit, this scratch space was sized only for the smallest
node type, meaning that larger types could not use it for scratch.  Now
it is sized to be the largest non EXACTish node.

We could make it an array of 256 + overhead bytes instead to be able to
hold the EXACTish nodes, but I don't see a need for that now.

regcomp.c
regcomp.h

index 2c69d4a..ff8d158 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -115,7 +115,10 @@ struct RExC_state_t {
     regnode    *emit_bound;            /* First regnode outside of the allocated space */
     regnode    *emit;                  /* Code-emit pointer; if = &emit_dummy,
                                            implies compiling, so don't emit */
-    regnode    emit_dummy;             /* placeholder for emit to point to */
+    regnode_ssc        emit_dummy;             /* placeholder for emit to point to;
+                                           large enough for the largest
+                                           non-EXACTish node, so can use it as
+                                           scratch in pass1 */
     I32                naughty;                /* How bad is this pattern? */
     I32                sawback;                /* Did we see \1, ...? */
     U32                seen;
@@ -5813,7 +5816,7 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
     RExC_npar = 1;
     RExC_nestroot = 0;
     RExC_size = 0L;
-    RExC_emit = &RExC_emit_dummy;
+    RExC_emit = (regnode *) &RExC_emit_dummy;
     RExC_whilem_seen = 0;
     RExC_open_parens = NULL;
     RExC_close_parens = NULL;
index 4b3f892..0eb989f 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -292,7 +292,7 @@ struct regnode_ssc {
 
 #define REG_MAGIC 0234
 
-#define SIZE_ONLY (RExC_emit == &RExC_emit_dummy)
+#define SIZE_ONLY (RExC_emit == (regnode *) & RExC_emit_dummy)
 #define PASS1 SIZE_ONLY
 #define PASS2 (! SIZE_ONLY)