summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Symbol.pm10
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 ($) {}