This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re├źnable qr caching for (??{}) retval where possible
[perl5.git] / t / re / recompile.t
index aa6f7e9..f026fae 100644 (file)
@@ -22,7 +22,7 @@ BEGIN {
 }
 
 
-plan tests => 36;
+plan tests => 46;
 
 my $results = runperl(
                        switches => [ '-Dr' ],
@@ -61,7 +61,7 @@ sub _comp_n {
     my $status = $?;
 
     my $count = () = $results =~ /Final program:/g;
-    if ($count == $n) {
+    if ($count == $n && !$status) {
        pass($desc);
     }
     else {
@@ -149,13 +149,16 @@ comp_n(3, <<'CODE', 'mixed utf8 qr');
 "a" =~ qr/$_/ for "\x{c4}\x{80}",  "\x{100}", "\x{c4}\x{80}";
 CODE
 
-comp_n(3, <<'CODE', 'runtime code');
+# note that that for runtime code, each pattern is compiled twice; the
+# second time to allow the parser to see the code.
+
+comp_n(6, <<'CODE', 'runtime code');
 my $x = '(?{1})';
 BEGIN { $^H |= 0x00200000 } # lightweight "use re 'eval'"
 "a" =~ /a$_/ for $x, $x, $x;
 CODE
 
-comp_n(3, <<'CODE', 'runtime code qr');
+comp_n(6, <<'CODE', 'runtime code qr');
 my $x = '(?{1})';
 BEGIN { $^H |= 0x00200000 } # lightweight "use re 'eval'"
 "a" =~ qr/a$_/ for $x, $x, $x;
@@ -171,16 +174,39 @@ my $x = qr/(?{1})/;
 "a" =~ qr/a$_/ for $x, $x, $x;
 CODE
 
-comp_n(4, <<'CODE', 'mixed code');
+comp_n(7, <<'CODE', 'mixed code');
 my $x = qr/(?{1})/;
 my $y = '(?{1})';
 BEGIN { $^H |= 0x00200000 } # lightweight "use re 'eval'"
 "a" =~ /a$x$_/ for $y, $y, $y;
 CODE
 
-comp_n(4, <<'CODE', 'mixed code qr');
+comp_n(7, <<'CODE', 'mixed code qr');
 my $x = qr/(?{1})/;
 my $y = '(?{1})';
 BEGIN { $^H |= 0x00200000 } # lightweight "use re 'eval'"
 "a" =~ qr/a$x$_/ for $y, $y, $y;
 CODE
+
+comp_n(6, <<'CODE', 'embedded code qr');
+my $x = qr/a/i;
+my $y = qr/a/;
+"a" =~ qr/a$_/ for $x, $y, $x, $y;
+CODE
+
+comp_n(2, <<'CODE', '(??{"constant"})');
+"bb" =~ /(??{"abc"})/;
+CODE
+
+comp_n(2, <<'CODE', '(??{"folded"."constant"})');
+"bb" =~ /(??{"ab"."c"})/;
+CODE
+
+comp_n(2, <<'CODE', '(??{$preused_scalar})');
+$s = "abc";
+"bb" =~ /(??{$s})/;
+CODE
+
+comp_n(2, <<'CODE', '(??{number})');
+"bb" =~ /(??{123})/;
+CODE