From: Tadashi Saito Date: 2003-07-08T01:08:50+09:00 Subject: [ruby-dev:20536] Re: [BigDecimal] changing rule of coerce 斎藤です。 ----- Original Message ----- From: "Yukihiro Matsumoto" Sent: Tuesday, July 08, 2003 12:48 AM Subject: [ruby-dev:20534] Re: [BigDecimal] changing rule of coerce > BigDecimal_new()がselfを参照しているからです。 ご指摘ありがとうございます。勉強になりました。 以下の修正でBigDecimal()が動いているように見えます。 (新規にf_BigDecimal()関数を作ろうかとも思ったのですが、 VpNewRbClass()は不要そうだったので削って、すべて VpCreateRbObject()で置き換えてみました) Index: bigdecimal.c =================================================================== RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v retrieving revision 1.9 diff -u -p -r1.9 bigdecimal.c --- bigdecimal.c 1 Jul 2003 14:14:18 -0000 1.9 +++ bigdecimal.c 7 Jul 2003 16:02:14 -0000 @@ -282,7 +282,7 @@ BigDecimal_load(VALUE self, VALUE str) m = m*10 + (unsigned long)(ch-'0'); } if(m>VpBaseFig()) m -= VpBaseFig(); - GUARD_OBJ(pv,VpNewRbClass(m,pch,self)); + GUARD_OBJ(pv,VpCreateRbObject(m,pch)); m /= VpBaseFig(); if(m && pv->MaxPrec>m) pv->MaxPrec = m+1; return ToValue(pv); @@ -353,14 +353,6 @@ GetPositiveInt(VALUE v) } VP_EXPORT Real * -VpNewRbClass(U_LONG mx, char *str, VALUE klass) -{ - Real *pv = VpAlloc(mx,str); - pv->obj = (VALUE)Data_Wrap_Struct(klass, 0, BigDecimal_delete, pv); - return pv; -} - -VP_EXPORT Real * VpCreateRbObject(U_LONG mx, char *str) { Real *pv = VpAlloc(mx,str); @@ -1165,7 +1157,7 @@ BigDecimal_new(int argc, VALUE *argv, VA mf = GetPositiveInt(nFig); } SafeStringValue(iniValue); - GUARD_OBJ(pv,VpNewRbClass(mf, RSTRING(iniValue)->ptr,self)); + GUARD_OBJ(pv,VpCreateRbObject(mf, RSTRING(iniValue)->ptr)); return ToValue(pv); } @@ -1358,6 +1350,9 @@ Init_bigdecimal(void) coerce = rb_intern("coerce"); /* Class and method registration */ rb_cBigDecimal = rb_define_class("BigDecimal",rb_cNumeric); + + /* Global function */ + rb_define_global_function("BigDecimal", BigDecimal_new, -1); /* Class methods */ rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, 2); --- 斎藤ただし