** 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. */
| 808 | ** the module table. |
| 809 | */ |
| 810 | LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname, |
| 811 | int sizehint) { |
| 812 | luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ |
| 813 | lua_getfield(L, -1, modname); /* get _LOADED[modname] */ |
| 814 | if (!lua_istable(L, -1)) { /* not found? */ |
| 815 | lua_pop(L, 1); /* remove previous result */ |
| 816 | /* try global variable (and create one if it does not exist) */ |
| 817 | lua_pushglobaltable(L); |
| 818 | if (luaL_findtable(L, 0, modname, sizehint) != NULL) |
| 819 | luaL_error(L, "name conflict for module " LUA_QS, modname); |
| 820 | lua_pushvalue(L, -1); |
| 821 | lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */ |
| 822 | } |
| 823 | lua_remove(L, -2); /* remove _LOADED table */ |
| 824 | } |
| 825 | |
| 826 | |
| 827 | LUALIB_API void luaL_openlib (lua_State *L, const char *libname, |
no test coverage detected