gsl-shell.git - gsl-shell

index : gsl-shell.git
gsl-shell
summary refs log tree commit diff
path: root/object-refs.c
diff options
context:
space:
mode:
Diffstat (limited to 'object-refs.c')
-rw-r--r--object-refs.c 62
1 files changed, 55 insertions, 7 deletions
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);
}
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月16日 12:38:56 +0000

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