% svn diff --diff-cmd diff -x '-u -p' Index: ext/bigdecimal/bigdecimal.c =================================================================== --- ext/bigdecimal/bigdecimal.c (revision 44914) +++ ext/bigdecimal/bigdecimal.c (working copy) @@ -91,8 +91,8 @@ static ID id_eq; #endif #ifndef RRATIONAL_ZERO_P -# define RRATIONAL_ZERO_P(x) (FIXNUM_P(RRATIONAL(x)->num) && \ - FIX2LONG(RRATIONAL(x)->num) == 0) +# define RRATIONAL_ZERO_P(x) (FIXNUM_P(rb_rational_num(x)) && \ + FIX2LONG(rb_rational_num(x)) == 0) #endif #ifndef RRATIONAL_NEGATIVE_P @@ -239,11 +239,11 @@ again: if (prec < 0) goto unable_to_coerce_without_prec; if (orig == Qundef ? (orig = v, 1) : orig != v) { - num = RRATIONAL(v)->num; + num = rb_rational_num(v); pv = GetVpValueWithPrec(num, -1, must); if (pv == NULL) goto SomeOneMayDoIt; - v = BigDecimal_div2(ToValue(pv), RRATIONAL(v)->den, LONG2NUM(prec)); + v = BigDecimal_div2(ToValue(pv), rb_rational_den(v), LONG2NUM(prec)); goto again; } @@ -2118,7 +2118,7 @@ is_zero(VALUE x) return Qfalse; case T_RATIONAL: - num = RRATIONAL(x)->num; + num = rb_rational_num(x); return FIXNUM_P(num) && FIX2LONG(num) == 0; default: @@ -2141,8 +2141,8 @@ is_one(VALUE x) return Qfalse; case T_RATIONAL: - num = RRATIONAL(x)->num; - den = RRATIONAL(x)->den; + num = rb_rational_num(x); + den = rb_rational_den(x); return FIXNUM_P(den) && FIX2LONG(den) == 1 && FIXNUM_P(num) && FIX2LONG(num) == 1; @@ -2248,14 +2248,14 @@ BigDecimal_power(int argc, VALUE*argv, V break; case T_RATIONAL: - if (is_zero(RRATIONAL(vexp)->num)) { + if (is_zero(rb_rational_num(vexp))) { if (is_positive(vexp)) { vexp = INT2FIX(0); goto retry; } } - else if (is_one(RRATIONAL(vexp)->den)) { - vexp = RRATIONAL(vexp)->num; + else if (is_one(rb_rational_den(vexp))) { + vexp = rb_rational_num(vexp); goto retry; } exp = GetVpValueWithPrec(vexp, n, 1); Index: ext/date/date_core.c =================================================================== --- ext/date/date_core.c (revision 44914) +++ ext/date/date_core.c (working copy) @@ -114,7 +114,7 @@ f_zero_p(VALUE x) return Qfalse; case T_RATIONAL: { - VALUE num = RRATIONAL(x)->num; + VALUE num = rb_rational_num(x); return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 0); } } @@ -305,9 +305,9 @@ inline static VALUE canon(VALUE x) { if (TYPE(x) == T_RATIONAL) { - VALUE den = RRATIONAL(x)->den; + VALUE den = rb_rational_den(x); if (FIXNUM_P(den) && FIX2LONG(den) == 1) - return RRATIONAL(x)->num; + return rb_rational_num(x); } return x; } @@ -2396,8 +2396,8 @@ offset_to_sec(VALUE vof, int *rof) return 1; } #endif - vn = RRATIONAL(vs)->num; - vd = RRATIONAL(vs)->den; + vn = rb_rational_num(vs); + vd = rb_rational_den(vs); if (FIXNUM_P(vn) && FIXNUM_P(vd) && (FIX2LONG(vd) == 1)) n = FIX2LONG(vn); @@ -3120,7 +3120,7 @@ wholenum_p(VALUE x) break; case T_RATIONAL: { - VALUE den = RRATIONAL(x)->den; + VALUE den = rb_rational_den(x); return FIXNUM_P(den) && FIX2LONG(den) == 1; } break; @@ -5727,7 +5727,7 @@ d_lite_plus(VALUE self, VALUE other) int jd, df, s; if (wholenum_p(other)) - return d_lite_plus(self, RRATIONAL(other)->num); + return d_lite_plus(self, rb_rational_num(other)); if (f_positive_p(other)) s = +1; Index: include/ruby/intern.h =================================================================== --- include/ruby/intern.h (revision 44914) +++ include/ruby/intern.h (working copy) @@ -172,6 +172,8 @@ VALUE rb_rational_new(VALUE, VALUE); VALUE rb_Rational(VALUE, VALUE); #define rb_Rational1(x) rb_Rational((x), INT2FIX(1)) #define rb_Rational2(x,y) rb_Rational((x), (y)) +VALUE rb_rational_num(VALUE rat); +VALUE rb_rational_den(VALUE rat); VALUE rb_flt_rationalize_with_prec(VALUE, VALUE); VALUE rb_flt_rationalize(VALUE); /* complex.c */ Index: include/ruby/ruby.h =================================================================== --- include/ruby/ruby.h (revision 44914) +++ include/ruby/ruby.h (working copy) @@ -938,15 +938,6 @@ struct RFile { struct rb_io_t *fptr; }; -struct RRational { - struct RBasic basic; - const VALUE num; - const VALUE den; -}; - -#define RRATIONAL_SET_NUM(rat, n) RB_OBJ_WRITE((rat), &((struct RRational *)(rat))->num,(n)) -#define RRATIONAL_SET_DEN(rat, d) RB_OBJ_WRITE((rat), &((struct RRational *)(rat))->den,(d)) - struct RComplex { struct RBasic basic; const VALUE real; @@ -1129,7 +1120,6 @@ struct RBignum { #define RSTRUCT(obj) (R_CAST(RStruct)(obj)) #define RBIGNUM(obj) (R_CAST(RBignum)(obj)) #define RFILE(obj) (R_CAST(RFile)(obj)) -#define RRATIONAL(obj) (R_CAST(RRational)(obj)) #define RCOMPLEX(obj) (R_CAST(RComplex)(obj)) #define FL_SINGLETON FL_USER0 Index: internal.h =================================================================== --- internal.h (revision 44914) +++ internal.h (working copy) @@ -305,6 +305,17 @@ struct method_table_wrapper { size_t serial; }; +struct RRational { + struct RBasic basic; + const VALUE num; + const VALUE den; +}; + +#define RRATIONAL(obj) (R_CAST(RRational)(obj)) + +#define RRATIONAL_SET_NUM(rat, n) RB_OBJ_WRITE((rat), &((struct RRational *)(rat))->num,(n)) +#define RRATIONAL_SET_DEN(rat, d) RB_OBJ_WRITE((rat), &((struct RRational *)(rat))->den,(d)) + /* class.c */ void rb_class_subclass_add(VALUE super, VALUE klass); void rb_class_remove_from_super_subclasses(VALUE); Index: rational.c =================================================================== --- rational.c (revision 44914) +++ rational.c (working copy) @@ -1806,6 +1806,18 @@ rb_Rational(VALUE x, VALUE y) return nurat_s_convert(2, a, rb_cRational); } +VALUE +rb_rational_num(VALUE rat) +{ + return nurat_numerator(rat); +} + +VALUE +rb_rational_den(VALUE rat) +{ + return nurat_denominator(rat); +} + #define id_numerator rb_intern("numerator") #define f_numerator(x) rb_funcall((x), id_numerator, 0)