mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-08 07:34:07 +00:00
refactor with luaL_pushmodule & luaL_setfuncs
luaL_setfuncs allows to load some modules compiled with Lua 5.2
This commit is contained in:
parent
b52dba5f2e
commit
a563dc1794
@ -84,6 +84,9 @@ LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
|
|||||||
const char *name, const char *mode);
|
const char *name, const char *mode);
|
||||||
LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
|
LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
|
||||||
int level);
|
int level);
|
||||||
|
LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
|
||||||
|
LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,
|
||||||
|
int sizehint);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -113,6 +116,12 @@ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
|
|||||||
|
|
||||||
#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
|
#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
|
||||||
|
|
||||||
|
/* From Lua 5.2. */
|
||||||
|
#define luaL_newlibtable(L,l) \
|
||||||
|
lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
|
||||||
|
|
||||||
|
#define luaL_newlib(L,l) (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** {======================================================
|
** {======================================================
|
||||||
** Generic Buffer manipulation
|
** Generic Buffer manipulation
|
||||||
|
@ -111,34 +111,40 @@ static int libsize(const luaL_Reg *l)
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Find or create a module table with a given name. The function
|
||||||
|
** first looks at the LOADED table and, if that fails, try a
|
||||||
|
** global variable with that name. In any case, leaves on the stack
|
||||||
|
** the module table.
|
||||||
|
*/
|
||||||
|
LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname,
|
||||||
|
int sizehint)
|
||||||
|
{
|
||||||
|
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16);
|
||||||
|
lua_getfield(L, -1, modname); /* 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, modname, sizehint) != NULL)
|
||||||
|
lj_err_callerv(L, LJ_ERR_BADMODN, modname);
|
||||||
|
lua_pushvalue(L, -1);
|
||||||
|
lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */
|
||||||
|
}
|
||||||
|
lua_remove(L, -2); /* remove _LOADED table */
|
||||||
|
}
|
||||||
|
|
||||||
LUALIB_API void luaL_openlib(lua_State *L, const char *libname,
|
LUALIB_API void luaL_openlib(lua_State *L, const char *libname,
|
||||||
const luaL_Reg *l, int nup)
|
const luaL_Reg *l, int nup)
|
||||||
{
|
{
|
||||||
lj_lib_checkfpu(L);
|
lj_lib_checkfpu(L);
|
||||||
if (libname) {
|
if (libname) {
|
||||||
int size = libsize(l);
|
luaL_pushmodule(L, libname, libsize(l)); /* get/create library table */
|
||||||
/* check whether lib already exists */
|
lua_insert(L, -(nup + 1)); /* move library table to below upvalues */
|
||||||
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++) {
|
if (l)
|
||||||
int i;
|
luaL_setfuncs(L, l, nup);
|
||||||
for (i = 0; i < nup; i++) /* copy upvalues to the top */
|
else
|
||||||
lua_pushvalue(L, -nup);
|
lua_pop(L, nup); /* remove upvalues */
|
||||||
lua_pushcclosure(L, l->func, nup);
|
|
||||||
lua_setfield(L, -(nup+2), l->name);
|
|
||||||
}
|
|
||||||
lua_pop(L, nup); /* remove upvalues */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LUALIB_API void luaL_register(lua_State *L, const char *libname,
|
LUALIB_API void luaL_register(lua_State *L, const char *libname,
|
||||||
@ -147,6 +153,24 @@ LUALIB_API void luaL_register(lua_State *L, const char *libname,
|
|||||||
luaL_openlib(L, libname, l, 0);
|
luaL_openlib(L, libname, l, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** set functions from list 'l' into table at top - 'nup'; each
|
||||||
|
** function gets the 'nup' elements at the top as upvalues.
|
||||||
|
** Returns with only the table at the stack.
|
||||||
|
*/
|
||||||
|
LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup)
|
||||||
|
{
|
||||||
|
luaL_checkstack(L, nup, "too many upvalues");
|
||||||
|
for (; l->name; l++) { /* fill the table with given functions */
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < nup; i++) /* copy upvalues to the top */
|
||||||
|
lua_pushvalue(L, -nup);
|
||||||
|
lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */
|
||||||
|
lua_setfield(L, -(nup + 2), l->name);
|
||||||
|
}
|
||||||
|
lua_pop(L, nup); /* remove upvalues */
|
||||||
|
}
|
||||||
|
|
||||||
LUALIB_API const char *luaL_gsub(lua_State *L, const char *s,
|
LUALIB_API const char *luaL_gsub(lua_State *L, const char *s,
|
||||||
const char *p, const char *r)
|
const char *p, const char *r)
|
||||||
{
|
{
|
||||||
|
@ -489,17 +489,8 @@ static void modinit(lua_State *L, const char *modname)
|
|||||||
static int lj_cf_package_module(lua_State *L)
|
static int lj_cf_package_module(lua_State *L)
|
||||||
{
|
{
|
||||||
const char *modname = luaL_checkstring(L, 1);
|
const char *modname = luaL_checkstring(L, 1);
|
||||||
int loaded = lua_gettop(L) + 1; /* index of _LOADED table */
|
int lastarg = lua_gettop(L); /* last parameter */
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
|
luaL_pushmodule(L, modname, 1); /* get/create module table */
|
||||||
lua_getfield(L, loaded, modname); /* get _LOADED[modname] */
|
|
||||||
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, modname, 1) != NULL)
|
|
||||||
lj_err_callerv(L, LJ_ERR_BADMODN, modname);
|
|
||||||
lua_pushvalue(L, -1);
|
|
||||||
lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */
|
|
||||||
}
|
|
||||||
/* check whether table already has a _NAME field */
|
/* check whether table already has a _NAME field */
|
||||||
lua_getfield(L, -1, "_NAME");
|
lua_getfield(L, -1, "_NAME");
|
||||||
if (!lua_isnil(L, -1)) { /* is table an initialized module? */
|
if (!lua_isnil(L, -1)) { /* is table an initialized module? */
|
||||||
@ -510,7 +501,7 @@ static int lj_cf_package_module(lua_State *L)
|
|||||||
}
|
}
|
||||||
lua_pushvalue(L, -1);
|
lua_pushvalue(L, -1);
|
||||||
setfenv(L);
|
setfenv(L);
|
||||||
dooptions(L, loaded - 1);
|
dooptions(L, lastarg);
|
||||||
#if LJ_52
|
#if LJ_52
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user