summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/rational.h18
-rw-r--r--parse.y2
-rw-r--r--rational.c8
3 files changed, 21 insertions, 7 deletions
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;