diff options
-rw-r--r-- | lstrlib.c | 14 | ||||
-rw-r--r-- | testes/strings.lua | 6 |
2 files changed, 12 insertions, 8 deletions
@@ -1227,16 +1227,14 @@ static int str_format (lua_State *L) { | |||
1227 | nb = lua_number2strx(L, buff, maxitem, form, | 1227 | nb = lua_number2strx(L, buff, maxitem, form, |
1228 | luaL_checknumber(L, arg)); | 1228 | luaL_checknumber(L, arg)); |
1229 | break; | 1229 | break; |
1230 | case 'e': case 'E': case 'f': | 1230 | case 'f': |
1231 | case 'g': case 'G': { | 1231 | maxitem = MAX_ITEMF; /* extra space for '%f' */ |
1232 | buff = luaL_prepbuffsize(&b, maxitem); | ||
1233 | /* FALLTHROUGH */ | ||
1234 | case 'e': case 'E': case 'g': case 'G': { | ||
1232 | lua_Number n = luaL_checknumber(L, arg); | 1235 | lua_Number n = luaL_checknumber(L, arg); |
1233 | if (*(strfrmt - 1) == 'f' && l_mathop(fabs)(n) >= 1e100) { | ||
1234 | /* 'n' needs more than 99 digits */ | ||
1235 | maxitem = MAX_ITEMF; /* extra space for '%f' */ | ||
1236 | buff = luaL_prepbuffsize(&b, maxitem); | ||
1237 | } | ||
1238 | addlenmod(form, LUA_NUMBER_FRMLEN); | 1236 | addlenmod(form, LUA_NUMBER_FRMLEN); |
1239 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); | 1237 | nb = snprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); |
1240 | break; | 1238 | break; |
1241 | } | 1239 | } |
1242 | case 'p': { | 1240 | case 'p': { |
diff --git a/testes/strings.lua b/testes/strings.lua index 2540fdef..0e7874bf 100644 --- a/testes/strings.lua +++ b/testes/strings.lua | |||
@@ -255,6 +255,12 @@ do -- longest number that can be formatted | |||
255 | local s = string.format('%.99f', -(10^i)) | 255 | local s = string.format('%.99f', -(10^i)) |
256 | assert(string.len(s) >= i + 101) | 256 | assert(string.len(s) >= i + 101) |
257 | assert(tonumber(s) == -(10^i)) | 257 | assert(tonumber(s) == -(10^i)) |
258 | |||
259 | -- limit for floats | ||
260 | assert(10^38 < math.huge) | ||
261 | local s = string.format('%.99f', -(10^38)) | ||
262 | assert(string.len(s) >= 38 + 101) | ||
263 | assert(tonumber(s) == -(10^38)) | ||
258 | end | 264 | end |
259 | 265 | ||
260 | 266 | ||