|
@ -1,5 +1,5 @@ |
|
|
/*
|
|
|
/*
|
|
|
** $Id: loadlib.c,v 1.130 2017/01/12 17:14:26 roberto Exp roberto $ |
|
|
** $Id: loadlib.c,v 1.131 2017/12/13 12:51:42 roberto Exp roberto $ |
|
|
** Dynamic library loader for Lua |
|
|
** Dynamic library loader for Lua |
|
|
** See Copyright Notice in lua.h |
|
|
** See Copyright Notice in lua.h |
|
|
** |
|
|
** |
|
@ -621,96 +621,10 @@ static int ll_require (lua_State *L) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
** {====================================================== |
|
|
|
|
|
** 'module' function |
|
|
|
|
|
** ======================================================= |
|
|
|
|
|
*/ |
|
|
|
|
|
#if defined(LUA_COMPAT_MODULE) |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
** changes the environment variable of calling function |
|
|
|
|
|
*/ |
|
|
|
|
|
static void set_env (lua_State *L) { |
|
|
|
|
|
lua_Debug ar; |
|
|
|
|
|
if (lua_getstack(L, 1, &ar) == 0 || |
|
|
|
|
|
lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ |
|
|
|
|
|
lua_iscfunction(L, -1)) |
|
|
|
|
|
luaL_error(L, "'module' not called from a Lua function"); |
|
|
|
|
|
lua_pushvalue(L, -2); /* copy new environment table to top */ |
|
|
|
|
|
lua_setupvalue(L, -2, 1); |
|
|
|
|
|
lua_pop(L, 1); /* remove function */ |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void dooptions (lua_State *L, int n) { |
|
|
|
|
|
int i; |
|
|
|
|
|
for (i = 2; i <= n; i++) { |
|
|
|
|
|
if (lua_isfunction(L, i)) { /* avoid 'calling' extra info. */ |
|
|
|
|
|
lua_pushvalue(L, i); /* get option (a function) */ |
|
|
|
|
|
lua_pushvalue(L, -2); /* module */ |
|
|
|
|
|
lua_call(L, 1, 0); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void modinit (lua_State *L, const char *modname) { |
|
|
|
|
|
const char *dot; |
|
|
|
|
|
lua_pushvalue(L, -1); |
|
|
|
|
|
lua_setfield(L, -2, "_M"); /* module._M = module */ |
|
|
|
|
|
lua_pushstring(L, modname); |
|
|
|
|
|
lua_setfield(L, -2, "_NAME"); |
|
|
|
|
|
dot = strrchr(modname, '.'); /* look for last dot in module name */ |
|
|
|
|
|
if (dot == NULL) dot = modname; |
|
|
|
|
|
else dot++; |
|
|
|
|
|
/* set _PACKAGE as package name (full module name minus last part) */ |
|
|
|
|
|
lua_pushlstring(L, modname, dot - modname); |
|
|
|
|
|
lua_setfield(L, -2, "_PACKAGE"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int ll_module (lua_State *L) { |
|
|
|
|
|
const char *modname = luaL_checkstring(L, 1); |
|
|
|
|
|
int lastarg = lua_gettop(L); /* last parameter */ |
|
|
|
|
|
luaL_pushmodule(L, modname, 1); /* get/create module table */ |
|
|
|
|
|
/* check whether table already has a _NAME field */ |
|
|
|
|
|
if (lua_getfield(L, -1, "_NAME") != LUA_TNIL) |
|
|
|
|
|
lua_pop(L, 1); /* table is an initialized module */ |
|
|
|
|
|
else { /* no; initialize it */ |
|
|
|
|
|
lua_pop(L, 1); |
|
|
|
|
|
modinit(L, modname); |
|
|
|
|
|
} |
|
|
|
|
|
lua_pushvalue(L, -1); |
|
|
|
|
|
set_env(L); |
|
|
|
|
|
dooptions(L, lastarg); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int ll_seeall (lua_State *L) { |
|
|
|
|
|
luaL_checktype(L, 1, LUA_TTABLE); |
|
|
|
|
|
if (!lua_getmetatable(L, 1)) { |
|
|
|
|
|
lua_createtable(L, 0, 1); /* create new metatable */ |
|
|
|
|
|
lua_pushvalue(L, -1); |
|
|
|
|
|
lua_setmetatable(L, 1); |
|
|
|
|
|
} |
|
|
|
|
|
lua_pushglobaltable(L); |
|
|
|
|
|
lua_setfield(L, -2, "__index"); /* mt.__index = _G */ |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
/* }====================================================== */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const luaL_Reg pk_funcs[] = { |
|
|
static const luaL_Reg pk_funcs[] = { |
|
|
{"loadlib", ll_loadlib}, |
|
|
{"loadlib", ll_loadlib}, |
|
|
{"searchpath", ll_searchpath}, |
|
|
{"searchpath", ll_searchpath}, |
|
|
#if defined(LUA_COMPAT_MODULE) |
|
|
|
|
|
{"seeall", ll_seeall}, |
|
|
|
|
|
#endif |
|
|
|
|
|
/* placeholders */ |
|
|
/* placeholders */ |
|
|
{"preload", NULL}, |
|
|
{"preload", NULL}, |
|
|
{"cpath", NULL}, |
|
|
{"cpath", NULL}, |
|
@ -722,9 +636,6 @@ static const luaL_Reg pk_funcs[] = { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const luaL_Reg ll_funcs[] = { |
|
|
static const luaL_Reg ll_funcs[] = { |
|
|
#if defined(LUA_COMPAT_MODULE) |
|
|
|
|
|
{"module", ll_module}, |
|
|
|
|
|
#endif |
|
|
|
|
|
{"require", ll_require}, |
|
|
{"require", ll_require}, |
|
|
{NULL, NULL} |
|
|
{NULL, NULL} |
|
|
}; |
|
|
}; |
|
@ -742,10 +653,6 @@ static void createsearcherstable (lua_State *L) { |
|
|
lua_pushcclosure(L, searchers[i], 1); |
|
|
lua_pushcclosure(L, searchers[i], 1); |
|
|
lua_rawseti(L, -2, i+1); |
|
|
lua_rawseti(L, -2, i+1); |
|
|
} |
|
|
} |
|
|
#if defined(LUA_COMPAT_LOADERS) |
|
|
|
|
|
lua_pushvalue(L, -1); /* make a copy of 'searchers' table */ |
|
|
|
|
|
lua_setfield(L, -3, "loaders"); /* put it in field 'loaders' */ |
|
|
|
|
|
#endif |
|
|
|
|
|
lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ |
|
|
lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|