diff options
Diffstat (limited to 'dist/ExtUtils-ParseXS/t/lib')
-rw-r--r-- | dist/ExtUtils-ParseXS/t/lib/PrimitiveCapture.pm | 96 |
1 files changed, 70 insertions, 26 deletions
diff --git a/dist/ExtUtils-ParseXS/t/lib/PrimitiveCapture.pm b/dist/ExtUtils-ParseXS/t/lib/PrimitiveCapture.pm index aa873d4d4f..29dbf658e6 100644 --- a/dist/ExtUtils-ParseXS/t/lib/PrimitiveCapture.pm +++ b/dist/ExtUtils-ParseXS/t/lib/PrimitiveCapture.pm @@ -2,32 +2,76 @@ package PrimitiveCapture; use strict; use warnings; -sub capture_stdout { - my $sub = shift; - my $stdout; - open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!"; - close STDOUT; - open STDOUT, '>', \$stdout or die "Can't open STDOUT: $!"; - - $sub->(); - - close STDOUT; - open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!"; - return $stdout; -} - -sub capture_stderr { - my $sub = shift; - my $stderr; - open my $olderr, ">&STDERR" or die "Can't dup STDERR: $!"; - close STDERR; - open STDERR, '>', \$stderr or die "Can't open STDERR: $!"; - - $sub->(); - - close STDERR; - open STDERR, ">&", $olderr or die "Can't dup \$olderr: $!"; - return $stderr; +if ("$]" >= 5.008000) { + eval "#line @{[__LINE__+1]} ".q{"lib/PrimitiveCapture.pm" + sub capture_stdout { + my $sub = shift; + my $stdout; + open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!"; + close STDOUT; + open STDOUT, '>', \$stdout or die "Can't open STDOUT: $!"; + $sub->(); + close STDOUT; + open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!"; + return $stdout; + } + sub capture_stderr { + my $sub = shift; + my $stderr; + open my $olderr, ">&STDERR" or die "Can't dup STDERR: $!"; + close STDERR; + open STDERR, '>', \$stderr or die "Can't open STDERR: $!"; + $sub->(); + close STDERR; + open STDERR, ">&", $olderr or die "Can't dup \$olderr: $!"; + return $stderr; + } + }; die $@ unless $@ eq ""; +} else { + eval "#line @{[__LINE__+1]} ".q{"lib/PrimitiveCapture.pm" + use File::Spec; + use File::Temp; + my $tmpdir; + my $i = 0; + sub _tmpfile { + $tmpdir ||= File::Temp::tempdir(CLEANUP => 1, TMPDIR => 1); + return File::Spec->catfile($tmpdir, $i++); + } + sub _slurp { + my $filename = shift; + open my $fh, "<", $filename or die "Can't read $filename: $!"; + local $/ = undef; + my $content = <$fh>; + defined $content or die "Can't read $filename: $!"; + return $content; + } + sub capture_stdout { + my $sub = shift; + my $tmpfile = _tmpfile(); + local *OLDSTDOUT; + open OLDSTDOUT, ">&STDOUT" or die "Can't dup STDOUT: $!"; + close STDOUT; + open STDOUT, '>', $tmpfile or die "Can't open STDOUT: $!"; + $sub->(); + close STDOUT; + open STDOUT, ">&OLDSTDOUT" or die "Can't dup OLDSTDOUT: $!"; + close OLDSTDOUT; + return _slurp($tmpfile); + } + sub capture_stderr { + my $sub = shift; + my $tmpfile = _tmpfile(); + local *OLDSTDERR; + open OLDSTDERR, ">&STDERR" or die "Can't dup STDERR: $!"; + close STDERR; + open STDERR, '>', $tmpfile or die "Can't open STDERR: $!"; + $sub->(); + close STDERR; + open STDERR, ">&OLDSTDERR" or die "Can't dup OLDSTDERR: $!"; + close OLDSTDERR; + return _slurp($tmpfile); + } + }; die $@ unless $@ eq ""; } 1; |