author | francesco-ST <francesco.abbate@st.com> | 2010年08月12日 11:51:29 +0200 |
---|---|---|
committer | francesco-ST <francesco.abbate@st.com> | 2010年08月12日 11:51:29 +0200 |
commit | b55a4cf705a06ef2c9995da4d2784e8d5969ee3e (patch) | |
tree | cee3a5404dee2d8a74fb60c0d5daad1985f8b402 /object-refs.c | |
parent | 9529186aacd0d02d6b609cec247ab6b4610fd342 (diff) | |
download | gsl-shell-b55a4cf705a06ef2c9995da4d2784e8d5969ee3e.tar.gz |
-rw-r--r-- | object-refs.c | 62 |
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); } |