support for light' userdata + simpler support for boxed' udata

This commit is contained in:
Roberto Ierusalimschy
2002-04-05 15:54:31 -03:00
parent f438d00ef3
commit 237969724f
12 changed files with 71 additions and 64 deletions

44
lapi.c
View File

@@ -1,5 +1,5 @@
/*
** $Id: lapi.c,v 1.181 2002/03/27 12:49:53 roberto Exp roberto $
** $Id: lapi.c,v 1.182 2002/04/02 20:43:18 roberto Exp roberto $
** Lua API
** See Copyright Notice in lua.h
*/
@@ -278,7 +278,12 @@ LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index) {
LUA_API void *lua_touserdata (lua_State *L, int index) {
StkId o = luaA_indexAcceptable(L, index);
return (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : uvalue(o)->uv.value;
if (o == NULL) return NULL;
switch (ttype(o)) {
case LUA_TUSERDATA: return (uvalue(o) + 1);
case LUA_TUDATAVAL: return pvalue(o);
default: return NULL;
}
}
@@ -356,6 +361,14 @@ LUA_API void lua_pushboolean (lua_State *L, int b) {
}
LUA_API void lua_pushudataval (lua_State *L, void *p) {
lua_lock(L);
setpvalue(L->top, p);
api_incr_top(L);
lua_unlock(L);
}
/*
** get functions (Lua -> stack)
@@ -472,7 +485,7 @@ LUA_API void lua_setmetatable (lua_State *L, int objindex) {
StkId obj, mt;
lua_lock(L);
api_checknelems(L, 1);
obj = luaA_indexAcceptable(L, objindex);
obj = luaA_index(L, objindex);
mt = --L->top;
if (ttype(mt) == LUA_TNIL)
mt = defaultmeta(L);
@@ -649,31 +662,14 @@ LUA_API void lua_concat (lua_State *L, int n) {
}
static Udata *pushnewudata (lua_State *L, size_t size) {
Udata *u = luaS_newudata(L, size);
setuvalue(L->top, u);
api_incr_top(L);
return uvalue(L->top-1);
}
LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
Udata *u;
void *p;
lua_lock(L);
u = pushnewudata(L, size);
p = u->uv.value;
lua_unlock(L);
return p;
}
LUA_API void lua_newuserdatabox (lua_State *L, void *p) {
Udata *u;
lua_lock(L);
u = pushnewudata(L, 0);
u->uv.value = p;
u = luaS_newudata(L, size);
setuvalue(L->top, u);
api_incr_top(L);
lua_unlock(L);
return u + 1;
}