diff --git a/src/lj_api.c b/src/lj_api.c index 18a7ecbc..84508d7d 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -591,6 +591,20 @@ LUA_API size_t lua_objlen(lua_State *L, int idx) } } +LUA_API size_t lua_rawlen(lua_State *L, int idx) +{ + TValue *o = index2adr(L, idx); + if (tvisstr(o)) { + return strV(o)->len; + } else if (tvistab(o)) { + return (size_t)lj_tab_len(tabV(o)); + } else if (tvisudata(o)) { + return udataV(o)->len; + } else { + return 0; + } +} + LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx) { cTValue *o = index2adr(L, idx); diff --git a/src/lua.h b/src/lua.h index 6d1634d1..6ffa16d0 100644 --- a/src/lua.h +++ b/src/lua.h @@ -352,6 +352,7 @@ LUA_API const lua_Number *lua_version (lua_State *L); 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); +LUA_API size_t lua_rawlen (lua_State *L, int idx); /* From Lua 5.3. */ LUA_API int lua_isyieldable (lua_State *L);