ruby-changes:23567
From: nobu <ko1@a...>
Date: Fri, 11 May 2012 13:51:08 +0900 (JST)
Subject: [ruby-changes:23567] nobu:r35618 (trunk): Revert r35616 "* ext/bigdecimal/bigdecimal.c: use RB_GC_GUARD. "
nobu 2012-05-11 13:50:54 +0900 (Fri, 11 May 2012) New Revision: 35618 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35618 Log: Revert r35616 "* ext/bigdecimal/bigdecimal.c: use RB_GC_GUARD. [ruby-dev:45627]" RB_GC_GUARD() is only for variables on the machine stack, because it forces a VALUE to be stored in a variable which should be referenced from the GC, but does not add any reference path to the variable. So it makes no sense for objects in heap. Modified files: trunk/ChangeLog trunk/ext/bigdecimal/bigdecimal.c Index: ChangeLog =================================================================== --- ChangeLog (revision 35617) +++ ChangeLog (revision 35618) @@ -3,10 +3,6 @@ * lib/test/unit.rb (Test::Unit::Runner#failed): no unnecessary newlines if no reports to be displayed. -Thu May 11 03:41:00 2012 Kenta Murata <mrkn@m...> - - * ext/bigdecimal/bigdecimal.c: use RB_GC_GUARD. [ruby-dev:45627] - Thu May 10 10:55:35 2012 Nobuyoshi Nakada <nobu@r...> * test/minitest/test_minitest_mock.rb: Correct requiring path to Index: ext/bigdecimal/bigdecimal.c =================================================================== --- ext/bigdecimal/bigdecimal.c (revision 35617) +++ ext/bigdecimal/bigdecimal.c (revision 35618) @@ -59,6 +59,12 @@ static ID id_to_r; static ID id_eq; +/* MACRO's to guard objects from GC by keeping them in stack */ +#define ENTER(n) volatile VALUE vStack[n];int iStack=0 +#define PUSH(x) vStack[iStack++] = (unsigned long)(x); +#define SAVE(p) PUSH(p->obj); +#define GUARD_OBJ(p,y) {p=y;SAVE(p);} + #define BASE_FIG RMPD_COMPONENT_FIGURES #define BASE RMPD_BASE @@ -296,13 +302,13 @@ static VALUE BigDecimal_prec(VALUE self) { + ENTER(1); Real *p; VALUE obj; - p = GetVpValue(self,1); + GUARD_OBJ(p,GetVpValue(self,1)); obj = rb_assoc_new(INT2NUM(p->Prec*VpBaseFig()), INT2NUM(p->MaxPrec*VpBaseFig())); - RB_GC_GUARD(p->obj); return obj; } @@ -315,36 +321,36 @@ static VALUE BigDecimal_hash(VALUE self) { + ENTER(1); Real *p; st_index_t hash; - p = GetVpValue(self,1); + GUARD_OBJ(p,GetVpValue(self,1)); hash = (st_index_t)p->sign; /* hash!=2: the case for 0(1),NaN(0) or +-Infinity(3) is sign itself */ if(hash == 2 || hash == (st_index_t)-2) { hash ^= rb_memhash(p->frac, sizeof(BDIGIT)*p->Prec); hash += p->exponent; } - RB_GC_GUARD(p->obj); return INT2FIX(hash); } static VALUE BigDecimal_dump(int argc, VALUE *argv, VALUE self) { + ENTER(5); Real *vp; char *psz; VALUE dummy; volatile VALUE dump; rb_scan_args(argc, argv, "01", &dummy); - vp = GetVpValue(self,1); + GUARD_OBJ(vp,GetVpValue(self,1)); dump = rb_str_new(0,VpNumOfChars(vp,"E")+50); psz = RSTRING_PTR(dump); sprintf(psz, "%"PRIuSIZE":", VpMaxPrec(vp)*VpBaseFig()); VpToString(vp, psz+strlen(psz), 0, 0); rb_str_resize(dump, strlen(psz)); - RB_GC_GUARD(vp->obj); return dump; } @@ -354,6 +360,7 @@ static VALUE BigDecimal_load(VALUE self, VALUE str) { + ENTER(2); Real *pv; unsigned char *pch; unsigned char ch; @@ -369,10 +376,9 @@ m = m*10 + (unsigned long)(ch-'0'); } if(m>VpBaseFig()) m -= VpBaseFig(); - pv = VpNewRbClass(m, (char *)pch, self); + GUARD_OBJ(pv,VpNewRbClass(m,(char *)pch,self)); m /= VpBaseFig(); if(m && pv->MaxPrec>m) pv->MaxPrec = m+1; - RB_GC_GUARD(pv->obj); return ToValue(pv); } @@ -625,10 +631,11 @@ static VALUE BigDecimal_to_i(VALUE self) { + ENTER(5); ssize_t e, nf; Real *p; - p = GetVpValue(self, 1); + GUARD_OBJ(p,GetVpValue(self,1)); BigDecimal_check_num(p); e = VpExponent10(p); @@ -658,8 +665,6 @@ INT2FIX(dpower))); if (TYPE(ret) == T_FLOAT) rb_raise(rb_eFloatDomainError, "Infinity"); - - RB_GC_GUARD(p->obj); return ret; } } @@ -671,13 +676,14 @@ static VALUE BigDecimal_to_f(VALUE self) { + ENTER(1); Real *p; double d; SIGNED_VALUE e; char *buf; volatile VALUE str; - p = GetVpValue(self, 1); + GUARD_OBJ(p, GetVpValue(self, 1)); if (VpVtoD(&d, &e, p) != 1) return rb_float_new(d); if (e > (SIGNED_VALUE)(DBL_MAX_10_EXP+BASE_FIG)) @@ -692,8 +698,6 @@ d = strtod(buf, 0); if (errno == ERANGE) goto overflow; - - RB_GC_GUARD(p->obj); return rb_float_new(d); overflow: @@ -763,6 +767,7 @@ static VALUE BigDecimal_coerce(VALUE self, VALUE other) { + ENTER(2); VALUE obj; Real *b; @@ -772,13 +777,12 @@ else { if (TYPE(other) == T_RATIONAL) { Real* pv = DATA_PTR(self); - b = GetVpValueWithPrec(other, pv->Prec*VpBaseFig(), 1); + GUARD_OBJ(b, GetVpValueWithPrec(other, pv->Prec*VpBaseFig(), 1)); } else { - b = GetVpValue(other, 1); + GUARD_OBJ(b, GetVpValue(other, 1)); } obj = rb_assoc_new(b->obj, self); - RB_GC_GUARD(b->obj); } return obj; @@ -812,28 +816,27 @@ static VALUE BigDecimal_add(VALUE self, VALUE r) { + ENTER(5); Real *c, *a, *b; size_t mx; - a = GetVpValue(self, 1); + GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); if(!b) return DoSomeOne(self,r,'+'); + SAVE(b); if(VpIsNaN(b)) return b->obj; if(VpIsNaN(a)) return a->obj; mx = GetAddSubPrec(a,b); if (mx == (size_t)-1L) { - c = VpCreateRbObject(VpBaseFig() + 1, "0"); + GUARD_OBJ(c,VpCreateRbObject(VpBaseFig() + 1, "0")); VpAddSub(c, a, b, 1); } else { - c = VpCreateRbObject(mx *(VpBaseFig() + 1), "0"); + GUARD_OBJ(c,VpCreateRbObject(mx *(VpBaseFig() + 1), "0")); if(!mx) { VpSetInf(c,VpGetSign(a)); } else { VpAddSub(c, a, b, 1); } } - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); return ToValue(c); } @@ -851,42 +854,40 @@ static VALUE BigDecimal_sub(VALUE self, VALUE r) { + ENTER(5); Real *c, *a, *b; size_t mx; - a = GetVpValue(self, 1); + GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); if(!b) return DoSomeOne(self,r,'-'); + SAVE(b); if(VpIsNaN(b)) return b->obj; if(VpIsNaN(a)) return a->obj; mx = GetAddSubPrec(a,b); if (mx == (size_t)-1L) { - c = VpCreateRbObject(VpBaseFig() + 1, "0"); + GUARD_OBJ(c,VpCreateRbObject(VpBaseFig() + 1, "0")); VpAddSub(c, a, b, -1); } else { - c = VpCreateRbObject(mx *(VpBaseFig() + 1), "0"); + GUARD_OBJ(c,VpCreateRbObject(mx *(VpBaseFig() + 1), "0")); if(!mx) { VpSetInf(c,VpGetSign(a)); } else { VpAddSub(c, a, b, -1); } } - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); return ToValue(c); } static VALUE BigDecimalCmp(VALUE self, VALUE r,char op) { + ENTER(5); SIGNED_VALUE e; Real *a, *b=0; - - a = GetVpValue(self, 1); - + GUARD_OBJ(a,GetVpValue(self,1)); switch (TYPE(r)) { case T_DATA: if (!is_kind_of_BigDecimal(r)) break; @@ -894,15 +895,15 @@ case T_FIXNUM: /* fall through */ case T_BIGNUM: - b = GetVpValue(r,0); + GUARD_OBJ(b, GetVpValue(r,0)); break; case T_FLOAT: - b = GetVpValueWithPrec(r, DBL_DIG+1, 0); + GUARD_OBJ(b, GetVpValueWithPrec(r, DBL_DIG+1, 0)); break; case T_RATIONAL: - b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 0); + GUARD_OBJ(b, GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 0)); break; default: @@ -937,14 +938,10 @@ } return rb_num_coerce_relop(self, r, f); } - + SAVE(b); e = VpComp(a, b); - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - if (e == 999) return (op == '*') ? Qnil : Qfalse; - switch (op) { case '*': return INT2FIX(e); /* any op */ @@ -1078,12 +1075,11 @@ static VALUE BigDecimal_neg(VALUE self) { + ENTER(5); Real *c, *a; - a = GetVpValue(self, 1); - c = VpCreateRbObject(a->Prec *(VpBaseFig() + 1), "0"); + GUARD_OBJ(a,GetVpValue(self,1)); + GUARD_OBJ(c,VpCreateRbObject(a->Prec *(VpBaseFig() + 1), "0")); VpAsgn(c, a, -1); - RB_GC_GUARD(a->obj); - RB_GC_GUARD(c->obj); return ToValue(c); } @@ -1101,19 +1097,18 @@ static VALUE BigDecimal_mult(VALUE self, VALUE r) { + ENTER(5); Real *c, *a, *b; size_t mx; - a = GetVpValue(self, 1); + GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); if(!b) return DoSomeOne(self,r,'*'); + SAVE(b); mx = a->Prec + b->Prec; - c = VpCreateRbObject(mx *(VpBaseFig() + 1), "0"); + GUARD_OBJ(c,VpCreateRbObject(mx *(VpBaseFig() + 1), "0")); VpMult(c, a, b); - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); return ToValue(c); } @@ -1121,23 +1116,21 @@ BigDecimal_divide(Real **c, Real **res, Real **div, VALUE self, VALUE r) /* For c = self.div(r): with round operation */ { + ENTER(5); Real *a, *b; size_t mx; - a = GetVpValue(self, 1); + GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); if(!b) return DoSomeOne(self,r,'/'); + SAVE(b); *div = b; mx = a->Prec + vabs(a->exponent); if(mx<b->Prec + vabs(b->exponent)) mx = b->Prec + vabs(b->exponent); mx =(mx + 1) * VpBaseFig(); - *c = VpCreateRbObject(mx, "#0"); - *res = VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"); + GUARD_OBJ((*c),VpCreateRbObject(mx, "#0")); + GUARD_OBJ((*res),VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0")); VpDivd(*c, *res, a, b); - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD((*c)->obj); - RB_GC_GUARD((*res)->obj); return (VALUE)0; } @@ -1162,9 +1155,11 @@ BigDecimal_div(VALUE self, VALUE r) /* For c = self/r: with round operation */ { + ENTER(5); Real *c=NULL, *res=NULL, *div = NULL; r = BigDecimal_divide(&c, &res, &div, self, r); - if (r != (VALUE)0) return r; /* coerced by other */ + if(r!=(VALUE)0) return r; /* coerced by other */ + SAVE(c);SAVE(res);SAVE(div); /* a/b = c + r/b */ /* c xxxxx r 00000yyyyy ==> (y/b)*BASE >= HALF_BASE @@ -1172,10 +1167,7 @@ /* Round */ if(VpHasVal(div)) { /* frac[0] must be zero for NaN,INF,Zero */ VpInternalRound(c, 0, c->frac[c->Prec-1], (BDIGIT)(VpBaseVal()*(BDIGIT_DBL)res->frac[0]/div->frac[0])); - RB_GC_GUARD(res->obj); - RB_GC_GUARD(div->obj); } - RB_GC_GUARD(c->obj); return ToValue(c); } @@ -1186,13 +1178,15 @@ static VALUE BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod) { + ENTER(8); Real *c=NULL, *d=NULL, *res=NULL; Real *a, *b; size_t mx; - a = GetVpValue(self, 1); - b = GetVpValue(r, 0); + GUARD_OBJ(a,GetVpValue(self,1)); + b = GetVpValue(r,0); if(!b) return Qfalse; + SAVE(b); if(VpIsNaN(a) || VpIsNaN(b)) goto NaN; if(VpIsInf(a) && VpIsInf(b)) goto NaN; @@ -1200,75 +1194,55 @@ rb_raise(rb_eZeroDivError, "divided by 0"); } if(VpIsInf(a)) { - d = VpCreateRbObject(1, "0"); + GUARD_OBJ(d,VpCreateRbObject(1, "0")); VpSetInf(d, (SIGNED_VALUE)(VpGetSign(a) == VpGetSign(b) ? 1 : -1)); - c = VpCreateRbObject(1, "NaN"); + GUARD_OBJ(c,VpCreateRbObject(1, "NaN")); *div = d; *mod = c; - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); - RB_GC_GUARD(d->obj); return Qtrue; } if(VpIsInf(b)) { - d = VpCreateRbObject(1, "0"); + GUARD_OBJ(d,VpCreateRbObject(1, "0")); *div = d; *mod = a; - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); - RB_GC_GUARD(d->obj); return Qtrue; } if(VpIsZero(a)) { - c = VpCreateRbObject(1, "0"); - d = VpCreateRbObject(1, "0"); + GUARD_OBJ(c,VpCreateRbObject(1, "0")); + GUARD_OBJ(d,VpCreateRbObject(1, "0")); *div = d; *mod = c; - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); - RB_GC_GUARD(d->obj); return Qtrue; } mx = a->Prec + vabs(a->exponent); if(mx<b->Prec + vabs(b->exponent)) mx = b->Prec + vabs(b->exponent); mx =(mx + 1) * VpBaseFig(); - c = VpCreateRbObject(mx, "0"); - res = VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"); + GUARD_OBJ(c,VpCreateRbObject(mx, "0")); + GUARD_OBJ(res,VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0")); VpDivd(c, res, a, b); mx = c->Prec *(VpBaseFig() + 1); - d = VpCreateRbObject(mx, "0"); + GUARD_OBJ(d,VpCreateRbObject(mx, "0")); VpActiveRound(d,c,VP_ROUND_DOWN,0); VpMult(res,d,b); VpAddSub(c,a,res,-1); if(!VpIsZero(c) && (VpGetSign(a)*VpGetSign(b)<0)) { - VpAddSub(res,d,VpOne(),-1); - d = VpCreateRbObject(GetAddSubPrec(c, b)*(VpBaseFig() + 1), "0"); - VpAddSub(d ,c,b, 1); - *div = res; - *mod = d; + VpAddSub(res,d,VpOne(),-1); + GUARD_OBJ(d,VpCreateRbObject(GetAddSubPrec(c, b)*(VpBaseFig() + 1), "0")); + VpAddSub(d ,c,b, 1); + *div = res; + *mod = d; } else { - *div = d; - *mod = c; + *div = d; + *mod = c; } - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); - RB_GC_GUARD(d->obj); return Qtrue; NaN: - c = VpCreateRbObject(1, "NaN"); - d = VpCreateRbObject(1, "NaN"); + GUARD_OBJ(c,VpCreateRbObject(1, "NaN")); + GUARD_OBJ(d,VpCreateRbObject(1, "NaN")); *div = d; *mod = c; - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); - RB_GC_GUARD(d->obj); return Qtrue; } @@ -1281,11 +1255,11 @@ static VALUE BigDecimal_mod(VALUE self, VALUE r) /* %: a%b = a - (a.to_f/b).floor * b */ { + ENTER(3); Real *div=NULL, *mod=NULL; if(BigDecimal_DoDivmod(self,r,&div,&mod)) { - RB_GC_GUARD(div->obj); - RB_GC_GUARD(mod->obj); + SAVE(div); SAVE(mod); return ToValue(mod); } return DoSomeOne(self,r,'%'); @@ -1294,26 +1268,28 @@ static VALUE BigDecimal_divremain(VALUE self, VALUE r, Real **dv, Real **rv) { + ENTER(10); size_t mx; Real *a=NULL, *b=NULL, *c=NULL, *res=NULL, *d=NULL, *rr=NULL, *ff=NULL; Real *f=NULL; - a = GetVpValue(self, 1); + GUARD_OBJ(a,GetVpValue(self,1)); b = GetVpValue(r,0); - if (!b) return DoSomeOne(self, r, rb_intern("remainder")); + if(!b) return DoSomeOne(self,r,rb_intern("remainder")); + SAVE(b); mx =(a->MaxPrec + b->MaxPrec) *VpBaseFig(); - c = VpCreateRbObject(mx, "0"); - res = VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"); - rr = VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"); - ff = VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0"); + GUARD_OBJ(c ,VpCreateRbObject(mx, "0")); + GUARD_OBJ(res,VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0")); + GUARD_OBJ(rr ,VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0")); + GUARD_OBJ(ff ,VpCreateRbObject((mx+1) * 2 +(VpBaseFig() + 1), "#0")); VpDivd(c, res, a, b); mx = c->Prec *(VpBaseFig() + 1); - d = VpCreateRbObject(mx, "0"); - f = VpCreateRbObject(mx, "0"); + GUARD_OBJ(d,VpCreateRbObject(mx, "0")); + GUARD_OBJ(f,VpCreateRbObject(mx, "0")); VpActiveRound(d,c,VP_ROUND_DOWN,0); /* 0: round off */ @@ -1323,15 +1299,6 @@ *dv = d; *rv = ff; - - RB_GC_GUARD(a->obj); - RB_GC_GUARD(b->obj); - RB_GC_GUARD(c->obj); - RB_GC_GUARD(res->obj); - RB_GC_GUARD(rr->obj); - RB_GC_GUARD(ff->obj); - RB_GC_GUARD(d->obj); - RB_GC_GUARD(f->obj); return (VALUE)0; } @@ -1371,11 +1338,11 @@ static VALUE BigDecimal_divmod(VALUE self, VALUE r) { + ENTER(5); Real *div=NULL, *mod=NULL; - if (BigDecimal_DoDivmod(self,r,&div,&mod)) { - RB_GC_GUARD(div->obj); - RB_GC_GUARD(mod->obj); + if(BigDecimal_DoDivmod(self,r,&div,&mod)) { + SAVE(div); SAVE(mod); return rb_assoc_new(ToValue(div), ToValue(mod)); } return DoSomeOne(self,r,rb_intern("divmod")); @@ -1384,47 +1351,35 @@ static VALUE BigDecimal_div2(int argc, VALUE *argv, VALUE self) { + ENTER(5); VALUE b,n; - int na = rb_scan_args(argc, argv, "11", &b, &n); + int na = rb_scan_args(argc,argv,"11",&b,&n); + if(na==1) { /* div in Float sense */ + Real *div=NULL; + Real *mod; + if(BigDecimal_DoDivmod(self,b,&div,&mod)) { + return BigDecimal_to_i(ToValue(div)); + } + return DoSomeOne(self,b,rb_intern("div")); + } else { /* div in BigDecimal sense */ + SIGNED_VALUE ix = GetPositiveInt(n); + if (ix == 0) return BigDecimal_div(self, b); + else { + Real *res=NULL; + Real *av=NULL, *bv=NULL, *cv=NULL; + size_t mx = (ix+VpBaseFig()*2); + size_t pl = VpSetPrecLimit(0); - if (na == 1) { - /* div in Float sense */ - Real *div=NULL; - Real *mod; - if (BigDecimal_DoDivmod(self, b, &div, &mod)) { - return BigDecimal_to_i(ToValue(div)); - } - return DoSomeOne(self, b, rb_intern("div")); - } - else { - /* div in BigDecimal sense */ - SIGNED_VALUE ix = GetPositiveInt(n); - if (ix == 0) { - return BigDecimal_div(self, b); - } - else { - Real *res=NULL; - Real *av=NULL, *bv=NULL, *cv=NULL; - size_t mx = ix + VpBaseFig()*2; - size_t pl = VpSetPrecLimit(0); - - cv = VpCreateRbObject(mx, "0"); - av = GetVpValue(self, 1); - bv = GetVpValue(b, 1); - mx = av->Prec + bv->Prec + 2; - if (mx <= cv->MaxPrec) { - mx = cv->MaxPrec + 1; - } - res = VpCreateRbObject((mx * 2 + 2)*VpBaseFig(), "#0"); - VpDivd(cv, res, av, bv); - VpSetPrecLimit(pl); - VpLeftRound(cv, VpGetRoundMode(), ix); - - RB_GC_GUARD(cv->obj); - RB_GC_GUARD(av->obj); - RB_GC_GUARD(bv->obj); - RB_GC_GUARD(res->obj); - return ToValue(cv); + GUARD_OBJ(cv,VpCreateRbObject(mx,"0")); + GUARD_OBJ(av,GetVpValue(self,1)); + GUARD_OBJ(bv,GetVpValue(b,1)); + mx = av->Prec + bv->Prec + 2; + if(mx <= cv->MaxPrec) mx = cv->MaxPrec+1; + GUARD_OBJ(res,VpCreateRbObject((mx * 2 + 2)*VpBaseFig(), "#0")); + VpDivd(cv,res,av,bv); + VpSetPrecLimit(pl); + VpLeftRound(cv,VpGetRoundMode(),ix); + return ToValue(cv); } } } @@ -1432,37 +1387,33 @@ static VALUE BigDecimal_add2(VALUE self, VALUE b, VALUE n) { + ENTER(2); Real *cv; SIGNED_VALUE mx = GetPositiveInt(n); - if (mx == 0) { - return BigDecimal_add(self, b); - } + if (mx == 0) return BigDecimal_add(self, b); else { - size_t pl = VpSetPrecLimit(0); - VALUE c = BigDecimal_add(self, b); - VpSetPrecLimit(pl); - cv = GetVpValue(c, 1); - VpLeftRound(cv, VpGetRoundMode(), mx); - RB_GC_GUARD(cv->obj); - return ToValue(cv); + size_t pl = VpSetPrecLimit(0); + VALUE c = BigDecimal_add(self,b); + VpSetPrecLimit(pl); + GUARD_OBJ(cv,GetVpValue(c,1)); + VpLeftRound(cv,VpGetRoundMode(),mx); + return ToValue(cv); } } static VALUE BigDecimal_sub2(VALUE self, VALUE b, VALUE n) { + ENTER(2); Real *cv; SIGNED_VALUE mx = GetPositiveInt(n); - if (mx == 0) { - return BigDecimal_sub(self, b); - } + if (mx == 0) return BigDecimal_sub(self, b); else { size_t pl = VpSetPrecLimit(0); - VALUE c = BigDecimal_sub(self, b); + VALUE c = BigDecimal_sub(self,b); VpSetPrecLimit(pl); - cv = GetVpValue(c, 1); - VpLeftRound(cv, VpGetRoundMode(), mx); - RB_GC_GUARD(cv->obj); + GUARD_OBJ(cv,GetVpValue(c,1)); + VpLeftRound(cv,VpGetRoundMode(),mx); return ToValue(cv); } } @@ -1470,18 +1421,16 @@ static VALUE BigDecimal_mult2(VALUE self, VALUE b, VALUE n) { + ENTER(2); Real *cv; SIGNED_VALUE mx = GetPositiveInt(n); - if (mx == 0) { - return BigDecimal_mult(self, b); - } + if (mx == 0) return BigDecimal_mult(self, b); else { size_t pl = VpSetPrecLimit(0); - VALUE c = BigDecimal_mult(self, b); + VALUE c = BigDecimal_mult(self,b); VpSetPrecLimit(pl); - cv = GetVpValue(c, 1); - VpLeftRound(cv, VpGetRoundMode(), mx); - RB_GC_GUARD(cv->obj); + GUARD_OBJ(cv,GetVpValue(c,1)); + VpLeftRound(cv,VpGetRoundMode(),mx); return ToValue(cv); } } @@ -1495,16 +1444,15 @@ static VALUE BigDecimal_abs(VALUE self) { + ENTER(5); Real *c, * (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/