|
@@ -1,5 +1,5 @@
|
|
/*
|
|
/*
|
|
-** $Id: lapi.c,v 1.152 2001/09/07 17:39:10 roberto Exp $
|
|
|
|
|
|
+** $Id: lapi.c,v 1.154 2001/10/11 21:40:56 roberto Exp $
|
|
** Lua API
|
|
** Lua API
|
|
** See Copyright Notice in lua.h
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
*/
|
|
@@ -40,15 +40,28 @@ const l_char lua_ident[] =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+static TObject *negindex (lua_State *L, int index) {
|
|
|
|
+ if (index > LUA_REGISTRYINDEX) {
|
|
|
|
+ api_check(L, index != 0 && -index <= L->top - L->ci->base);
|
|
|
|
+ return L->top+index;
|
|
|
|
+ } else if (index == LUA_REGISTRYINDEX) /* pseudo-indices */
|
|
|
|
+ return &G(L)->registry;
|
|
|
|
+ else {
|
|
|
|
+ TObject *func = (L->ci->base - 1);
|
|
|
|
+ index = LUA_REGISTRYINDEX - index;
|
|
|
|
+ api_check(L, iscfunction(func) && index <= clvalue(func)->c.nupvalues);
|
|
|
|
+ return &clvalue(func)->c.upvalue[index-1];
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
TObject *luaA_index (lua_State *L, int index) {
|
|
TObject *luaA_index (lua_State *L, int index) {
|
|
if (index > 0) {
|
|
if (index > 0) {
|
|
api_check(L, index <= L->top - L->ci->base);
|
|
api_check(L, index <= L->top - L->ci->base);
|
|
return L->ci->base+index-1;
|
|
return L->ci->base+index-1;
|
|
}
|
|
}
|
|
- else {
|
|
|
|
- api_check(L, index != 0 && -index <= L->top - L->ci->base);
|
|
|
|
- return L->top+index;
|
|
|
|
- }
|
|
|
|
|
|
+ else
|
|
|
|
+ return negindex(L, index);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -59,10 +72,8 @@ static TObject *luaA_indexAcceptable (lua_State *L, int index) {
|
|
if (o >= L->top) return NULL;
|
|
if (o >= L->top) return NULL;
|
|
else return o;
|
|
else return o;
|
|
}
|
|
}
|
|
- else {
|
|
|
|
- api_check(L, index != 0 && -index <= L->top - L->ci->base);
|
|
|
|
- return L->top+index;
|
|
|
|
- }
|
|
|
|
|
|
+ else
|
|
|
|
+ return negindex(L, index);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -378,24 +389,6 @@ LUA_API void lua_getglobals (lua_State *L) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-LUA_API int lua_getref (lua_State *L, int ref) {
|
|
|
|
- int status;
|
|
|
|
- lua_lock(L);
|
|
|
|
- if (ref == LUA_REFNIL) {
|
|
|
|
- setnilvalue(L->top);
|
|
|
|
- status = 1;
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- setobj(L->top, luaH_getnum(G(L)->weakregistry, ref));
|
|
|
|
- status = (ttype(L->top) != LUA_TNIL);
|
|
|
|
- }
|
|
|
|
- if (status)
|
|
|
|
- api_incr_top(L);
|
|
|
|
- lua_unlock(L);
|
|
|
|
- return status;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
LUA_API void lua_newtable (lua_State *L) {
|
|
LUA_API void lua_newtable (lua_State *L) {
|
|
lua_lock(L);
|
|
lua_lock(L);
|
|
sethvalue(L->top, luaH_new(L, 0));
|
|
sethvalue(L->top, luaH_new(L, 0));
|
|
@@ -404,22 +397,6 @@ LUA_API void lua_newtable (lua_State *L) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-LUA_API void lua_getregistry (lua_State *L) {
|
|
|
|
- lua_lock(L);
|
|
|
|
- sethvalue(L->top, G(L)->registry);
|
|
|
|
- api_incr_top(L);
|
|
|
|
- lua_unlock(L);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-LUA_API void lua_getweakregistry (lua_State *L) {
|
|
|
|
- lua_lock(L);
|
|
|
|
- sethvalue(L->top, G(L)->weakregistry);
|
|
|
|
- api_incr_top(L);
|
|
|
|
- lua_unlock(L);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
** set functions (stack -> Lua)
|
|
** set functions (stack -> Lua)
|
|
@@ -483,26 +460,25 @@ LUA_API void lua_setglobals (lua_State *L) {
|
|
|
|
|
|
LUA_API int lua_ref (lua_State *L, int lock) {
|
|
LUA_API int lua_ref (lua_State *L, int lock) {
|
|
int ref;
|
|
int ref;
|
|
|
|
+ if (lock == 0) lua_error(L, l_s("unlocked references are obsolete"));
|
|
if (lua_isnil(L, -1)) {
|
|
if (lua_isnil(L, -1)) {
|
|
lua_pop(L, 1);
|
|
lua_pop(L, 1);
|
|
- ref = LUA_REFNIL;
|
|
|
|
|
|
+ return LUA_REFNIL;
|
|
}
|
|
}
|
|
- else {
|
|
|
|
- lua_getweakregistry(L);
|
|
|
|
- ref = lua_getn(L, -1) + 1;
|
|
|
|
- lua_pushvalue(L, -2);
|
|
|
|
- lua_rawseti(L, -2, ref);
|
|
|
|
- if (lock) {
|
|
|
|
- lua_getregistry(L);
|
|
|
|
- lua_pushvalue(L, -3);
|
|
|
|
- lua_rawseti(L, -2, ref);
|
|
|
|
- lua_pop(L, 1); /* remove registry */
|
|
|
|
- }
|
|
|
|
|
|
+ lua_rawgeti(L, LUA_REGISTRYINDEX, 0); /* get first free element */
|
|
|
|
+ ref = lua_tonumber(L, -1);
|
|
|
|
+ lua_pop(L, 1); /* remove it from stack */
|
|
|
|
+ if (ref != 0) { /* some free element? */
|
|
|
|
+ lua_rawgeti(L, LUA_REGISTRYINDEX, ref); /* remove it from list */
|
|
|
|
+ lua_rawseti(L, LUA_REGISTRYINDEX, 0);
|
|
|
|
+ }
|
|
|
|
+ else { /* no free elements */
|
|
|
|
+ ref = lua_getn(L, LUA_REGISTRYINDEX) + 1; /* use next `n' */
|
|
lua_pushliteral(L, l_s("n"));
|
|
lua_pushliteral(L, l_s("n"));
|
|
lua_pushnumber(L, ref);
|
|
lua_pushnumber(L, ref);
|
|
- lua_settable(L, -3);
|
|
|
|
- lua_pop(L, 2);
|
|
|
|
|
|
+ lua_settable(L, LUA_REGISTRYINDEX); /* n = n+1 */
|
|
}
|
|
}
|
|
|
|
+ lua_rawseti(L, LUA_REGISTRYINDEX, ref);
|
|
return ref;
|
|
return ref;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -661,13 +637,10 @@ LUA_API void lua_error (lua_State *L, const l_char *s) {
|
|
|
|
|
|
LUA_API void lua_unref (lua_State *L, int ref) {
|
|
LUA_API void lua_unref (lua_State *L, int ref) {
|
|
if (ref >= 0) {
|
|
if (ref >= 0) {
|
|
- lua_getregistry(L);
|
|
|
|
- lua_pushnil(L);
|
|
|
|
- lua_rawseti(L, -2, ref);
|
|
|
|
- lua_getweakregistry(L);
|
|
|
|
- lua_pushnil(L);
|
|
|
|
- lua_rawseti(L, -2, ref);
|
|
|
|
- lua_pop(L, 2); /* remove both registries */
|
|
|
|
|
|
+ lua_rawgeti(L, LUA_REGISTRYINDEX, 0);
|
|
|
|
+ lua_pushnumber(L, ref);
|
|
|
|
+ lua_rawseti(L, LUA_REGISTRYINDEX, 0);
|
|
|
|
+ lua_rawseti(L, LUA_REGISTRYINDEX, ref);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -787,3 +760,22 @@ LUA_API void lua_setweakmode (lua_State *L, int mode) {
|
|
lua_unlock(L);
|
|
lua_unlock(L);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+LUA_API void lua_pushupvalues (lua_State *L) {
|
|
|
|
+ TObject *func;
|
|
|
|
+ int n, i;
|
|
|
|
+ lua_lock(L);
|
|
|
|
+ func = (L->ci->base - 1);
|
|
|
|
+ api_check(L, iscfunction(func));
|
|
|
|
+ n = clvalue(func)->c.nupvalues;
|
|
|
|
+ if (LUA_MINSTACK+n > lua_stackspace(L))
|
|
|
|
+ luaD_error(L, l_s("stack overflow"));
|
|
|
|
+ for (i=0; i<n; i++) {
|
|
|
|
+ setobj(L->top, &clvalue(func)->c.upvalue[i]);
|
|
|
|
+ L->top++;
|
|
|
|
+ }
|
|
|
|
+ lua_unlock(L);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|