From b55a4cf705a06ef2c9995da4d2784e8d5969ee3e Mon Sep 17 00:00:00 2001 From: francesco-ST Date: 2010年8月12日 11:51:29 +0200 Subject: added object index to manage both plot and windows Now both plot and windows gets an id which is used to manage userdata cross-references. --- object-refs.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 7 deletions(-) (limited to 'object-refs.c') diff --git a/object-refs.c b/object-refs.c index bb340a2e..f0965eee 100644 --- a/object-refs.c +++ b/object-refs.c @@ -23,24 +23,72 @@ object_ref_prepare (lua_State *L) void object_ref_add (lua_State *L, int key_index, int val_index) { - size_t n; + int ref; + bool add_table = false; lua_getfield (L, LUA_REGISTRYINDEX, object_ref_table_name); lua_pushvalue (L, key_index); - lua_pushvalue (L, key_index); - lua_rawget (L, -3); + lua_rawget (L, -2); if (lua_isnil (L, -1)) { lua_pop (L, 1); lua_newtable (L); + + lua_pushvalue (L, val_index); + ref = 1; + add_table = true; } + else + { + lua_pushvalue (L, val_index); + lua_pushvalue (L, val_index); + lua_rawget (L, -3); - n = lua_objlen (L, -1); + ref = lua_tointeger (L, -1) + 1; - lua_pushvalue (L, val_index); - lua_rawseti (L, -2, n + 1); + lua_pop (L, 1); + } + lua_pushinteger (L, ref); lua_rawset (L, -3); - lua_pop (L, 1); + + if (add_table) + { + lua_pushvalue (L, key_index); + lua_insert (L, -2); + lua_rawset (L, -3); + lua_pop (L, 1); + } + else + lua_pop (L, 2); +} + +void +object_ref_remove (lua_State *L, int key_index, int val_index) +{ + lua_getfield (L, LUA_REGISTRYINDEX, object_ref_table_name); + lua_pushvalue (L, key_index); + lua_rawget (L, -2); + + if (! lua_isnil (L, -1)) + { + int ref; + + lua_pushvalue (L, val_index); + lua_pushvalue (L, val_index); + lua_rawget (L, -3); + + ref = lua_tointeger (L, -1); + lua_pop (L, 1); + + if (ref <= 1) + lua_pushnil (L); + else + lua_pushinteger (L, ref - 1); + + lua_rawset (L, -3); + } + + lua_pop (L, 2); } -- cgit v1.2.3

AltStyle によって変換されたページ (->オリジナル) /