diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-02-24 02:20:45 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-02-24 02:20:45 +0000 |
commit | 7841a8f921bda69c53e6772da9df8371d9c8c151 (patch) | |
tree | 66c9d6aaad2a7cf6da6851be5194eca82866bed1 /numeric.c | |
parent | b78f2cc998240a0efa38475d21a8f2d538e539c3 (diff) | |
download | ruby-7841a8f921bda69c53e6772da9df8371d9c8c151.tar.gz |
numeric.c: micro optimizations
* numeric.c (flo_to_s, rb_fix2str): use rb_usascii_str_new instead
of rb_usascii_str_new_cstr, when the length can be calculated.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53910 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -733,8 +733,11 @@ flo_to_s(VALUE flt) char *p, *e; int sign, decpt, digs; - if (isinf(value)) - return rb_usascii_str_new2(value < 0 ? "-Infinity" : "Infinity"); + if (isinf(value)) { + static const char minf[] = "-Infinity"; + const int pos = (value > 0); /* skip "-" */ + return rb_usascii_str_new(minf+pos, strlen(minf)-pos); + } else if (isnan(value)) return rb_usascii_str_new2("NaN"); @@ -2863,7 +2866,7 @@ fix_uminus(VALUE num) VALUE rb_fix2str(VALUE x, int base) { - char buf[SIZEOF_VALUE*CHAR_BIT + 2], *b = buf + sizeof buf; + char buf[SIZEOF_VALUE*CHAR_BIT + 1], *const e = buf + sizeof buf, *b = e; long val = FIX2LONG(x); int neg = 0; @@ -2877,7 +2880,6 @@ rb_fix2str(VALUE x, int base) val = -val; neg = 1; } - *--b = '\0'; do { *--b = ruby_digitmap[(int)(val % base)]; } while (val /= base); @@ -2885,7 +2887,7 @@ rb_fix2str(VALUE x, int base) *--b = '-'; } - return rb_usascii_str_new2(b); + return rb_usascii_str_new(b, e - b); } /* |