From 340f2f4777e8ad427a364c9c1ef562d40c60cb1d Mon Sep 17 00:00:00 2001 From: Philipp Janda Date: Sat, 13 Jan 2018 19:57:19 +0100 Subject: lua_tointeger(x) rejects non-ints for Lua 5.1. --- c-api/compat-5.3.c | 15 +++++++++++---- c-api/compat-5.3.h | 2 ++ tests/test.lua | 5 +++++ tests/testmod.c | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/c-api/compat-5.3.c b/c-api/compat-5.3.c index b82c654..ebaf03f 100644 --- a/c-api/compat-5.3.c +++ b/c-api/compat-5.3.c @@ -205,11 +205,18 @@ COMPAT53_API void lua_rawsetp (lua_State *L, int i, const void *p) { COMPAT53_API lua_Integer lua_tointegerx (lua_State *L, int i, int *isnum) { - lua_Integer n = lua_tointeger(L, i); - if (isnum != NULL) { - *isnum = (n != 0 || lua_isnumber(L, i)); + int ok = 0; + lua_Number n = lua_tonumberx(L, i, &ok); + lua_Integer j = (lua_tointeger)(L, i); /* native lua_tointeger */ + if (isnum == NULL) + isnum = &ok; + if (ok && n == j) { + *isnum = 1; + return j; + } else { + *isnum = 0; + return 0; } - return n; } diff --git a/c-api/compat-5.3.h b/c-api/compat-5.3.h index 755c23e..6b6e35c 100644 --- a/c-api/compat-5.3.h +++ b/c-api/compat-5.3.h @@ -165,6 +165,8 @@ COMPAT53_API void lua_rawsetp(lua_State *L, int i, const void *p); #define lua_rawlen(L, i) lua_objlen((L), (i)) +#define lua_tointeger(L, i) lua_tointegerx((L), (i), NULL) + #define lua_tointegerx COMPAT53_CONCAT(COMPAT53_PREFIX, _tointegerx) COMPAT53_API lua_Integer lua_tointegerx (lua_State *L, int i, int *isnum); diff --git a/tests/test.lua b/tests/test.lua index 2f6c7f6..c2c0abf 100755 --- a/tests/test.lua +++ b/tests/test.lua @@ -705,6 +705,11 @@ print("tonumber", mod.tonumber("error")) ___'' print("tointeger", mod.tointeger(12)) +print("tointeger", mod.tointeger(-12)) +print("tointeger", mod.tointeger(12.1)) +print("tointeger", mod.tointeger(12.9)) +print("tointeger", mod.tointeger(-12.1)) +print("tointeger", mod.tointeger(-12.9)) print("tointeger", mod.tointeger("12")) print("tointeger", mod.tointeger("0")) print("tointeger", mod.tointeger(math.pi)) diff --git a/tests/testmod.c b/tests/testmod.c index 9232682..cd56e76 100644 --- a/tests/testmod.c +++ b/tests/testmod.c @@ -152,7 +152,8 @@ static int test_tointeger (lua_State *L) { lua_pushnil(L); else lua_pushinteger(L, n); - return 1; + lua_pushinteger(L, lua_tointeger(L, 1)); + return 2; } static int test_len (lua_State *L) { -- cgit v1.2.3-55-g6feb