This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix deparsing of subs named :::: and ::::::
authorFather Chrysostomos <sprout@cpan.org>
Sun, 22 May 2011 01:38:46 +0000 (18:38 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 22 May 2011 01:38:46 +0000 (18:38 -0700)
Since a name like :::: is now divided up as ::/:: (since commit
088225f), there can be a package called ‘::’. But %:: returns %main::,
not %main::::. The result is that the main package is searched again
and again recursively and stash_subs hangs.

The easiest fix is to put main:: at the beginning of a substash’s name
when fetching the stash.

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

index 81c918c..a147ed4 100644 (file)
@@ -481,7 +481,7 @@ sub stash_subs {
     else {
        $pack =~ s/(::)?$/::/;
        no strict 'refs';
     else {
        $pack =~ s/(::)?$/::/;
        no strict 'refs';
-       $stash = \%$pack;
+       $stash = \%{"main::$pack"};
     }
     my %stash = svref_2object($stash)->ARRAY;
     while (my ($key, $val) = each %stash) {
     }
     my %stash = svref_2object($stash)->ARRAY;
     while (my ($key, $val) = each %stash) {
index 5ea240a..4948773 100644 (file)
@@ -170,6 +170,18 @@ eval <<EOFCODE and test($x);
    1
 EOFCODE
 
    1
 EOFCODE
 
+# Exotic sub declarations
+$a = `$^X $path "-MO=Deparse" -e "sub ::::{}sub ::::::{}" 2>&1`;
+$a =~ s/-e syntax OK\n//g;
+is($a, <<'EOCODG', "sub :::: and sub ::::::");
+sub :::: {
+    
+}
+sub :::::: {
+    
+}
+EOCODG
+
 # [perl #33752]
 {
   my $code = <<"EOCODE";
 # [perl #33752]
 {
   my $code = <<"EOCODE";