aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-06-06 15:00:19 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-06-06 15:00:19 -0300
commitd5b83ead90fba27faa344c72406d85987d2460a4 (patch)
tree96d73c1b872b6b01a28c0586b871d37185034ba9 /lapi.c
parentda673d31aaa05e8dff60c0b601b9f15c4f9182a8 (diff)
downloadlua-d5b83ead90fba27faa344c72406d85987d2460a4.tar.gz
lua-d5b83ead90fba27faa344c72406d85987d2460a4.tar.bz2
lua-d5b83ead90fba27faa344c72406d85987d2460a4.zip
new implementation for userdatas, without `keys'
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/lapi.c b/lapi.c
index 36e0aef7..7f4c6e7f 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.141 2001/04/23 16:35:45 roberto Exp roberto $ 2** $Id: lapi.c,v 1.142 2001/06/05 18:17:01 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*/
@@ -284,8 +284,7 @@ LUA_API void *lua_touserdata (lua_State *L, int index) {
284 void *p; 284 void *p;
285 lua_lock(L); 285 lua_lock(L);
286 o = luaA_indexAcceptable(L, index); 286 o = luaA_indexAcceptable(L, index);
287 p = (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : 287 p = (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : uvalue(o)->value;
288 tsvalue(o)->u.d.value;
289 lua_unlock(L); 288 lua_unlock(L);
290 return p; 289 return p;
291} 290}
@@ -360,16 +359,6 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
360} 359}
361 360
362 361
363LUA_API int lua_pushuserdata (lua_State *L, void *u) {
364 int isnew;
365 lua_lock(L);
366 isnew = luaS_createudata(L, u, L->top);
367 api_incr_top(L);
368 lua_unlock(L);
369 return isnew;
370}
371
372
373 362
374/* 363/*
375** get functions (Lua -> stack) 364** get functions (Lua -> stack)
@@ -673,7 +662,7 @@ LUA_API void lua_settag (lua_State *L, int tag) {
673 hvalue(L->top-1)->htag = tag; 662 hvalue(L->top-1)->htag = tag;
674 break; 663 break;
675 case LUA_TUSERDATA: 664 case LUA_TUSERDATA:
676 tsvalue(L->top-1)->u.d.tag = tag; 665 uvalue(L->top-1)->tag = tag;
677 break; 666 break;
678 default: 667 default:
679 luaO_verror(L, l_s("cannot change the tag of a %.20s"), 668 luaO_verror(L, l_s("cannot change the tag of a %.20s"),
@@ -771,20 +760,34 @@ LUA_API void lua_concat (lua_State *L, int n) {
771} 760}
772 761
773 762
763static Udata *pushnewudata (lua_State *L, size_t size) {
764 Udata *u = luaS_newudata(L, size);
765 setuvalue(L->top, u);
766 api_incr_top(L);
767 return uvalue(L->top-1);
768}
769
770
774LUA_API void *lua_newuserdata (lua_State *L, size_t size) { 771LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
775 TString *ts; 772 Udata *u;
776 void *p; 773 void *p;
777 lua_lock(L); 774 lua_lock(L);
778 if (size == 0) size = 1; 775 u = pushnewudata(L, size);
779 ts = luaS_newudata(L, size, NULL); 776 p = u->value;
780 setuvalue(L->top, ts);
781 api_incr_top(L);
782 p = ts->u.d.value;
783 lua_unlock(L); 777 lua_unlock(L);
784 return p; 778 return p;
785} 779}
786 780
787 781
782LUA_API void lua_newuserdatabox (lua_State *L, void *p) {
783 Udata *u;
784 lua_lock(L);
785 u = pushnewudata(L, 0);
786 u->value = p;
787 lua_unlock(L);
788}
789
790
788LUA_API int lua_getweakmode (lua_State *L, int index) { 791LUA_API int lua_getweakmode (lua_State *L, int index) {
789 StkId t; 792 StkId t;
790 int mode; 793 int mode;
@@ -806,6 +809,7 @@ LUA_API void lua_setweakmode (lua_State *L, int mode) {
806 809
807 810
808 811
812#if 0
809/* 813/*
810** deprecated function 814** deprecated function
811*/ 815*/
@@ -819,3 +823,4 @@ LUA_API void lua_pushusertag (lua_State *L, void *u, int tag) {
819} 823}
820 } 824 }
821} 825}
826#endif