SYN SYN
[p5sagit/p5-mst-13.2.git] / t / op / closure.t
index ab1e426..5f3245f 100755 (executable)
@@ -12,7 +12,7 @@ BEGIN {
 
 use Config;
 
-print "1..167\n";
+print "1..171\n";
 
 my $test = 1;
 sub test (&) {
@@ -130,7 +130,57 @@ test {
   &{$foo[4]}() == 0
   };
 
-exit 0 unless $Config{'d_fork'};
+# test if closures get created in optimized for loops
+
+my %foo;
+for my $n ('A'..'E') {
+    $foo{$n} = sub { $n eq $_[0] };
+}
+
+test {
+  &{$foo{A}}('A') and
+  &{$foo{B}}('B') and
+  &{$foo{C}}('C') and
+  &{$foo{D}}('D') and
+  &{$foo{E}}('E')
+};
+
+for my $n (0..4) {
+    $foo[$n] = sub { $n == $_[0] };
+}
+
+test {
+  &{$foo[0]}(0) and
+  &{$foo[1]}(1) and
+  &{$foo[2]}(2) and
+  &{$foo[3]}(3) and
+  &{$foo[4]}(4)
+};
+
+for my $n (0..4) {
+    $foo[$n] = sub {
+                     # no intervening reference to $n here
+                     sub { $n == $_[0] }
+                  };
+}
+
+test {
+  $foo[0]->()->(0) and
+  $foo[1]->()->(1) and
+  $foo[2]->()->(2) and
+  $foo[3]->()->(3) and
+  $foo[4]->()->(4)
+};
+
+{
+    my $w;
+    $w = sub {
+       my ($i) = @_;
+       test { $i == 10 };
+       sub { $w };
+    };
+    $w->(10);
+}
 
 # Additional tests by Tom Phoenix <rootbeer@teleport.com>.
 
@@ -379,7 +429,7 @@ END
            $test++;
          }
 
-         if ($Config{d_fork} and $^O ne 'VMS') {
+         if ($Config{d_fork} and $^O ne 'VMS' and $^O ne 'MSWin32') {
            # Fork off a new perl to run the tests.
            # (This is so we can catch spurious warnings.)
            $| = 1; print ""; $| = 0; # flush output before forking
@@ -410,22 +460,33 @@ END
          } else {
            # No fork().  Do it the hard way.
            my $cmdfile = "tcmd$$";  $cmdfile++ while -e $cmdfile;
-           my $outfile = "tout$$";  $outfile++ while -e $outfile;
            my $errfile = "terr$$";  $errfile++ while -e $errfile;
+           my @tmpfiles = ($cmdfile, $errfile);
            open CMD, ">$cmdfile"; print CMD $code; close CMD;
-           my $cmd = ($^O eq 'VMS') ? "MCR $^X" : "./perl";
-           $cmd .= " -w $cmdfile >$outfile 2>$errfile";
-           system $cmd;
-           $? = 0 if $^O eq 'VMS' and $? & 1;  # Keep Unix-minded code below happy
+           my $cmd = (($^O eq 'VMS') ? "MCR $^X"
+                      : ($^O eq 'MSWin32') ? '.\perl'
+                      : './perl');
+           $cmd .= " -w $cmdfile 2>$errfile";
+           if ($^O eq 'VMS' or $^O eq 'MSWin32') {
+             # Use pipe instead of system so we don't inherit STD* from
+             # this process, and then foul our pipe back to parent by
+             # redirecting output in the child.
+             open PERL,"$cmd |" or die "Can't open pipe: $!\n";
+             { local $/; $output = join '', <PERL> }
+             close PERL;
+           } else {
+             my $outfile = "tout$$";  $outfile++ while -e $outfile;
+             push @tmpfiles, $outfile;
+             system "$cmd >$outfile";
+             { local $/; open IN, $outfile; $output = <IN>; close IN }
+           }
            if ($?) {
              printf "not ok: exited with error code %04X\n", $?;
-             $debugging or do { 1 while unlink $cmdfile, $outfile, $errfile };
+             $debugging or do { 1 while unlink @tmpfiles };
              exit;
            }
-           { local $/;
-             open IN, $outfile; $output = <IN>; close IN;
-             open IN, $errfile; $errors = <IN>; close IN; }
-           1 while unlink $cmdfile, $outfile, $errfile;
+           { local $/; open IN, $errfile; $errors = <IN>; close IN }
+           1 while unlink @tmpfiles;
          }
          print $output;
          print STDERR $errors;
@@ -443,3 +504,4 @@ END
     }  # End of foreach $inner_type
 
 }
+