backport lua_tonumberx & lua_tointegerx from 5.2

This commit is contained in:
Francois Perrad 2017-03-31 12:15:17 +02:00
parent 1fd4377ffc
commit 30d0390b9e
2 changed files with 29 additions and 7 deletions

View File

@ -327,17 +327,26 @@ LUA_API int lua_lessthan(lua_State *L, int idx1, int idx2)
} }
} }
LUA_API lua_Number lua_tonumber(lua_State *L, int idx) LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum)
{ {
cTValue *o = index2adr(L, idx); cTValue *o = index2adr(L, idx);
TValue tmp; TValue tmp;
if (LJ_LIKELY(tvisnumber(o))) if (LJ_LIKELY(tvisnumber(o))) {
if (pisnum) *pisnum = 1;
return numberVnum(o); return numberVnum(o);
else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) } else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) {
if (pisnum) *pisnum = 1;
return numV(&tmp); return numV(&tmp);
else } else {
if (pisnum) *pisnum = 0;
return 0; return 0;
} }
}
LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
{
return lua_tonumberx(L, idx, NULL);
}
LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx) LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
{ {
@ -363,22 +372,28 @@ LUALIB_API lua_Number luaL_optnumber(lua_State *L, int idx, lua_Number def)
return numV(&tmp); return numV(&tmp);
} }
LUA_API lua_Integer lua_tointeger(lua_State *L, int idx) LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum)
{ {
cTValue *o = index2adr(L, idx); cTValue *o = index2adr(L, idx);
TValue tmp; TValue tmp;
lua_Number n; lua_Number n;
if (LJ_LIKELY(tvisint(o))) { if (LJ_LIKELY(tvisint(o))) {
if (pisnum) *pisnum = 1;
return intV(o); return intV(o);
} else if (LJ_LIKELY(tvisnum(o))) { } else if (LJ_LIKELY(tvisnum(o))) {
n = numV(o); n = numV(o);
} else { } else {
if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) {
if (pisnum) *pisnum = 0;
return 0; return 0;
if (tvisint(&tmp)) }
if (tvisint(&tmp)) {
if (pisnum) *pisnum = 1;
return (lua_Integer)intV(&tmp); return (lua_Integer)intV(&tmp);
}
n = numV(&tmp); n = numV(&tmp);
} }
if (pisnum) *pisnum = 1;
#if LJ_64 #if LJ_64
return (lua_Integer)n; return (lua_Integer)n;
#else #else
@ -386,6 +401,11 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
#endif #endif
} }
LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
{
return lua_tointegerx(L, idx, NULL);
}
LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx) LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
{ {
cTValue *o = index2adr(L, idx); cTValue *o = index2adr(L, idx);

View File

@ -350,6 +350,8 @@ LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,
const char *chunkname, const char *mode); const char *chunkname, const char *mode);
LUA_API const lua_Number *lua_version (lua_State *L); LUA_API const lua_Number *lua_version (lua_State *L);
LUA_API void lua_copy (lua_State *L, int fromidx, int toidx); LUA_API void lua_copy (lua_State *L, int fromidx, int toidx);
LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum);
LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum);
/* From Lua 5.3. */ /* From Lua 5.3. */
LUA_API int lua_isyieldable (lua_State *L); LUA_API int lua_isyieldable (lua_State *L);