From 478bd3128c96b5e26e81ea23de6aa1a33e449218 Mon Sep 17 00:00:00 2001 From: akr Date: Wed, 31 Jul 2013 22:38:53 +0000 Subject: * bignum.c (big2str_orig): Use temporary buffer when trim mode. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42302 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- bignum.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'bignum.c') diff --git a/bignum.c b/bignum.c index 738a490d7a..f14aaa725d 100644 --- a/bignum.c +++ b/bignum.c @@ -4224,13 +4224,23 @@ static size_t big2str_orig(struct big2str_struct *b2s, VALUE x, char* ptr, size_t len, int trim) { long i = RBIGNUM_LEN(x); - size_t j = len; + size_t j; int k; BDIGIT* ds = BDIGITS(x); BDIGIT_DBL num; + char buf[SIZEOF_BDIGIT_DBL*CHAR_BIT], *p; assert(i <= 2); + if (trim) { + p = buf; + j = sizeof(buf); + } + else { + p = ptr; + j = len; + } + num = 0; if (0 < i) num = ds[0]; @@ -4239,15 +4249,16 @@ big2str_orig(struct big2str_struct *b2s, VALUE x, char* ptr, size_t len, int tri k = b2s->hbase2_numdigits; while (k--) { - ptr[--j] = ruby_digitmap[num % b2s->base]; + p[--j] = ruby_digitmap[num % b2s->base]; num /= b2s->base; if (j <= 0) break; if (trim && num == 0) break; } if (trim) { - while (j < len && ptr[j] == '0') j++; - MEMMOVE(ptr, ptr + j, char, len - j); - len -= j; + while (j < sizeof(buf) && p[j] == '0') j++; + assert(sizeof(buf)-j <= len); + MEMCPY(ptr, p + j, char, sizeof(buf) - j); + len = sizeof(buf) - j; } return len; } -- cgit v1.2.3