Silly Nick. There was a bug in change 30757 whereby the precomp of a
Nicholas Clark [Fri, 28 Dec 2007 22:01:30 +0000 (22:01 +0000)]
dup'd regexp would be pointing somewhere la-la. Probably at the precomp
of the same regexp in the parent thread. (So it is only likely to go
nasal daemon if the parent thread terminates first, or explicitly goes
around freeing up run time generated regexps.)

p4raw-id: //depot/perl@32754

regcomp.c

index 9732086..544bbbc 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -9371,6 +9371,7 @@ Perl_re_dup(pTHX_ const regexp *r, CLONE_PARAMS *param)
     dVAR;
     regexp *ret;
     I32 npar;
+    U32 precomp_offset;
 
     if (!r)
        return (REGEXP *)NULL;
@@ -9419,8 +9420,10 @@ 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 + (RX_PRECOMP(ret) - ret->wrapped);
+    RX_PRECOMP(ret)     = ret->wrapped + precomp_offset;
     ret->paren_names    = hv_dup_inc(ret->paren_names, param);
 
     if (ret->pprivate)