[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>

こんにちは、山本と申します。

26 messages 2007/11/08
[#32186] Re: Date#+に大きな数字を与えるとおかしな日付に — Tadayoshi Funaba <tadf@...> 2007/11/08

> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。

[#32188] Re: Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...> 2007/11/09

山本です。

[#32191] Re: Date#+に大きな数字を与えるとおかしな日付に — tadf@... 2007/11/09

> アルゴリズムの意味がわからないで書いた、表層的なパッチなので

[#32194] Re: Date#+に大きな数字を与えるとおかしな日付に — Yukihiro Matsumoto <matz@...> 2007/11/09

Hi,

[#32200] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Tadayoshi Funaba <tadf@...> 2007/11/10

> 1.9ではRationalとComplexを組み込みに、という話はありましたが、

[#32225] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Shin-ichiro HARA <sinara@...> 2007/11/12

原です。

[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>

遠藤と申します。

21 messages 2007/11/09
[#32199] Re: [提案] Array#tail — Yukihiro Matsumoto <matz@...> 2007/11/10

まつもと ゆきひろです

[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>

木村です。

16 messages 2007/11/24
[#32353] Re: 1.9.1のリリース時期について — Yukihiro Matsumoto <matz@...> 2007/11/24

まつもと ゆきひろです

[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>

こんばんは。

32 messages 2007/11/29
[#32414] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/11/30

卜部です。

[#32444] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Yukihiro Matsumoto <matz@...> 2007/12/03

まつもと ゆきひろです

[#32488] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/12/08

卜部です。

[#32525] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/10

遠藤と申します。

[#32643] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/19

遠藤です。

[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>

 ささだです.

10 messages 2007/11/30

[ruby-dev:32326] Re: rational

From: Tanaka Akira <akr@...>
Date: 2007-11-21 02:41:22 UTC
List: ruby-dev #32326
In article <4741AEB6.2020005@blade.nagaokaut.ac.jp>,
  Shin-ichiro HARA <sinara@blade.nagaokaut.ac.jp> writes:

> rational-1.18 を作りました。
>
>   http://blade.nagaokaut.ac.jp/~sinara/ruby/rational/

以前 [ruby-dev:28661] で書いた、T_STRUCT を使う、というのを
やってみました。

まぁ、このパッチでは 1.9 専用になりますが。

--- rational.c.org	2007-11-21 11:15:16.000000000 +0900
+++ rational.c	2007-11-21 11:34:33.000000000 +0900
@@ -44,7 +44,7 @@
 #define RT_IS_RAT(x) (RT_KIND_OF(x, rb_cRational))
 #define RT_IS_INT(x) (RT_KIND_OF(x, rb_cInteger))
 #define RT_IS_FLO(x) (RT_KIND_OF(x, rb_cFloat))
-#define RT_TYPE(x) (TYPE(x) == T_DATA && RT_KIND_OF(x, rb_cRational) ?\
+#define RT_TYPE(x) (TYPE(x) == T_STRUCT && RT_KIND_OF(x, rb_cRational) ?\
    T_RATIONAL : TYPE(x))
 #define RT_TYPE_GE(x, y) RT_KIND_OF(x, rb_obj_class(y))
 
@@ -101,21 +101,16 @@
 #define RT_FLOOR(x) ((long)(x) > (x) ? (long)(x) - 1 : (long)(x))
 #endif
 
+#define RT_NUM(r) (((struct RStruct *)(r))->as.ary[0])
+#define RT_DEN(r) (((struct RStruct *)(r))->as.ary[1])
+
 #define RT_get \
   VALUE numerator, denominator;\
   RT_read(self, numerator, denominator);
 
 #define RT_read(s, x, y) \
-  struct RRational *_rational;\
-  Data_Get_Struct(s, struct RRational, _rational);\
-  x = _rational->num;\
-  y = _rational->den;
-
-#define RT_read2(s, x, y) \
-  Data_Get_Struct(s, struct RRational, _rational);\
-  x = _rational->num;\
-  y = _rational->den;
-
+  x = RT_NUM(s);\
+  y = RT_DEN(s);
 
 /* Functions */
 static VALUE rb_rat_gcd(VALUE x, VALUE y);
@@ -134,26 +129,22 @@ VALUE rb_eRationalDomainError;
 /* Base */
 VALUE rb_cRational;
 
-static void
-rb_rat_mark(r)
-    struct RRational *r;
-{
-    rb_gc_mark(r->num);
-    rb_gc_mark(r->den);
-}
-
 static VALUE
 rb_rat_raw(klass, num, den)
     VALUE klass, num, den;
 {
-    VALUE rat;
-    struct RRational *r;
+    long n;
+    NEWOBJ(r, struct RStruct);
+    OBJSETUP(r, klass, T_STRUCT);
+
+    n = 2;
+    RBASIC(r)->flags &= ~RSTRUCT_EMBED_LEN_MASK;
+    RBASIC(r)->flags |= n << RSTRUCT_EMBED_LEN_SHIFT;
 
-    rat = Data_Make_Struct(klass, struct RRational,
-                           rb_rat_mark, -1, r);
-    r->num = num;
-    r->den = den;
-    return rat;
+    RT_NUM(r) = num;
+    RT_DEN(r) = den;
+
+    return (VALUE)r;
 }
 
 static VALUE
@@ -228,18 +219,14 @@ static VALUE
 rb_rat_numerator(self)
      VALUE self;
 {
-    struct RRational *r;
-    Data_Get_Struct(self, struct RRational, r);
-    return r->num;
+    return RT_NUM(self);
 }
 
 static VALUE
 rb_rat_denominator(self)
      VALUE self;
 {
-    struct RRational *r;
-    Data_Get_Struct(self, struct RRational, r);
-    return r->den;
+    return RT_DEN(self);
 }
 
 /* gcd */
@@ -347,7 +334,7 @@ rb_rat_eq(self, other)
   
     switch (RT_TYPE(other)) {
     case T_RATIONAL:
-        RT_read2(other, onum, oden);
+        RT_read(other, onum, oden);
         return (RT_EQ(snum, onum) && RT_EQ(sden, oden) ? Qtrue : Qfalse);
     case T_FIXNUM:
     case T_BIGNUM:
@@ -369,7 +356,7 @@ rb_rat_cmp(self, other)
 
     switch (RT_TYPE(other)) {
     case T_RATIONAL:
-        RT_read2(other, onum, oden);
+        RT_read(other, onum, oden);
 
         return rb_funcall(rb_funcall(snum, '*', 1, oden),
                           rb_intern("<=>"), 1,
@@ -429,7 +416,7 @@ rb_rat_plus(self, other)
         }
 #endif
 
-        RT_read2(other, onum, oden);
+        RT_read(other, onum, oden);
 
 #ifdef RT_OPT_plus
         gcd = RT_GCD(sden, oden);
@@ -474,7 +461,7 @@ rb_rat_minus(self, other)
         }
 #endif
 
-        RT_read2(other, onum, oden);
+        RT_read(other, onum, oden);
 
 #ifdef RT_OPT_plus
         gcd = RT_GCD(sden, oden);
@@ -515,7 +502,7 @@ rb_rat_mul(self, other)
         }
 #endif
 
-        RT_read2(other, onum, oden);
+        RT_read(other, onum, oden);
 
         if (FIXNUM_P(snum) && FIXNUM_P(sden) && FIXNUM_P(onum) && FIXNUM_P(oden)) {
             long lsnum, lsden, lonum, loden, lgl, lgr;
@@ -588,7 +575,7 @@ rb_rat_div(self, other)
         }
 #endif
 
-        RT_read2(other, onum, oden);
+        RT_read(other, onum, oden);
         if (RT_NEG(onum)) {
             onum = RT_UMINUS(onum);
             snum = RT_UMINUS(snum);
@@ -941,8 +928,6 @@ rb_rat_rationalize(argc, argv, self)
     VALUE x, xn, xd, y, yn, yd;
     VALUE eps, eps0;
 
-    struct RRational *_rational;
-
     if (RT_NEG(self)) {
       return RT_UMINUS(rb_rat_rationalize(argc, argv, RT_UMINUS(self)));
     }
@@ -980,8 +965,8 @@ rb_rat_rationalize(argc, argv, self)
       x = rb_rat_minus(self, eps);
       y = rb_rat_plus(self, eps);
 
-      RT_read2(x, xn, xd);
-      RT_read2(y, yn, yd);
+      RT_read(x, xn, xd);
+      RT_read(y, yn, yd);
 
       return rb_rat_min_cont_frac(xn, xd, yn, yd);
     case T_FIXNUM:
@@ -1011,25 +996,6 @@ rb_rat_alloc(klass)
 }
 
 static VALUE
-rb_rat_marshal_dump(self)
-    VALUE self;
-{
-    RT_get;
-    return rb_ary_new3(2, numerator, denominator);
-}
-
-static VALUE
-rb_rat_marshal_load(self, obj)
-    VALUE self, obj;
-{
-    struct RRational *sval;
-    Data_Get_Struct(self, struct RRational, sval);
-    sval->num = rb_ary_entry(obj, 0);
-    sval->den = rb_ary_entry(obj, 1);
-    return Qnil;
-}
-
-static VALUE
 rb_rat_abs(self)
     VALUE self;
 {
@@ -1468,7 +1434,7 @@ static VALUE
 rb_rat_flo_to_r(self)
     VALUE self;
 {
-    return rb_rat_dbl_to_rat(RFLOAT(self)->value);
+    return rb_rat_dbl_to_rat(RFLOAT_VALUE(self));
 }
 
 static VALUE
@@ -1478,7 +1444,7 @@ rb_rat_flo_decode(self)
     double f;
     int e;
 
-    f = frexp(RFLOAT(self)->value, &e);
+    f = frexp(RFLOAT_VALUE(self), &e);
     f = ldexp(f, DBL_MANT_DIG);
     e -= DBL_MANT_DIG;
     return rb_assoc_new(rb_dbl2big(f), INT2NUM(e));
@@ -1658,15 +1624,13 @@ rb_rat_flo_rationalize(argc, argv, flo)
     double f0;
     int e0;
 
-    struct RRational *_rational;
-
     if (RT_NEG(flo)) {
         return RT_UMINUS(rb_rat_flo_rationalize(argc, argv, RT_UMINUS(flo)));
     }
 
     switch (rb_scan_args(argc, argv, "01", &eps)) {
     case 0:
-        f0 = frexp(RFLOAT(flo)->value, &e0);
+        f0 = frexp(RFLOAT_VALUE(flo), &e0);
         f0 = ldexp(f0, DBL_MANT_DIG);
         e0 -= DBL_MANT_DIG;
 
@@ -1695,11 +1659,11 @@ rb_rat_flo_rationalize(argc, argv, flo)
                               rb_intern("to_r"), 0);
         }
 
-        x = rb_rat_dbl_to_rat(RFLOAT(RT_MINUS(flo, eps))->value);
-        y = rb_rat_dbl_to_rat(RFLOAT(RT_PLUS(flo, eps))->value);
+        x = rb_rat_dbl_to_rat(RFLOAT_VALUE(RT_MINUS(flo, eps)));
+        y = rb_rat_dbl_to_rat(RFLOAT_VALUE(RT_PLUS(flo, eps)));
 
-        RT_read2(x, xn, xd);
-        RT_read2(y, yn, yd);
+        RT_read(x, xn, xd);
+        RT_read(y, yn, yd);
         if (RT_EQ(xn, yn) && RT_EQ(xd, yd)) {
             return x;
         }
@@ -1768,8 +1732,19 @@ rb_rat_Rationalize(argc, argv, obj)
 void
 Init_rational(void)
 {
+    VALUE members;
+    ID id_num, id_den;
+
     rb_cRational = rb_define_class(RATIONAL_CLASS_NAME, rb_cNumeric);
 
+    id_num = rb_intern("num");
+    id_den = rb_intern("den");
+
+    members = rb_ary_new3(2, ID2SYM(id_num), ID2SYM(id_den));
+    OBJ_FREEZE(members);
+    rb_iv_set(rb_cRational, "__size__", INT2FIX(2));
+    rb_iv_set(rb_cRational, "__members__", members);
+
     rb_define_singleton_method(rb_cRational, "new", rb_rat_new, -1); /* not compatible with `rational.rb' */
 
     rb_define_singleton_method(rb_cRational, "reduce", rb_rat_new, -1);
@@ -1830,9 +1805,6 @@ Init_rational(void)
 
     rb_define_alloc_func(rb_cRational, rb_rat_alloc);
    
-    rb_define_method(rb_cRational, "marshal_dump", rb_rat_marshal_dump, 0);
-    rb_define_method(rb_cRational, "marshal_load", rb_rat_marshal_load, 1);
-
 #ifdef RT_ALGEBRA
     rb_define_const(rb_cRational, "ZERO", RT_S_NEW1(rb_cRational, RT_FIX_ZERO));
     rb_define_const(rb_cRational, "UNITY", RT_S_NEW1(rb_cRational, RT_FIX_UNIT));
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread