diff options
Diffstat (limited to 'lapi.c')
-rw-r--r-- | lapi.c | 44 |
1 files changed, 20 insertions, 24 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.181 2002/03/27 12:49:53 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.182 2002/04/02 20:43:18 roberto Exp roberto $ |
3 | ** Lua API | 3 | ** Lua API |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -278,7 +278,12 @@ LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index) { | |||
278 | 278 | ||
279 | LUA_API void *lua_touserdata (lua_State *L, int index) { | 279 | LUA_API void *lua_touserdata (lua_State *L, int index) { |
280 | StkId o = luaA_indexAcceptable(L, index); | 280 | StkId o = luaA_indexAcceptable(L, index); |
281 | return (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : uvalue(o)->uv.value; | 281 | if (o == NULL) return NULL; |
282 | switch (ttype(o)) { | ||
283 | case LUA_TUSERDATA: return (uvalue(o) + 1); | ||
284 | case LUA_TUDATAVAL: return pvalue(o); | ||
285 | default: return NULL; | ||
286 | } | ||
282 | } | 287 | } |
283 | 288 | ||
284 | 289 | ||
@@ -356,6 +361,14 @@ LUA_API void lua_pushboolean (lua_State *L, int b) { | |||
356 | } | 361 | } |
357 | 362 | ||
358 | 363 | ||
364 | LUA_API void lua_pushudataval (lua_State *L, void *p) { | ||
365 | lua_lock(L); | ||
366 | setpvalue(L->top, p); | ||
367 | api_incr_top(L); | ||
368 | lua_unlock(L); | ||
369 | } | ||
370 | |||
371 | |||
359 | 372 | ||
360 | /* | 373 | /* |
361 | ** get functions (Lua -> stack) | 374 | ** get functions (Lua -> stack) |
@@ -472,7 +485,7 @@ LUA_API void lua_setmetatable (lua_State *L, int objindex) { | |||
472 | StkId obj, mt; | 485 | StkId obj, mt; |
473 | lua_lock(L); | 486 | lua_lock(L); |
474 | api_checknelems(L, 1); | 487 | api_checknelems(L, 1); |
475 | obj = luaA_indexAcceptable(L, objindex); | 488 | obj = luaA_index(L, objindex); |
476 | mt = --L->top; | 489 | mt = --L->top; |
477 | if (ttype(mt) == LUA_TNIL) | 490 | if (ttype(mt) == LUA_TNIL) |
478 | mt = defaultmeta(L); | 491 | mt = defaultmeta(L); |
@@ -649,31 +662,14 @@ LUA_API void lua_concat (lua_State *L, int n) { | |||
649 | } | 662 | } |
650 | 663 | ||
651 | 664 | ||
652 | static Udata *pushnewudata (lua_State *L, size_t size) { | ||
653 | Udata *u = luaS_newudata(L, size); | ||
654 | setuvalue(L->top, u); | ||
655 | api_incr_top(L); | ||
656 | return uvalue(L->top-1); | ||
657 | } | ||
658 | |||
659 | |||
660 | LUA_API void *lua_newuserdata (lua_State *L, size_t size) { | 665 | LUA_API void *lua_newuserdata (lua_State *L, size_t size) { |
661 | Udata *u; | 666 | Udata *u; |
662 | void *p; | ||
663 | lua_lock(L); | 667 | lua_lock(L); |
664 | u = pushnewudata(L, size); | 668 | u = luaS_newudata(L, size); |
665 | p = u->uv.value; | 669 | setuvalue(L->top, u); |
666 | lua_unlock(L); | 670 | api_incr_top(L); |
667 | return p; | ||
668 | } | ||
669 | |||
670 | |||
671 | LUA_API void lua_newuserdatabox (lua_State *L, void *p) { | ||
672 | Udata *u; | ||
673 | lua_lock(L); | ||
674 | u = pushnewudata(L, 0); | ||
675 | u->uv.value = p; | ||
676 | lua_unlock(L); | 671 | lua_unlock(L); |
672 | return u + 1; | ||
677 | } | 673 | } |
678 | 674 | ||
679 | 675 | ||