fix(lua): vim.wait(math.huge) fails #36885

Problem:
`nlua_wait()` uses `luaL_checkinteger()` which doesn't support
`math.huge` since it's double type. On PUC Lua this fails with
'number has no integer representation' error and on LuaJIT this
overflows int.

Solution:
Use `luaL_checknumber()` and handle `math.huge`.

(cherry picked from commit bc0635a9fc)
This commit is contained in:
skewb1k
2025-12-09 21:59:06 +03:00
committed by github-actions[bot]
parent c1c0078138
commit 9acbf5102f
2 changed files with 16 additions and 5 deletions

View File

@@ -3,6 +3,7 @@
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
@@ -437,10 +438,19 @@ static int nlua_wait(lua_State *lstate)
return luaL_error(lstate, e_fast_api_disabled, "vim.wait");
}
intptr_t timeout = luaL_checkinteger(lstate, 1);
if (timeout < 0) {
double timeout_number = luaL_checknumber(lstate, 1);
if (timeout_number < 0) {
return luaL_error(lstate, "timeout must be >= 0");
}
int64_t timeout;
if (isinf(timeout_number) || timeout_number > (double)INT64_MAX) {
timeout = INT64_MAX;
} else {
if (isnan(timeout_number) || timeout_number != trunc(timeout_number)) {
return luaL_error(lstate, "timeout has no integer representation");
}
timeout = (int64_t)timeout_number;
}
int lua_top = lua_gettop(lstate);
@@ -496,7 +506,7 @@ static int nlua_wait(lua_State *lstate)
LOOP_PROCESS_EVENTS_UNTIL(&main_loop,
loop_events,
(int)timeout,
timeout,
got_int || (is_function ? nlua_wait_condition(lstate,
&pcall_status,
&callback_result)