This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In IPC::Open3::_open(), use 3 argument open to avoid a special case for STDERR.
authorNicholas Clark <nick@ccl4.org>
Mon, 6 Jun 2011 20:45:46 +0000 (22:45 +0200)
committerNicholas Clark <nick@ccl4.org>
Sat, 11 Jun 2011 06:48:13 +0000 (08:48 +0200)
The code for STDIN and STDOUT never ends up needing to duplicate a reference.
The code for STDERR can, because of the earlier special case code to save
STDOUT. It was special-cased to use fileno in commit 8b3e92c60014b4e7, in 1998.
This was before 3 argument open. With 3 argument open the special case can be
avoided.

ext/IPC-Open3/lib/IPC/Open3.pm

index 14c5605..b1acfd0 100644 (file)
@@ -262,23 +262,20 @@ sub _open3 {
                }
 
                if ($dup_wtr) {
-                   xopen \*STDIN,  "<&$dad_wtr" if fileno(STDIN) != xfileno($dad_wtr);
+                   xopen \*STDIN, '<&', $dad_wtr if fileno(STDIN) != xfileno($dad_wtr);
                } else {
                    xclose $dad_wtr;
                    xopen \*STDIN,  "<&=" . fileno $kid_rdr;
                }
                if ($dup_rdr) {
-                   xopen \*STDOUT, ">&$dad_rdr" if fileno(STDOUT) != xfileno($dad_rdr);
+                   xopen \*STDOUT, '>&', $dad_rdr if fileno(STDOUT) != xfileno($dad_rdr);
                } else {
                    xclose $dad_rdr;
                    xopen \*STDOUT, ">&=" . fileno $kid_wtr;
                }
                if ($dad_rdr ne $dad_err) {
                    if ($dup_err) {
-                       # I have to use a fileno here because in this one case
-                       # I'm doing a dup but the filehandle might be a reference
-                       # (from the special case above).
-                       xopen \*STDERR, ">&" . xfileno($dad_err)
+                       xopen \*STDERR, '>&', $dad_err
                            if fileno(STDERR) != xfileno($dad_err);
                    } else {
                        xclose $dad_err;