difforig perl-5.10.0/regcomp.c perl-5.10.0/t/op/threads.t

2008-02-08  Reini Urban <rurban@x-ray.at>

diff -ub perl-5.10.0/regcomp.c.orig perl-5.10.0/regcomp.c
--- perl-5.10.0/regcomp.c.orig	2007-12-18 10:47:08.000000000 +0000
+++ perl-5.10.0/regcomp.c	2008-02-08 17:15:47.087767000 +0000
@@ -9436,7 +9436,6 @@
 
     ret->mother_re      = NULL;
     ret->gofs = 0;
-    ret->seen_evals = 0;
     
     ptr_table_store(PL_ptr_table, r, ret);
     return ret;
diff -ub perl-5.10.0/t/op/threads.t.orig perl-5.10.0/t/op/threads.t
--- perl-5.10.0/t/op/threads.t.orig	2007-12-18 10:47:08.000000000 +0000
+++ perl-5.10.0/t/op/threads.t	2008-02-08 18:09:08.884375000 +0000
@@ -16,7 +16,7 @@
        exit 0;
      }
 
-     plan(10);
+     plan(11);
 }
 
 use strict;
@@ -159,4 +159,21 @@
     ok(1, '[perl #45053]');
 }
 
+
+# the seen_evals field of a regexp was getting zeroed on clone, so
+# within a thread it didn't  know that a regex object contained a 'safe'
+# re_eval expression, so it later died with 'Eval-group not allowed' when
+# you tried to interpolate the object
+
+sub safe_re {
+    my $re = qr/(?{1})/;	# this is literal, so safe
+    eval { "a" =~ /$re$re/ };	# interpolating safe values, so safe
+    ok($@ eq "", 'clone seen-evals');
+}
+threads->new(\&safe_re)->join();
+
+# tests in threads don't get counted, so
+curr_test(curr_test() + 1);
+
+
 # EOF

