summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2006-12-09 21:19:45 +0000
committerNicholas Clark <nick@ccl4.org>2006-12-09 21:19:45 +0000
commit50caf62e77809dea76eee38c00ffaa08a0153def (patch)
treeb17132e976e3eb27af9d52ccba339f4d9a03500e /sv.c
parent052d0a1435e1caea295a2e88fc678a10a6dce19f (diff)
downloadperl-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.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sv.c b/sv.c
index e4deb9d691..cd186e4b81 100644
--- a/sv.c
+++ b/sv.c
@@ -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);