X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/f1c32fec87699aee2eeb638f44135f21217d2127..cd86ed9d430a95bb9cf370c699245e1b667c146d:/hv.c diff --git a/hv.c b/hv.c index ab22584..a5221a8 100644 --- a/hv.c +++ b/hv.c @@ -1468,7 +1468,7 @@ Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry) if (!entry) return; val = HeVAL(entry); - if (HvNAME(hv) && anonymise_cv(HvNAME(hv), val) && GvCVu(val)) + if (HvNAME(hv) && anonymise_cv(HvNAME_HEK(hv), val) && GvCVu(val)) mro_method_changed_in(hv); SvREFCNT_dec(val); if (HeKLEN(entry) == HEf_SVKEY) { @@ -1483,7 +1483,7 @@ Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry) } static I32 -S_anonymise_cv(const char *stash, SV *val) +S_anonymise_cv(pTHX_ HEK *stash, SV *val) { CV *cv; @@ -1491,12 +1491,17 @@ S_anonymise_cv(const char *stash, SV *val) if (val && isGV(val) && isGV_with_GP(val) && (cv = GvCV(val))) { if ((SV *)CvGV(cv) == val) { - SV *gvname; GV *anongv; - gvname = newSVpvf("%s::__ANON__", stash ? stash : "__ANON__"); - anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV); - SvREFCNT_dec(gvname); + if (stash) { + SV *gvname = newSVhek(stash); + sv_catpvs(gvname, "::__ANON__"); + anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV); + SvREFCNT_dec(gvname); + } else { + anongv = gv_fetchpvs("__ANON__::__ANON__", GV_ADDMULTI, + SVt_PVCV); + } CvGV(cv) = anongv; CvANON_on(cv); return 1;