aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-04-02 17:42:49 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-04-02 17:42:49 -0300
commitcd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda (patch)
tree8d432e309e82d871e21121a98b0d5505ebf4f785
parent2cbbf7e95a229cce3033f68807cf3e82021879f8 (diff)
downloadlua-cd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda.tar.gz
lua-cd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda.tar.bz2
lua-cd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda.zip
better support for new libraries
-rw-r--r--lauxlib.c33
-rw-r--r--lauxlib.h7
2 files changed, 31 insertions, 9 deletions
diff --git a/lauxlib.c b/lauxlib.c
index efa313f7..f0345be5 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lauxlib.c,v 1.62 2002/03/20 12:54:08 roberto Exp roberto $ 2** $Id: lauxlib.c,v 1.63 2002/03/27 15:30:41 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -116,20 +116,41 @@ LUALIB_API lua_Number luaL_opt_number (lua_State *L, int narg, lua_Number def) {
116} 116}
117 117
118 118
119LUALIB_API void luaL_openlib (lua_State *L, const luaL_reg *l) { 119LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
120 if (!lua_getmetatable(L, obj)) /* no metatable? */
121 return 0;
122 lua_pushstring(L, event);
123 lua_rawget(L, -2);
124 if (lua_isnil(L, -1)) {
125 lua_pop(L, 2); /* remove metatable and metafield */
126 return 0;
127 }
128 lua_pushvalue(L, obj);
129 lua_rawcall(L, 1, 1);
130 return 1;
131}
132
133
134LUALIB_API void luaL_openlib (lua_State *L, const luaL_reg *l, int nup) {
120 for (; l->name; l++) { 135 for (; l->name; l++) {
136 int i;
121 lua_pushstring(L, l->name); 137 lua_pushstring(L, l->name);
122 lua_pushcfunction(L, l->func); 138 for (i=0; i<nup; i++) /* copy upvalues to the top */
123 lua_settable(L, -3); 139 lua_pushvalue(L, -(nup+1));
140 lua_pushcclosure(L, l->func, nup);
141 lua_settable(L, -(nup+3));
124 } 142 }
143 lua_pop(L, nup);
125} 144}
126 145
127 146
128LUALIB_API void luaL_opennamedlib (lua_State *L, const char *libname, 147LUALIB_API void luaL_opennamedlib (lua_State *L, const char *libname,
129 const luaL_reg *l) { 148 const luaL_reg *l, int nup) {
130 lua_pushstring(L, libname); 149 lua_pushstring(L, libname);
150 lua_insert(L, -(nup+1));
131 lua_newtable(L); 151 lua_newtable(L);
132 luaL_openlib(L, l); 152 lua_insert(L, -(nup+1));
153 luaL_openlib(L, l, nup);
133 lua_settable(L, LUA_GLOBALSINDEX); 154 lua_settable(L, LUA_GLOBALSINDEX);
134} 155}
135 156
diff --git a/lauxlib.h b/lauxlib.h
index 250c7da9..6af70d44 100644
--- a/lauxlib.h
+++ b/lauxlib.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lauxlib.h,v 1.42 2002/02/05 22:36:52 roberto Exp roberto $ 2** $Id: lauxlib.h,v 1.43 2002/03/20 12:54:08 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -27,9 +27,10 @@ typedef struct luaL_reg {
27} luaL_reg; 27} luaL_reg;
28 28
29 29
30LUALIB_API void luaL_openlib (lua_State *L, const luaL_reg *l); 30LUALIB_API void luaL_openlib (lua_State *L, const luaL_reg *l, int nup);
31LUALIB_API void luaL_opennamedlib (lua_State *L, const char *libname, 31LUALIB_API void luaL_opennamedlib (lua_State *L, const char *libname,
32 const luaL_reg *l); 32 const luaL_reg *l, int nup);
33LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event);
33LUALIB_API void luaL_typerror (lua_State *L, int narg, const char *tname); 34LUALIB_API void luaL_typerror (lua_State *L, int narg, const char *tname);
34LUALIB_API void luaL_argerror (lua_State *L, int numarg, 35LUALIB_API void luaL_argerror (lua_State *L, int numarg,
35 const char *extramsg); 36 const char *extramsg);