This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Detect false infinities.
authorJarkko Hietaniemi <jhi@iki.fi>
Tue, 26 Aug 2014 22:48:45 +0000 (18:48 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Tue, 26 Aug 2014 23:43:22 +0000 (19:43 -0400)
numeric.c
t/op/infnan.t

index f345489..6fc9279 100644 (file)
--- a/numeric.c
+++ b/numeric.c
@@ -645,10 +645,9 @@ Perl_grok_infnan(const char** sp, const char* send)
                 s++; if (s == send || isALPHA_FOLD_NE(*s, 'T')) return 0;
                 s++; if (s == send ||
                          /* allow either Infinity or Infinite */
-                         (isALPHA_FOLD_NE(*s, 'Y') &&
-                          isALPHA_FOLD_NE(*s, 'E')))
-                         return 0;
-                s++;
+                         !(isALPHA_FOLD_EQ(*s, 'Y') ||
+                           isALPHA_FOLD_EQ(*s, 'E'))) return 0;
+                s++; if (s < send) return 0;
             } else if (*s)
                 return 0;
             flags |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
index 41ec84a..5ef8f24 100644 (file)
@@ -24,7 +24,7 @@ my @NaN = ("NAN", "nan", "qnan", "SNAN", "NanQ", "NANS",
 
 my @fmt = qw(e f g a d x c p);
 
-my $inf_tests = 11 + @fmt + 3 * @PInf + 3 * @NInf + 5;
+my $inf_tests = 11 + @fmt + 3 * @PInf + 3 * @NInf + 5 + 3;
 my $nan_tests =  7 + @fmt + 2 * @NaN + 3;
 
 my $infnan_tests = 4;
@@ -82,6 +82,14 @@ SKIP: {
   is(9**9**9, $PInf, "9**9**9 is Inf");
 }
 
+{
+    # Silence "isn't numeric in addition", that's kind of the point.
+    local $^W = 0;
+    for my $i (qw(Info Infiniti Infinityz)) {
+        cmp_ok("$i" + 0, '==', 0, "false infinity $i");
+    }
+}
+
 SKIP: {
   if ($NaN == 1) {
     skip $nan_tests, "no nan found";