diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-05 15:54:31 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-05 15:54:31 -0300 |
| commit | 237969724f54eeefee057ae382237c8db54af44e (patch) | |
| tree | fc4abd54f7cac0749023f1c021e7d86e3ee4f273 /lapi.c | |
| parent | f438d00ef31e3aea54023602f529b68834ffb80a (diff) | |
| download | lua-237969724f54eeefee057ae382237c8db54af44e.tar.gz lua-237969724f54eeefee057ae382237c8db54af44e.tar.bz2 lua-237969724f54eeefee057ae382237c8db54af44e.zip | |
support for `light' userdata + simpler support for `boxed' udata
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 | ||
