[#32171] autoload_delete — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>
こんにちは、山本と申します。
> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。
山本です。
> アルゴリズムの意味がわからないで書いた、表層的なパッチなので
Hi,
> 1.9ではRationalとComplexを組み込みに、という話はありましたが、
原です。
ささだです.
[#32192] test-all results - ruby 1.9.0 (2007-11-09 patchlevel 0) [i686-linux] — SASADA Koichi <ko1@...>
ささだです.
[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>
遠藤と申します。
まつもと ゆきひろです
西山と申します
遠藤です。
[#32204] yydebug — Nobuyoshi Nakada <nobu@...>
なかだです。
[#32205] Use two pipes for duplex IO.popen — Tanaka Akira <akr@...>
改心して duplex な IO.popen で socketpair を使うのはやめよう
なかだです。
In article <20071111120021.7f0592e5.nobu@ruby-lang.org>,
[#32206] Integer#ord for 1.8 — Tanaka Akira <akr@...>
1.9 と 1.8 の両方で ?a.ord で 97 が得られるように、1.8 に
[#32219] trunkでビルド失敗 — KIMURA Koichi <kimura.koichi@...>
木村です。
[#32247] round missing (mswin32) — KIMURA Koichi <kimura.koichi@...>
木村です。
[#32263] toplevel irb method — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
[#32266] version string — SASADA Koichi <ko1@...>
ささだです.
[#32268] RFLOAT_VALUE(val), DOUBLE2NUM(dbl) — SASADA Koichi <ko1@...>
ささだです.
SASADA Koichi wrote:
[#32306] nanosecond Time and stat — Tanaka Akira <akr@...>
最近、nanosecond 単位な timestamp があるようです。
In article <874pflntd5.fsf@fsij.org>,
まつもと ゆきひろです
In article <E1Iu2GD-0004Wh-1I@x31>,
[#32308] core dump with undef/alias using dynamic symbols — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。
遠藤と申します。
ささだです.
遠藤です。
ささだです.
[#32329] enumerator with single array and multiple arguments. — Tanaka Akira <akr@...>
enumerator を通すとひとつの配列と複数の引数が区別できません。
[#32330] defined?($&) — Tanaka Akira <akr@...>
ふと気がついたんですが、defined?($&) が "expression" になり
まつもと ゆきひろです
まつもと ゆきひろです
ささだです.
[#32333] test/ruby/test_eval.rb — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
[#32348] DRb test leaves ut_eval.rb process — Tanaka Akira <akr@...>
DRb のテストをすると、(テストがいろいろと失敗する他に) プロ
[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>
木村です。
まつもと ゆきひろです
木村です。
まつもと ゆきひろです
[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>
こんばんは。
卜部です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
成瀬です。
卜部です。
遠藤と申します。
遠藤です。
ささだです.
まつもと ゆきひろです
[#32404] SEGV on child process by fork on GC.stress. — Tanaka Akira <akr@...>
GC.stress = true 下で fork すると子プロセスが SEGV します。
まつもと ゆきひろです
In article <E1Iy7HA-0006zn-37@x31>,
まつもと ゆきひろです
ささだです.
[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>
ささだです.
さとうふみやす @ OSS テクノロジです。
ささだです.
まつもと ゆきひろです
[ruby-dev:32326] Re: rational
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]