From ca6fe7449a74efde6f959605dbe77acf3e64ca0b Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 20 Feb 2018 13:52:50 -0300 Subject: userdata can have multiple user values --- ltests.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'ltests.c') diff --git a/ltests.c b/ltests.c index 24753d5f..97d1abd4 100644 --- a/ltests.c +++ b/ltests.c @@ -1,5 +1,5 @@ /* -** $Id: ltests.c,v 2.239 2018/01/09 11:24:12 roberto Exp roberto $ +** $Id: ltests.c,v 2.240 2018/01/28 15:13:26 roberto Exp roberto $ ** Internal Module for Debugging of the Lua Implementation ** See Copyright Notice in lua.h */ @@ -265,6 +265,15 @@ static void checktable (global_State *g, Table *h) { } +static void checkudata (global_State *g, Udata *u) { + int i; + GCObject *hgc = obj2gco(u); + checkobjref(g, hgc, u->metatable); + for (i = 0; i < u->nuvalue; i++) + checkvalref(g, hgc, &u->uv[i].uv); +} + + /* ** All marks are conditional because a GC may happen while the ** prototype is still being created @@ -287,7 +296,6 @@ static void checkproto (global_State *g, Proto *f) { } - static void checkCclosure (global_State *g, CClosure *cl) { GCObject *clgc = obj2gco(cl); int i; @@ -344,11 +352,7 @@ static void checkstack (global_State *g, lua_State *L1) { static void checkrefs (global_State *g, GCObject *o) { switch (o->tt) { case LUA_TUSERDATA: { - TValue uservalue; - Table *mt = gco2u(o)->metatable; - checkobjref(g, o, mt); - getuservalue(g->mainthread, gco2u(o), &uservalue); - checkvalref(g, o, &uservalue); + checkudata(g, gco2u(o)); break; } case LUA_TUPVAL: { @@ -728,7 +732,7 @@ static int gc_color (lua_State *L) { GCObject *obj = gcvalue(o); lua_pushstring(L, isdead(G(L), obj) ? "dead" : iswhite(obj) ? "white" : - isblack(obj) ? "black" : "grey"); + isblack(obj) ? "black" : "gray"); } return 1; } @@ -919,8 +923,9 @@ static int upvalue (lua_State *L) { static int newuserdata (lua_State *L) { - size_t size = cast_sizet(luaL_checkinteger(L, 1)); - char *p = cast_charp(lua_newuserdata(L, size)); + size_t size = cast_sizet(luaL_optinteger(L, 1, 0)); + int nuv = luaL_optinteger(L, 2, 0); + char *p = cast_charp(lua_newuserdatauv(L, size, nuv)); while (size--) *p++ = '\0'; return 1; } -- cgit v1.2.3-55-g6feb