diff options
author | Father Chrysostomos <sprout@cpan.org> | 2012-01-13 09:23:07 -0800 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2012-01-13 21:24:53 -0800 |
commit | ffdb8bcde21504a3efe208b4d47bea445e7e23fd (patch) | |
tree | 1f8ff020ce7bba74eddebec59c8bf26f13a7b0d8 | |
parent | 65d99836546f370bdc29ff2d99a22de1f5fc3bbf (diff) | |
download | perl-ffdb8bcde21504a3efe208b4d47bea445e7e23fd.tar.gz |
defined *{"!"} should not stop %! from working
This is something I broke when merging is_magical_gv with
gv_fetchpvn_flags.
gv_fetchpvn_flags must make sure its *! glob is present in the sym-
bol table it loads Errno. If it adds it afterwards it will clobber
another *! that Errno has autovivified and tied in the mean time.
-rw-r--r-- | gv.c | 4 | ||||
-rw-r--r-- | t/op/magic.t | 12 |
2 files changed, 14 insertions, 2 deletions
@@ -1892,7 +1892,11 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags, /* magicalization must be done before require_tie_mod is called */ if (sv_type == SVt_PVHV || sv_type == SVt_PVGV) + { + if (addmg) (void)hv_store(stash,name,len,(SV *)gv,0); + addmg = 0; require_tie_mod(gv, "!", newSVpvs("Errno"), "TIEHASH", 1); + } break; case '-': /* $- */ diff --git a/t/op/magic.t b/t/op/magic.t index 6ddf2d8071..494847f7f1 100644 --- a/t/op/magic.t +++ b/t/op/magic.t @@ -5,7 +5,7 @@ BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require './test.pl'; - plan (tests => 153); + plan (tests => 154); } # Test that defined() returns true for magic variables created on the fly, @@ -416,7 +416,7 @@ SKIP: { } SKIP: { - skip_if_miniperl("miniperl can't rely on loading %Errno", 1); + skip_if_miniperl("miniperl can't rely on loading %Errno", 2); # Make sure that Errno loading doesn't clobber $! undef %Errno::; @@ -425,6 +425,14 @@ SKIP: { open(FOO, "nonesuch"); # Generate ENOENT my %errs = %{"!"}; # Cause Errno.pm to be loaded at run-time ok ${"!"}{ENOENT}; + + # Make sure defined(*{"!"}) before %! does not stop %! from working + is + runperl( + prog => 'BEGIN { defined *{q-!-} } print qq-ok\n- if tied %!', + ), + "ok\n", + 'defined *{"!"} does not stop %! from working'; } # Check that we don't auto-load packages |