From 636aaed7ccf734aed36e04e8b739e153689c7aa2 Mon Sep 17 00:00:00 2001 From: Francois Perrad Date: Thu, 23 Mar 2017 15:26:46 +0100 Subject: [PATCH] backport math.type from 5.3 --- src/lib_math.c | 15 +++++++++++++++ src/lj_api.c | 6 ++++++ src/lua.h | 2 ++ 3 files changed, 23 insertions(+) diff --git a/src/lib_math.c b/src/lib_math.c index ef9dda2d..073a628a 100644 --- a/src/lib_math.c +++ b/src/lib_math.c @@ -94,6 +94,21 @@ LJLIB_ASM(math_min) LJLIB_REC(math_minmax IR_MIN) } LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX) +LJLIB_CF(math_type) +{ + if (lua_type(L, 1) == LUA_TNUMBER) { + if (lua_isinteger(L, 1)) + lua_pushliteral(L, "integer"); + else + lua_pushliteral(L, "float"); + } + else { + luaL_checkany(L, 1); + lua_pushnil(L); + } + return 1; +} + LJLIB_PUSH(3.14159265358979323846) LJLIB_SET(pi) LJLIB_PUSH(1e310) LJLIB_SET(huge) diff --git a/src/lj_api.c b/src/lj_api.c index d1be3abf..f1c704da 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -231,6 +231,12 @@ LUA_API int lua_iscfunction(lua_State *L, int idx) return tvisfunc(o) && !isluafunc(funcV(o)); } +LUA_API int lua_isinteger (lua_State *L, int idx) { + cTValue *o = index2adr(L, idx); + return tvisint(o) || + (tvisnumber(o) && ((lua_Number)(lua_Integer)numV(o) == numV(o))); +} + LUA_API int lua_isnumber(lua_State *L, int idx) { cTValue *o = index2adr(L, idx); diff --git a/src/lua.h b/src/lua.h index 352d29f3..bee120ef 100644 --- a/src/lua.h +++ b/src/lua.h @@ -347,6 +347,8 @@ LUA_API void *lua_upvalueid (lua_State *L, int idx, int n); LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2); LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode); +/* From Lua 5.3. */ +LUA_API int lua_isinteger (lua_State *L, int idx); struct lua_Debug {