Re: Fw: Tied hash numeric values are rounded off under Perl v5.8.6
Yitzchak Scott-Thoennes [Fri, 2 Sep 2005 00:05:52 +0000 (17:05 -0700)]
Message-ID: <20050902070552.GA3992@efn.org>

p4raw-id: //depot/perl@25358

mg.c
t/op/tie.t

diff --git a/mg.c b/mg.c
index 628afa0..d3a001a 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -2793,8 +2793,16 @@ S_restore_magic(pTHX_ const void *p)
            SvFLAGS(sv) |= mgs->mgs_flags;
        else
            mg_magical(sv);
-       if (SvGMAGICAL(sv))
-           SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
+       if (SvGMAGICAL(sv)) {
+           /* downgrade public flags to private,
+              and discard any other private flags */
+
+           U32 public = SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK);
+           if (public) {
+               SvFLAGS(sv) &= ~( public | SVp_IOK|SVp_NOK|SVp_POK );
+               SvFLAGS(sv) |= ( public << PRIVSHIFT );
+           }
+       }
     }
 
     mgs->mgs_sv = NULL;  /* mark the MGS structure as restored */
index 2ea1285..1fe37e1 100755 (executable)
@@ -571,3 +571,10 @@ FIRSTKEY
 not empty
 FIRSTKEY
 empty
+########
+sub TIESCALAR { bless {} }
+sub FETCH { my $x = 3.3; 1 if 0+$x; $x }
+tie $h, "main";
+print $h,"\n";
+EXPECT
+3.3