Skip to content

LuaL openlib

Code

void luaL_openlib(lua_State * L, char const * libname, luaL_Reg const * l, int nup)
{
    lj_lib_checkfpu(L);
    if (libname) {
        int size = libsize(l);
        /* check whether lib already exists */
        luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);
        lua_getfield(L, -1, libname);  /* get _LOADED[libname] */
        if (!lua_istable(L, -1)) {  /* not found? */
            lua_pop(L, 1);  /* remove previous result */
            /* try global variable (and create one if it does not exist) */
            if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)
                lj_err_callerv(L, LJ_ERR_BADMODN, libname);
            lua_pushvalue(L, -1);
            lua_setfield(L, -3, libname);  /* _LOADED[libname] = new table */
        }
        lua_remove(L, -2);  /* remove _LOADED table */
        lua_insert(L, -(nup+1));  /* move library table to below upvalues */
    }
    for (; l->name; l++) {
        int i;
        for (i = 0; i < nup; i++)  /* copy upvalues to the top */
            lua_pushvalue(L, -nup);
        lua_pushcclosure(L, l->func, nup);
        lua_setfield(L, -(nup+2), l->name);
    }
    lua_pop(L, nup);  /* remove upvalues */
}

See also