This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Deparse: handle some strong keywords better
authorDavid Mitchell <davem@iabyn.com>
Tue, 9 Oct 2012 14:50:12 +0000 (15:50 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 10 Oct 2012 15:39:21 +0000 (16:39 +0100)
In general, a strong keyword 'foo' will get deparsed as plain 'foo'
rather than 'CORE::foo', even in the presence of a sub foo{}.
However, these weren't:
    glob
    pos
    prototype
    scalar
    study
    undef

This was due to them having prototypes.

dist/B-Deparse/Deparse.pm

index 354e30f..1dc1ef4 100644 (file)
@@ -1681,6 +1681,17 @@ my %feature_keywords = (
    fc       => 'fc',
 );
 
    fc       => 'fc',
 );
 
+# keywords that are strong and also have a prototype
+#
+my %strong_proto_keywords = map { $_ => 1 } qw(
+    glob
+    pos
+    prototype
+    scalar
+    study
+    undef
+);
+
 sub keyword {
     my $self = shift;
     my $name = shift;
 sub keyword {
     my $self = shift;
     my $name = shift;
@@ -1696,9 +1707,9 @@ sub keyword {
         if !$hh
         || !$hh->{"feature_$feature_keywords{$name}"}
     }
         if !$hh
         || !$hh->{"feature_$feature_keywords{$name}"}
     }
-    if (
-      $name !~ /^(?:chom?p|do|exec|glob|s(?:elect|ystem))\z/
-       && !defined eval{prototype "CORE::$name"}
+    if ($strong_proto_keywords{$name}
+        || ($name !~ /^(?:chom?p|do|exec|glob|s(?:elect|ystem))\z/
+           && !defined eval{prototype "CORE::$name"})
     ) { return $name }
     if (
        exists $self->{subs_declared}{$name}
     ) { return $name }
     if (
        exists $self->{subs_declared}{$name}