[#20525] [BigDecimal] changing rule of coerce — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>

斎藤です。

44 messages 2003/07/07
[#20527] Re: [BigDecimal] changing rule of coerce — "Shigeo Kobayashi" <shigeo@...> 2003/07/07

小林です。

[#20528] Re: [BigDecimal] changing rule of coerce — matz@... (Yukihiro Matsumoto) 2003/07/07

まつもと ゆきひろです

[#20570] Marshal upgrade — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

41 messages 2003/07/09
[#20575] Re: Marshal upgrade — Masatoshi SEKI <m_seki@...> 2003/07/09

咳といいます。

[#20583] Re: Marshal upgrade — matz@... (Yukihiro Matsumoto) 2003/07/09

まつもと ゆきひろです

[#21016] Re: Marshal upgrade — matz@... (Yukihiro Matsumoto) 2003/07/30

まつもと ゆきひろです

[#20804] add library — nobu.nakada@... 2003/07/23

なかだです。

[#20580] add library(Re:ruby-dev:20570) — たむらけんいち <sgs02516@...>

たむらです。

30 messages 2003/07/09
[#20656] Re: add library — "NAKAMURA, Hiroshi" <nakahiro@...> 2003/07/14

なひです。

[#20658] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <038d01c349cb$eaad71d0$93222fc0@sarion.co.jp>,

[#20659] Re: add library — matz@... (Yukihiro Matsumoto) 2003/07/14

まつもと ゆきひろです

[#20660] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <1058171960.400840.10041.nullmailer@picachu.netlab.jp>,

[#20661] Re: add library — Takahiro Kambe <taca@...> 2003/07/14

話をそらしてしまうかもしれませんが、

[#20665] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <20030714.183104.09092354.taca@back-street.net>,

[#20666] Re: add library — Takahiro Kambe <taca@...> 2003/07/14

In message <20030715.013655.424936247.gotoyuzo@kotetsu.does.notwork.org>

[#20668] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/14

In message <20030715.025907.26217115.taca@back-street.net>,

[#20750] Re: add library — Takahiro Kambe <taca@...> 2003/07/21

In message <20030715.051853.968499478.gotoyuzo@kotetsu.does.notwork.org>

[#20751] Re: add library — GOTOU Yuuzou <gotoyuzo@...> 2003/07/21

In message <20030721.163444.09092937.taca@back-street.net>,

[#20655] frozen ThreadGroup — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

26 messages 2003/07/14
[#20671] Re: frozen ThreadGroup — matz@... (Yukihiro Matsumoto) 2003/07/14

まつもと ゆきひろです

[#20673] Re: frozen ThreadGroup — Hidetoshi NAGAI <nagai@...> 2003/07/15

永井@知能.九工大です.

[#20676] Re: frozen ThreadGroup — matz@... (Yukihiro Matsumoto) 2003/07/15

まつもと ゆきひろです

[#20677] Re: frozen ThreadGroup — Hidetoshi NAGAI <nagai@...> 2003/07/15

永井@知能.九工大です.

[#20681] Re: frozen ThreadGroup — matz@... (Yukihiro Matsumoto) 2003/07/15

まつもと ゆきひろです

[#20690] portable(?) UserID/GroupID control (Re: frozen ThreadGroup) — Hidetoshi NAGAI <nagai@...> 2003/07/16

永井@知能.九工大です.

[#20712] Re: portable(?) UserID/GroupID control — Hidetoshi NAGAI <nagai@...> 2003/07/17

永井@知能.九工大です.

[#20735] Re: portable(?) UserID/GroupID control — matz@... (Yukihiro Matsumoto) 2003/07/20

まつもと ゆきひろです

[#20736] Re: portable(?) UserID/GroupID control — Hidetoshi NAGAI <nagai@...> 2003/07/20

永井@知能.九工大です.

[#20737] Re: portable(?) UserID/GroupID control — matz@... (Yukihiro Matsumoto) 2003/07/20

まつもと ゆきひろです

[#20748] [BigDecimal] exception handling — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>

斎藤です。

20 messages 2003/07/21

[#20765] Re: [ruby-cvs] ruby/lib: * lib/tmpdir.rb: new library to get temporary directory path, — WATANABE Hirofumi <eban@...>

わたなべです。

9 messages 2003/07/21

[#20780] complex.rb — Masahiro TANAKA <masa@...>

complex.rb についての修正案を[ruby-math:00543]で提案しましたが、その後

25 messages 2003/07/22
[#20782] Re: complex.rb — matz@... (Yukihiro Matsumoto) 2003/07/22

まつもと ゆきひろです

[#20900] Re: complex.rb — Masahiro TANAKA <masa@...> 2003/07/25

At Tue, 22 Jul 2003 17:30:31 +0900, Yukihiro Matsumoto wrote:

[#20905] Re: complex.rb — matz@... (Yukihiro Matsumoto) 2003/07/25

まつもと ゆきひろです

[#20906] Re: complex.rb — keiju@... (石塚圭樹) 2003/07/25

けいじゅ@いしつかです.

[#20810] Rational 始めました。 — Shin-ichiro HARA <sinara@...>

原です。

13 messages 2003/07/23
[#20876] Re: Rational 始めました。 — keiju@... (石塚圭樹) 2003/07/24

けいじゅ@いしつかです.

[#20954] ruby 1.8.0 preview5 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

15 messages 2003/07/28

[#20957] [BigDecimal] conflict between Numeric#div and BigDecimal#div — "Tadashi Saito" <shiba@...2.accsnet.ne.jp>

斎藤です。

29 messages 2003/07/28
[#20960] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — Masahiro TANAKA <masa@...> 2003/07/28

At Mon, 28 Jul 2003 18:26:20 +0900, Tadashi Saito wrote:

[#20962] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — matz@... (Yukihiro Matsumoto) 2003/07/28

まつもと ゆきひろです

[#20990] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — Masahiro TANAKA <masa@...> 2003/07/29

At Mon, 28 Jul 2003 21:16:08 +0900, Yukihiro Matsumoto wrote:

[#20992] Re: [BigDecimal] conflict between Numeric#div and BigDecimal#div — matz@... (Yukihiro Matsumoto) 2003/07/29

まつもと ゆきひろです

[ruby-dev:21033] [BigDecimal] modify methods result from Comparable

From: "Tadashi Saito" <shiba@...2.accsnet.ne.jp>
Date: 2003-07-30 17:45:11 UTC
List: ruby-dev #21033
斎藤です。

BigDecimal中の比較周りのメソッドは、残念ながらその起源である
Comparableの定義とは異なってしまっています。
ということで、それらの修正を含んだパッチです。

もしよければ取り込んで下さい。よろしくお願いします。

# num_coerce_relopがstaticなので、4関数分くらい再発明が必要に
# なっています。既にrb_num_coerce_cmpもありますし、relopの方も
# 公開するのがいいと思うのですが、どうでしょうか。>まつもとさん


Index: bigdecimal.c
===================================================================
RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v
retrieving revision 1.17
diff -u -p -r1.17 bigdecimal.c
--- bigdecimal.c        29 Jul 2003 07:52:48 -0000      1.17
+++ bigdecimal.c        30 Jul 2003 16:47:06 -0000
@@ -90,31 +90,39 @@ coerce_rescue(VALUE *x)
 {
     rb_raise(rb_eTypeError, "%s can't be coerced into %s",
         rb_special_const_p(x[1])?
-        rb_str2cstr(rb_inspect(x[1]),0):
-        rb_class2name(CLASS_OF(x[1])),
-        rb_class2name(CLASS_OF(x[0])));
-    return (VALUE)0;
+        RSTRING(rb_inspect(x[1]))->ptr:
+        rb_obj_classname(x[1]),
+        rb_obj_classname(x[0]));
+    return Qnil;
 }

-static void
-do_coerce(VALUE *x, VALUE *y)
+static int
+do_coerce(VALUE *x, VALUE *y, int err)
 {
     VALUE ary;
     VALUE a[2];
     a[0] = *x; a[1] = *y;
-    ary = rb_rescue(coerce_body, (VALUE)a, coerce_rescue, (VALUE)a);
+    ary = rb_rescue(coerce_body, (VALUE)a, err?coerce_rescue:0, (VALUE)a);
     if (TYPE(ary) != T_ARRAY || RARRAY(ary)->len != 2) {
-        rb_raise(rb_eTypeError, "coerce must return [x, y]");
+       if (err) rb_raise(rb_eTypeError, "coerce must return [x, y]");
+       return Qfalse;
     }
     *x = RARRAY(ary)->ptr[0];
     *y = RARRAY(ary)->ptr[1];
+    return Qtrue;
 }

 static VALUE
-DoSomeOne(VALUE x, VALUE y)
+num_coerce_relop(VALUE x, VALUE y)
 {
-    do_coerce(&x, &y);
-    return rb_funcall(x, rb_frame_last_func(), 1, y);
+    VALUE c, x0 = x, y0 = y;
+
+    if (!do_coerce(&x, &y, Qfalse) ||
+       NIL_P(c = rb_funcall(x, rb_frame_last_func(), 1, y))) {
+       rb_cmperr(x0, y0);
+       return Qnil;            /* not reached */
+    }
+    return c;
 }

 static void
@@ -176,8 +184,8 @@ SomeOneMayDoIt:
     if(must) {
         rb_raise(rb_eTypeError, "%s can't be coerced into BigDecimal",
                     rb_special_const_p(v)?
-                    rb_str2cstr(rb_inspect(v),0):
-                    rb_class2name(CLASS_OF(v))
+                    RSTRING(rb_inspect(v))->ptr:
+                    rb_obj_classname(v)
                 );
     }
     return NULL; /* NULL means to coerce */
@@ -489,7 +497,7 @@ BigDecimal_add(VALUE self, VALUE r)

     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
+    if(!b) return rb_num_coerce_bin(self,r);
     SAVE(b);

     if(VpIsNaN(b)) return b->obj;
@@ -518,7 +526,7 @@ BigDecimal_sub(VALUE self, VALUE r)

     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
+    if(!b) return rb_num_coerce_bin(self,r);
     SAVE(b);

     if(VpIsNaN(b)) return b->obj;
@@ -539,18 +547,6 @@ BigDecimal_sub(VALUE self, VALUE r)
     return ToValue(c);
 }

-static S_INT
-BigDecimalCmp(VALUE self, VALUE r)
-{
-    ENTER(5);
-    Real *a, *b;
-    GUARD_OBJ(a,GetVpValue(self,1));
-    b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
-    SAVE(b);
-    return VpComp(a, b);
-}
-
 static VALUE
 BigDecimal_zero(VALUE self)
 {
@@ -569,8 +565,14 @@ static VALUE
 BigDecimal_comp(VALUE self, VALUE r)
 {
     S_INT e;
-    e = BigDecimalCmp(self, r);
-    if(e==999) return rb_float_new(VpGetDoubleNaN());
+    ENTER(5);
+    Real *a, *b;
+    GUARD_OBJ(a,GetVpValue(self,1));
+    b = GetVpValue(r,0);
+    if(!b) return rb_num_coerce_cmp(self,r);
+    SAVE(b);
+    e = VpComp(a, b);
+    if(e==999) return Qnil;
     return INT2FIX(e);
 }

@@ -581,7 +583,7 @@ BigDecimal_eq(VALUE self, VALUE r)
     Real *a, *b;
     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return Qfalse; /* Not comparable */
+    if(!b) return Qnil; /* Not comparable */
     SAVE(b);
     return VpComp(a, b)? Qfalse:Qtrue;
 }
@@ -602,7 +604,12 @@ static VALUE
 BigDecimal_lt(VALUE self, VALUE r)
 {
     S_INT e;
-    e = BigDecimalCmp(self, r);
+    ENTER(1);
+    Real *a, *b;
+    GUARD_OBJ(a,GetVpValue(self,1));
+    b = GetVpValue(r,0);
+    if(!b) return num_coerce_relop(self, r);
+    e = VpComp(a, b);
     if(e==999) return Qfalse;
     return(e < 0) ? Qtrue : Qfalse;
 }
@@ -611,7 +618,12 @@ static VALUE
 BigDecimal_le(VALUE self, VALUE r)
 {
     S_INT e;
-    e = BigDecimalCmp(self, r);
+    ENTER(1);
+    Real *a, *b;
+    GUARD_OBJ(a,GetVpValue(self,1));
+    b = GetVpValue(r,0);
+    if(!b) return num_coerce_relop(self, r);
+    e = VpComp(a, b);
     if(e==999) return Qfalse;
     return(e <= 0) ? Qtrue : Qfalse;
 }
@@ -620,7 +632,12 @@ static VALUE
 BigDecimal_gt(VALUE self, VALUE r)
 {
     S_INT e;
-    e = BigDecimalCmp(self, r);
+    ENTER(1);
+    Real *a, *b;
+    GUARD_OBJ(a,GetVpValue(self,1));
+    b = GetVpValue(r,0);
+    if(!b) return num_coerce_relop(self, r);
+    e = VpComp(a, b);
     if(e==999) return Qfalse;
     return(e > 0) ? Qtrue : Qfalse;
 }
@@ -629,7 +646,12 @@ static VALUE
 BigDecimal_ge(VALUE self, VALUE r)
 {
     S_INT e;
-    e = BigDecimalCmp(self, r);
+    ENTER(1);
+    Real *a, *b;
+    GUARD_OBJ(a,GetVpValue(self,1));
+    b = GetVpValue(r,0);
+    if(!b) return num_coerce_relop(self, r);
+    e = VpComp(a, b);
     if(e==999) return Qfalse;
     return(e >= 0) ? Qtrue : Qfalse;
 }
@@ -654,7 +676,7 @@ BigDecimal_mult(VALUE self, VALUE r)

     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
+    if(!b) return rb_num_coerce_bin(self,r);
     SAVE(b);

     mx = a->Prec + b->Prec;
@@ -673,7 +695,7 @@ BigDecimal_divide(Real **c, Real **res,

     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
+    if(!b) return rb_num_coerce_bin(self,r);
     SAVE(b);
     *div = b;
     mx =(a->MaxPrec + b->MaxPrec + 1) * VpBaseFig();
@@ -717,7 +739,7 @@ BigDecimal_DoDivmod(VALUE self, VALUE r,

     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
+    if(!b) return rb_num_coerce_bin(self,r);
     SAVE(b);

     mx = a->Prec;
@@ -759,7 +781,7 @@ BigDecimal_divremain(VALUE self, VALUE r

     GUARD_OBJ(a,GetVpValue(self,1));
     b = GetVpValue(r,0);
-    if(!b) return DoSomeOne(self,r);
+    if(!b) return rb_num_coerce_bin(self,r);
     SAVE(b);

     mx  =(a->MaxPrec + b->MaxPrec) *VpBaseFig();


--
斎藤ただし


In This Thread

Prev Next