> [EMAIL PROTECTED] - Sun Jul 31 23:23:50 2005]:
>
>
> This is a bug report for perl from [EMAIL PROTECTED],
> generated with the help of perlbug 1.35 running under perl v5.8.6.
>
>
> -----------------------------------------------------------------
> The construct
> local %SIG = %SIG;
> does *not* make an exact local copy of %SIG, as it should.
>
> The program
>
> perl -e 'print scalar keys %SIG,"\n"; local %SIG = %SIG; print scalar
> keys %SIG, "\n"'
> prints
>
> 49
> 0
>
> instead of (something like)
>
> 49
> 49
>
> as it should.
>
> For comparison, another "magic" hash, %ENV, does not have the same
> problem.
>
> perl -e 'print scalar keys %ENV,"\n"; local %ENV = %ENV; print scalar
> keys %ENV, "\n"'
> 61
> 61
>
I added Devel::Peek to see more of what's going on. I'm guessing the
copy during localization is not working correctly in this case. The
following chunk of code from mg.c may hold the key to the problem.
if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy) {
/* XXX calling the copy method is probably not correct. DAPM */
(void)CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv,
mg->mg_ptr, mg->mg_len);
}
[EMAIL PROTECTED]:~/perl-current$ perl -MDevel::Peek -le'print scalar keys
%SIG; print Dump \%SIG; local %SIG = %SIG; print scalar keys %SIG; print
Dump \%SIG'
69
SV = RV(0x81751a8) at 0x814dc28
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x817ea98
SV = PVHV(0x8152130) at 0x817ea98
REFCNT = 2
FLAGS = (RMG,SHAREKEYS)
IV = 69
NV = 0
MAGIC = 0x8185820
MG_VIRTUAL = &PL_vtbl_sig
MG_TYPE = PERL_MAGIC_sig(S)
ARRAY = 0x8187a50 (0:75, 1:42, 2:7, 3:3, 4:1)
hash quality = 93.5%
KEYS = 69
FILL = 53
MAX = 127
RITER = -1
EITER = 0x0
Elt "NUM63" HASH = 0xcfaba382
SV = PVMG(0x81635f0) at 0x817ed8c
REFCNT = 1
FLAGS = (GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x81879c0
MG_VIRTUAL = &PL_vtbl_sigelem
MG_TYPE = PERL_MAGIC_sigelem(s)
MG_LEN = 5
MG_PTR = 0x81879e0 "NUM63"
Elt "TRAP" HASH = 0xdc841002
SV = PVMG(0x8162eb0) at 0x817ead4
REFCNT = 1
FLAGS = (GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x8185930
MG_VIRTUAL = &PL_vtbl_sigelem
MG_TYPE = PERL_MAGIC_sigelem(s)
MG_LEN = 4
MG_PTR = 0x8185950 "TRAP"
Elt "NUM42" HASH = 0x2ea7df85
SV = PVMG(0x8163350) at 0x817ec90
REFCNT = 1
FLAGS = (GMG,SMG,RMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x81821b8
MG_VIRTUAL = &PL_vtbl_sigelem
MG_TYPE = PERL_MAGIC_sigelem(s)
MG_LEN = 5
MG_PTR = 0x81838f0 "NUM42"
0
SV = RV(0x81751a8) at 0x814dc28
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x818be1c
SV = PVHV(0x8152190) at 0x818be1c
REFCNT = 2
FLAGS = (RMG,SHAREKEYS)
IV = 0
NV = 0
MAGIC = 0x8185820
MG_VIRTUAL = &PL_vtbl_sig
MG_TYPE = PERL_MAGIC_sig(S)
ARRAY = 0x0
KEYS = 0
FILL = 0
MAX = 7
RITER = -1
EITER = 0x0