diff options
-rw-r--r-- | lib/Symbol.pm | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Symbol.pm b/lib/Symbol.pm index 75d1dfb1fa..e40ae7b357 100644 --- a/lib/Symbol.pm +++ b/lib/Symbol.pm @@ -58,10 +58,16 @@ my $genseq = 0; my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT); +# +# Note that we never _copy_ the glob; we just make a ref to it. +# If we did copy it, then SVf_FAKE would be set on the copy, and +# glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work. +# sub gensym () { my $name = "GEN" . $genseq++; - local *{$genpkg . $name}; - \delete ${$genpkg}{$name}; + my $ref = \*{$genpkg . $name}; + delete $$genpkg{$name}; + $ref; } sub ungensym ($) {} |