backport lua_len from 5.2

This commit is contained in:
Francois Perrad 2017-05-06 10:31:55 +02:00
parent 23afb8dcee
commit f543ff65fc
2 changed files with 20 additions and 0 deletions

View File

@ -806,6 +806,25 @@ LUA_API void lua_concat(lua_State *L, int n)
/* else n == 1: nothing to do. */ /* else n == 1: nothing to do. */
} }
LUA_API void lua_len (lua_State *L, int idx)
{
TValue *o = index2adr_stack(L, idx);
if (tvisstr(o)) {
setnumV(L->top, strV(o)->len);
} else if (tvistab(o) && (!LJ_52 || tvisnil(lj_meta_lookup(L, o, MM_len)))) {
setnumV(L->top, lj_tab_len(tabV(o)));
} else {
TValue *v;
L->top = lj_meta_len(L, o);
L->top += 2;
lj_vm_call(L, L->top-2, 1+1);
L->top -= 2+LJ_FR2;
v = L->top+1+LJ_FR2;
copyTV(L, L->top, v);
}
incr_top(L);
}
/* -- Object getters ------------------------------------------------------ */ /* -- Object getters ------------------------------------------------------ */
LUA_API void lua_gettable(lua_State *L, int idx) LUA_API void lua_gettable(lua_State *L, int idx)

View File

@ -353,6 +353,7 @@ 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_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 lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum);
LUA_API size_t lua_rawlen (lua_State *L, int idx); LUA_API size_t lua_rawlen (lua_State *L, int idx);
LUA_API void lua_len (lua_State *L, int idx);
/* From Lua 5.3. */ /* From Lua 5.3. */
LUA_API int lua_isyieldable (lua_State *L); LUA_API int lua_isyieldable (lua_State *L);