aboutsummaryrefslogtreecommitdiff
path: root/lauxlib.c
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 /lauxlib.c
parent2cbbf7e95a229cce3033f68807cf3e82021879f8 (diff)
downloadlua-cd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda.tar.gz
lua-cd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda.tar.bz2
lua-cd99bbcd0d88e7b5864ea9c9634ce8abd9bdedda.zip
better support for new libraries
Diffstat (limited to 'lauxlib.c')
-rw-r--r--lauxlib.c33
1 files changed, 27 insertions, 6 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