If NV_ZERO_IS_ALLBITS_ZERO is not true, then it's important to inialise
Nicholas Clark [Tue, 3 Jan 2006 19:38:24 +0000 (19:38 +0000)]
the NV only if the new body has an NV. (D'oh!)

p4raw-id: //depot/perl@26623

sv.c

diff --git a/sv.c b/sv.c
index d32bd99..022f936 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -1124,8 +1124,11 @@ Perl_sv_upgrade(pTHX_ register SV *sv, U32 new_type)
 
 #ifndef NV_ZERO_IS_ALLBITS_ZERO
        /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
-        * correct 0.0 for us. */
-       if (old_type_details->zero_nv)
+        * correct 0.0 for us.  Otherwise, if the old body didn't have an
+        * NV slot, but the new one does, then we need to initialise the
+        * freshly created NV slot with whatever the correct bit pattern is
+        * for 0.0  */
+       if (old_type_details->zero_nv && !new_type_details->zero_nv)
            SvNV_set(sv, 0);
 #endif