This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Use Perl_isfinite() to guard the frexpl.
authorJarkko Hietaniemi <jhi@iki.fi>
Mon, 1 Sep 2014 16:17:02 +0000 (12:17 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Mon, 1 Sep 2014 18:13:17 +0000 (14:13 -0400)
Also, print out the deadly nv.

pod/perldiag.pod
sv.c

index 910b838..df94c98 100644 (file)
@@ -4002,7 +4002,7 @@ data.
 (P) While attempting folding constants an exception other than an C<eval>
 failure was caught.
 
-=item panic: frexp
+=item panic: frexp: %f
 
 (P) The library function frexp() failed, making printf("%f") impossible.
 
diff --git a/sv.c b/sv.c
index 98836f1..da21d25 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -11711,14 +11711,12 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN p
 
            need = 0;
            /* frexp() (or frexpl) has some unspecified behaviour for
-             * nan/inf/-inf, so let's avoid calling that on those
-             * three values. nv * 0 will be NaN for NaN, +Inf and -Inf,
-             * and 0 for anything else. */
-           if (isALPHA_FOLD_NE(c, 'e') && (nv * 0) == 0) {
+             * nan/inf/-inf, so let's avoid calling that on non-finites. */
+           if (isALPHA_FOLD_NE(c, 'e') && Perl_isfinite(nv)) {
                 i = PERL_INT_MIN;
                 (void)Perl_frexp(nv, &i);
                 if (i == PERL_INT_MIN)
-                    Perl_die(aTHX_ "panic: frexp");
+                    Perl_die(aTHX_ "panic: frexp: %"NVgf, nv);
                 /* Do not set hexfp earlier since we want to printf
                  * Inf/NaN for Inf/NAN, not their hexfp. */
                 hexfp = isALPHA_FOLD_EQ(c, 'a');