From a139e2e003e0b62b7d34eeda20dd2354e74885f9 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 30 Jun 2010 14:40:27 -0300 Subject: [PATCH] old (and complex) luaL_findtable now used only in compatibility code inside lauxlib.c --- lauxlib.c | 81 ++++++++++++++++++++++++++++++++++--------------------- lauxlib.h | 5 ++-- linit.c | 4 +-- loadlib.c | 8 +++--- 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/lauxlib.c b/lauxlib.c index abb28624..38e40404 100644 --- a/lauxlib.c +++ b/lauxlib.c @@ -1,5 +1,5 @@ /* -** $Id: lauxlib.c,v 1.214 2010/05/31 16:34:19 roberto Exp roberto $ +** $Id: lauxlib.c,v 1.215 2010/06/09 17:53:59 roberto Exp roberto $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -656,6 +656,39 @@ LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { } +/* +** {====================================================== +** Compatibility with 5.1 module functions +** ======================================================= +*/ + +static const char *luaL_findtablex (lua_State *L, int idx, + const char *fname, int szhint) { + const char *e; + if (idx) lua_pushvalue(L, idx); + do { + e = strchr(fname, '.'); + if (e == NULL) e = fname + strlen(fname); + lua_pushlstring(L, fname, e - fname); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { /* no such field? */ + lua_pop(L, 1); /* remove this nil */ + lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ + lua_pushlstring(L, fname, e - fname); + lua_pushvalue(L, -2); + lua_settable(L, -4); /* set new table into field */ + } + else if (!lua_istable(L, -1)) { /* field has a non-table value? */ + lua_pop(L, 2); /* remove table and value */ + return fname; /* return problematic part of the name */ + } + lua_remove(L, -2); /* remove previous table */ + fname = e + 1; + } while (*e == '.'); + return NULL; +} + + /* ** Count number of elements in a luaL_Reg list. */ @@ -674,13 +707,13 @@ static int libsize (const luaL_Reg *l) { */ LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname, int sizehint) { - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ + luaL_findtablex(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ lua_getfield(L, -1, 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) */ lua_pushglobaltable(L); - if (luaL_findtable(L, 0, modname, sizehint) != NULL) + if (luaL_findtablex(L, 0, modname, sizehint) != NULL) luaL_error(L, "name conflict for module " LUA_QS, modname); lua_pushvalue(L, -1); lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */ @@ -707,6 +740,21 @@ LUALIB_API void luaL_openlib (lua_State *L, const char *libname, lua_pop(L, nup); /* remove upvalues */ } +/* }====================================================== */ + + +LUALIB_API void luaL_findtable (lua_State *L, int idx, const char *fname) { + lua_getfield(L, idx, fname); + if (lua_istable(L, -1)) return; /* table already there */ + else { + idx = lua_absindex(L, idx); + lua_pop(L, 1); /* remove previous result */ + lua_newtable(L); + lua_pushvalue(L, -1); /* copy to be left at top */ + lua_setfield(L, idx, fname); /* assign new table to field */ + } +} + LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, const char *r) { @@ -725,33 +773,6 @@ LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, } -LUALIB_API const char *luaL_findtable (lua_State *L, int idx, - const char *fname, int szhint) { - const char *e; - if (idx) lua_pushvalue(L, idx); - do { - e = strchr(fname, '.'); - if (e == NULL) e = fname + strlen(fname); - lua_pushlstring(L, fname, e - fname); - lua_rawget(L, -2); - if (lua_isnil(L, -1)) { /* no such field? */ - lua_pop(L, 1); /* remove this nil */ - lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ - lua_pushlstring(L, fname, e - fname); - lua_pushvalue(L, -2); - lua_settable(L, -4); /* set new table into field */ - } - else if (!lua_istable(L, -1)) { /* field has a non-table value? */ - lua_pop(L, 2); /* remove table and value */ - return fname; /* return problematic part of the name */ - } - lua_remove(L, -2); /* remove previous table */ - fname = e + 1; - } while (*e == '.'); - return NULL; -} - - static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { (void)ud; (void)osize; diff --git a/lauxlib.h b/lauxlib.h index a7147cbc..d5728b58 100644 --- a/lauxlib.h +++ b/lauxlib.h @@ -1,5 +1,5 @@ /* -** $Id: lauxlib.h,v 1.105 2010/05/04 17:21:08 roberto Exp roberto $ +** $Id: lauxlib.h,v 1.106 2010/05/31 16:34:19 roberto Exp roberto $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -78,8 +78,7 @@ LUALIB_API int (luaL_len) (lua_State *L, int idx); LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, const char *r); -LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, - const char *fname, int szhint); +LUALIB_API void (luaL_findtable) (lua_State *L, int idx, const char *fname); LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, const char *msg, int level); diff --git a/linit.c b/linit.c index 99c33e92..6c803270 100644 --- a/linit.c +++ b/linit.c @@ -1,5 +1,5 @@ /* -** $Id: linit.c,v 1.25 2010/05/20 12:57:59 roberto Exp roberto $ +** $Id: linit.c,v 1.26 2010/06/10 21:29:47 roberto Exp roberto $ ** Initialization of libraries for lua.c and other clients ** See Copyright Notice in lua.h */ @@ -59,7 +59,7 @@ LUALIB_API void luaL_openlibs (lua_State *L) { } /* add open functions from 'preloadedlibs' into 'package.preload' table */ lua_pushglobaltable(L); - luaL_findtable(L, 0, "package.preload", 0); + luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); for (lib = preloadedlibs; lib->func; lib++) { lua_pushcfunction(L, lib->func); lua_setfield(L, -2, lib->name); diff --git a/loadlib.c b/loadlib.c index 1ee34ae1..bb517801 100644 --- a/loadlib.c +++ b/loadlib.c @@ -1,5 +1,5 @@ /* -** $Id: loadlib.c,v 1.84 2010/06/13 19:36:17 roberto Exp roberto $ +** $Id: loadlib.c,v 1.85 2010/06/18 17:23:02 roberto Exp roberto $ ** Dynamic library loader for Lua ** See Copyright Notice in lua.h ** @@ -423,7 +423,7 @@ static int loader_Croot (lua_State *L) { static int loader_preload (lua_State *L) { const char *name = luaL_checkstring(L, 1); - lua_getfield(L, lua_upvalueindex(1), "preload"); + lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD"); if (!lua_istable(L, -1)) luaL_error(L, LUA_QL("package.preload") " must be a table"); lua_getfield(L, -1, name); @@ -633,10 +633,10 @@ LUAMOD_API int luaopen_package (lua_State *L) { LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); lua_setfield(L, -2, "config"); /* set field `loaded' */ - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2); + luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED"); lua_setfield(L, -2, "loaded"); /* set field `preload' */ - lua_newtable(L); + luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); lua_setfield(L, -2, "preload"); lua_pushglobaltable(L); lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */