summaryrefslogtreecommitdiff
path: root/src/lj_str.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_str.c')
-rw-r--r--src/lj_str.c32
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. */
177size_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. */
177GCstr * LJ_FASTCALL lj_str_fromnum(lua_State *L, const lua_Number *np) 192GCstr * 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': {