diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lapi.js | 16 | ||||
-rw-r--r-- | src/lbaselib.js | 8 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/lapi.js b/src/lapi.js index 19e3090..76dee1b 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -464,6 +464,21 @@ const lua_tolstring = function(L, idx) { const lua_tostring = lua_tolstring; +const lua_rawlen = function(L, idx) { + let o = index2addr(L, idx); + switch (o.ttype()) { + case CT.LUA_TSHRSTR: + case CT.LUA_TLNGSTR: + return o.value.length; + case CT.LUA_TUSERDATA: + return o.len; + case CT.LUA_TTABLE: + return o.luaH_getn(); + default: + return 0; + } +}; + const lua_tointeger = function(L, idx) { return lvm.tointeger(index2addr(L, idx)) }; @@ -694,6 +709,7 @@ module.exports.lua_absindex = lua_absindex; module.exports.index2addr = index2addr; module.exports.lua_rawget = lua_rawget; module.exports.lua_rawset = lua_rawset; +module.exports.lua_rawlen = lua_rawlen; module.exports.lua_isstring = lua_isstring; module.exports.lua_rotate = lua_rotate; module.exports.lua_remove = lua_remove; diff --git a/src/lbaselib.js b/src/lbaselib.js index fa0349b..2eacaaf 100644 --- a/src/lbaselib.js +++ b/src/lbaselib.js @@ -65,6 +65,13 @@ const luaB_rawequal = function(L) { return 1; }; +const luaB_rawlen = function(L) { + let t = lapi.lua_type(L, 1); + lauxlib.luaL_argcheck(L, t === CT.LUA_TTABLE || t === CT.LUA_TSTRING, 1, "table or string expected"); + lapi.lua_pushinteger(L, lapi.lua_rawlen(L, 1)); + return 1; +}; + const luaB_rawget = function(L) { lauxlib.luaL_checktype(L, 1, CT.LUA_TTABLE); lauxlib.luaL_checkany(L, 2); @@ -241,6 +248,7 @@ const base_funcs = { "select": luaB_select, "setmetatable": luaB_setmetatable, "rawequal": luaB_rawequal, + "rawlen": luaB_rawlen, "rawset": luaB_rawset, "rawget": luaB_rawget, "type": luaB_type, |