fix deparsing of select(F)
authorDavid Mitchell <davem@iabyn.com>
Wed, 10 Oct 2012 10:32:57 +0000 (11:32 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 10 Oct 2012 15:39:21 +0000 (16:39 +0100)
Because select doesn't have a prototype (it's really two different functions
with the same name), the code that handles "first arg as filename" was
skipping select(F). This meant that 'select $fh' was being deparsed as
'select *$fh'.
Make select behave the same as open etc.

(There's still an issue that 'select/open *$fh' is deparsed as
'select/open $fh')

dist/B-Deparse/Deparse.pm
dist/B-Deparse/t/deparse.t

index 612676b..2a768c0 100644 (file)
@@ -2541,9 +2541,13 @@ sub listop {
     $name = "socketpair" if $name eq "sockpair";
     my $fullname = $self->keyword($name);
     my $proto = prototype("CORE::$name");
-    if (defined $proto
-       && $proto =~ /^;?\*/
-       && $kid->name eq "rv2gv" && !($kid->private & OPpLVAL_INTRO)) {
+    if (
+        (     (defined $proto && $proto =~ /^;?\*/)
+           || $name eq 'select' # select(F) doesn't have a proto
+        )
+        && $kid->name eq "rv2gv"
+        && !($kid->private & OPpLVAL_INTRO)
+    ) {
        $first = $self->rv2gv_or_string($kid->first);
     }
     else {
index 2d75050..3500d5b 100644 (file)
@@ -1263,3 +1263,17 @@ foreach my $i (1 .. 3) {
 continue {
     ();
 }
+####
+# file handles
+no strict;
+my $mfh;
+open F;
+open *F;
+open $fh;
+open $mfh;
+open 'a+b';
+select *F;
+select F;
+select $f;
+select $mfh;
+select 'a+b';