From a95262356ef5b975f4b4b88db97dca93f451f74b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 2 Sep 2021 21:42:47 +0900 Subject: [PATCH] Extract always_finite_type_p and handle flonum cases --- complex.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/complex.c b/complex.c index 647fff9d1d..0c50196627 100644 --- a/complex.c +++ b/complex.c @@ -334,15 +334,23 @@ f_zero_p(VALUE x) #define f_nonzero_p(x) (!f_zero_p(x)) +static inline bool +always_finite_type_p(VALUE x) +{ + if (FIXNUM_P(x)) return true; + if (FLONUM_P(x)) return true; /* Infinity can't be a flonum */ + return (RB_INTEGER_TYPE_P(x) || RB_TYPE_P(x, T_RATIONAL)); +} + VALUE rb_flo_is_finite_p(VALUE num); inline static int f_finite_p(VALUE x) { - if (RB_INTEGER_TYPE_P(x) || RB_TYPE_P(x, T_RATIONAL)) { + if (always_finite_type_p(x)) { return TRUE; } else if (RB_FLOAT_TYPE_P(x)) { - return (int)rb_flo_is_finite_p(x); + return isfinite(RFLOAT_VALUE(x)); } return RTEST(rb_funcallv(x, id_finite_p, 0, 0)); } @@ -351,11 +359,11 @@ VALUE rb_flo_is_infinite_p(VALUE num); inline static int f_infinite_p(VALUE x) { - if (RB_INTEGER_TYPE_P(x) || RB_TYPE_P(x, T_RATIONAL)) { + if (always_finite_type_p(x)) { return FALSE; } else if (RB_FLOAT_TYPE_P(x)) { - return RTEST(rb_flo_is_infinite_p(x)); + return isinf(RFLOAT_VALUE(x)); } return RTEST(rb_funcallv(x, id_infinite_p, 0, 0)); }