summaryrefslogtreecommitdiff
path: root/ext/bigdecimal/bigdecimal.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-08 02:07:43 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-08 02:07:43 +0000
commit66abf4ad68609d70d7a1ebe14c519c150b5957ef (patch)
tree8dcae5262af1a7dd9a6f66ecaccc4675592c9463 /ext/bigdecimal/bigdecimal.c
parent7eb6e562e51c06e5ef8aad841b5542aebe246f01 (diff)
* ext/bigdecimal/bigdecimal.c (VpAlloc): ensure buf does not get
collected. based on a patch masaya tarui at [ruby-dev:41213]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27665 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/bigdecimal/bigdecimal.c')
-rw-r--r--ext/bigdecimal/bigdecimal.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 9a3dec83d8..817fc13cfd 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -2593,7 +2593,7 @@ VpAlloc(U_LONG mx, const char *szVal)
int sign=1;
Real *vp = NULL;
U_LONG mf = VpGetPrecLimit();
- volatile VALUE buf;
+ VALUE buf;
mx = (mx + BASE_FIG - 1) / BASE_FIG + 1; /* Determine allocation unit. */
if(szVal) {
@@ -2621,7 +2621,7 @@ VpAlloc(U_LONG mx, const char *szVal)
/* Skip all '_' after digit: 2006-6-30 */
ni = 0;
- buf = rb_str_new(0,strlen(szVal)+1);
+ buf = rb_str_tmp_new(strlen(szVal)+1);
psz = RSTRING_PTR(buf);
i = 0;
ipn = 0;
@@ -2720,6 +2720,7 @@ VpAlloc(U_LONG mx, const char *szVal)
vp->MaxPrec = mx; /* set max precision */
VpSetZero(vp,sign);
VpCtoV(vp, &(szVal[ipn]), ni, &(szVal[ipf]), nf, &(szVal[ipe]), ne);
+ rb_str_resize(buf, 0);
return vp;
}