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 | ||
