diff options
author | Nicholas Clark <nick@ccl4.org> | 2006-12-09 21:19:45 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2006-12-09 21:19:45 +0000 |
commit | 50caf62e77809dea76eee38c00ffaa08a0153def (patch) | |
tree | b17132e976e3eb27af9d52ccba339f4d9a03500e /sv.c | |
parent | 052d0a1435e1caea295a2e88fc678a10a6dce19f (diff) | |
download | perl-50caf62e77809dea76eee38c00ffaa08a0153def.tar.gz |
PVBMs mustn't enter anything that turns SVIVisUV_on().
p4raw-id: //depot/perl@29494
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -2159,7 +2159,11 @@ Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags) dVAR; if (!sv) return 0; - if (SvGMAGICAL(sv)) { + if (SvGMAGICAL(sv) || SvTYPE(sv) == SVt_PVBM) { + /* PVBMs use the same flag bit as SVf_IVisUV, so must let them + cache IVs just in case. In practice it seems that they never + actually anywhere accessible by user Perl code, let alone get used + in anything other than a string context. */ if (flags & SV_GMAGIC) mg_get(sv); if (SvIOKp(sv)) @@ -2239,7 +2243,9 @@ Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags) dVAR; if (!sv) return 0; - if (SvGMAGICAL(sv)) { + if (SvGMAGICAL(sv) || SvTYPE(sv) == SVt_PVBM) { + /* PVBMs use the same flag bit as SVf_IVisUV, so must let them + cache IVs just in case. */ if (flags & SV_GMAGIC) mg_get(sv); if (SvIOKp(sv)) @@ -2314,7 +2320,9 @@ Perl_sv_2nv(pTHX_ register SV *sv) dVAR; if (!sv) return 0.0; - if (SvGMAGICAL(sv)) { + if (SvGMAGICAL(sv) || SvTYPE(sv) == SVt_PVBM) { + /* PVBMs use the same flag bit as SVf_IVisUV, so must let them + cache IVs just in case. */ mg_get(sv); if (SvNOKp(sv)) return SvNVX(sv); |