diff --git a/internal/rational.h b/internal/rational.h index c783c5162b..028fc4c03e 100644 --- a/internal/rational.h +++ b/internal/rational.h @@ -11,6 +11,7 @@ */ #include "ruby/config.h" /* for HAVE_LIBGMP */ #include "ruby/ruby.h" /* for struct RBasic */ +#include "internal/gc.h" /* for RB_OBJ_WRITE */ struct RRational { struct RBasic basic; @@ -19,8 +20,6 @@ struct RRational { }; #define RRATIONAL(obj) (R_CAST(RRational)(obj)) -#define RRATIONAL_SET_NUM(rat, n) RB_OBJ_WRITE((rat), &RRATIONAL(rat)->num, (n)) -#define RRATIONAL_SET_DEN(rat, d) RB_OBJ_WRITE((rat), &RRATIONAL(rat)->den, (d)) /* rational.c */ VALUE rb_rational_canonicalize(VALUE x); @@ -37,6 +36,9 @@ VALUE rb_numeric_quo(VALUE x, VALUE y); VALUE rb_float_numerator(VALUE x); VALUE rb_float_denominator(VALUE x); +static inline void RATIONAL_SET_NUM(VALUE r, VALUE n); +static inline void RATIONAL_SET_DEN(VALUE r, VALUE d); + RUBY_SYMBOL_EXPORT_BEGIN /* rational.c (export) */ VALUE rb_gcd(VALUE x, VALUE y); @@ -46,4 +48,16 @@ VALUE rb_gcd_gmp(VALUE x, VALUE y); #endif RUBY_SYMBOL_EXPORT_END +static inline void +RATIONAL_SET_NUM(VALUE r, VALUE n) +{ + RB_OBJ_WRITE(r, &RRATIONAL(r)->num, n); +} + +static inline void +RATIONAL_SET_DEN(VALUE r, VALUE d) +{ + RB_OBJ_WRITE(r, &RRATIONAL(r)->den, d); +} + #endif /* INTERNAL_RATIONAL_H */ diff --git a/parse.y b/parse.y index 1facda553e..c0d4639509 100644 --- a/parse.y +++ b/parse.y @@ -11240,7 +11240,7 @@ negate_lit(struct parser_params *p, VALUE lit) lit = rb_big_norm(lit); break; case T_RATIONAL: - RRATIONAL_SET_NUM(lit, negate_lit(p, RRATIONAL(lit)->num)); + RATIONAL_SET_NUM(lit, negate_lit(p, RRATIONAL(lit)->num)); break; case T_COMPLEX: RCOMPLEX_SET_REAL(lit, negate_lit(p, RCOMPLEX(lit)->real)); diff --git a/rational.c b/rational.c index 8b4a39452c..4ae872bd33 100644 --- a/rational.c +++ b/rational.c @@ -403,8 +403,8 @@ nurat_s_new_internal(VALUE klass, VALUE num, VALUE den) { NEWOBJ_OF(obj, struct RRational, klass, T_RATIONAL | (RGENGC_WB_PROTECTED_RATIONAL ? FL_WB_PROTECTED : 0)); - RRATIONAL_SET_NUM(obj, num); - RRATIONAL_SET_DEN(obj, den); + RATIONAL_SET_NUM((VALUE)obj, num); + RATIONAL_SET_DEN((VALUE)obj, den); OBJ_FREEZE_RAW(obj); return (VALUE)obj; @@ -1836,8 +1836,8 @@ nurat_loader(VALUE self, VALUE a) nurat_int_check(num); nurat_int_check(den); nurat_canonicalize(&num, &den); - RRATIONAL_SET_NUM(dat, num); - RRATIONAL_SET_DEN(dat, den); + RATIONAL_SET_NUM((VALUE)dat, num); + RATIONAL_SET_DEN((VALUE)dat, den); OBJ_FREEZE_RAW(self); return self;