diff options
Diffstat (limited to 'src/lj_str.c')
-rw-r--r-- | src/lj_str.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/lj_str.c b/src/lj_str.c index 7b38cecc..4a9477dd 100644 --- a/src/lj_str.c +++ b/src/lj_str.c | |||
@@ -173,13 +173,27 @@ parsedbl: | |||
173 | } | 173 | } |
174 | } | 174 | } |
175 | 175 | ||
176 | /* Print number to buffer. Canonicalizes non-finite values. */ | ||
177 | size_t LJ_FASTCALL lj_str_bufnum(char *s, cTValue *o) | ||
178 | { | ||
179 | if (LJ_LIKELY((o->u32.hi << 1) < 0xffe00000)) { /* Finite? */ | ||
180 | lua_Number n = o->n; | ||
181 | return (size_t)lua_number2str(s, n); | ||
182 | } else if (((o->u32.hi & 0x000fffff) | o->u32.lo) != 0) { | ||
183 | s[0] = 'n'; s[1] = 'a'; s[2] = 'n'; return 3; | ||
184 | } else if ((o->u32.hi & 0x80000000) == 0) { | ||
185 | s[0] = 'i'; s[1] = 'n'; s[2] = 'f'; return 3; | ||
186 | } else { | ||
187 | s[0] = '-'; s[1] = 'i'; s[2] = 'n'; s[3] = 'f'; return 4; | ||
188 | } | ||
189 | } | ||
190 | |||
176 | /* Convert number to string. */ | 191 | /* Convert number to string. */ |
177 | GCstr * LJ_FASTCALL lj_str_fromnum(lua_State *L, const lua_Number *np) | 192 | GCstr * LJ_FASTCALL lj_str_fromnum(lua_State *L, const lua_Number *np) |
178 | { | 193 | { |
179 | char s[LUAI_MAXNUMBER2STR]; | 194 | char buf[LUAI_MAXNUMBER2STR]; |
180 | lua_Number n = *np; | 195 | size_t len = lj_str_bufnum(buf, (TValue *)np); |
181 | size_t len = (size_t)lua_number2str(s, n); | 196 | return lj_str_new(L, buf, len); |
182 | return lj_str_new(L, s, len); | ||
183 | } | 197 | } |
184 | 198 | ||
185 | #if LJ_HASJIT | 199 | #if LJ_HASJIT |
@@ -252,10 +266,12 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | |||
252 | break; | 266 | break; |
253 | } | 267 | } |
254 | case 'f': { | 268 | case 'f': { |
255 | char buff[LUAI_MAXNUMBER2STR]; | 269 | char buf[LUAI_MAXNUMBER2STR]; |
256 | lua_Number n = cast_num(va_arg(argp, LUAI_UACNUMBER)); | 270 | TValue tv; |
257 | MSize len = (MSize)lua_number2str(buff, n); | 271 | MSize len; |
258 | addstr(L, sb, buff, len); | 272 | tv.n = cast_num(va_arg(argp, LUAI_UACNUMBER)); |
273 | len = (MSize)lj_str_bufnum(buf, &tv); | ||
274 | addstr(L, sb, buf, len); | ||
259 | break; | 275 | break; |
260 | } | 276 | } |
261 | case 'p': { | 277 | case 'p': { |