lua-utils: added ref reffing + simple class-checker macro.
authorKrisztian Litkey <kli@iki.fi>
Wed, 13 Nov 2013 23:18:25 +0000 (01:18 +0200)
committerKrisztian Litkey <kli@iki.fi>
Thu, 21 Nov 2013 15:48:40 +0000 (17:48 +0200)
Added mrp_lua_object_getref/putref for getting a private reference
from a reference owner by another object. Also added for simple
cases MRP_LUA_CLASS_CHECKER, a macro which automatically generates
a trivial minimalistic class checker (idx to class pointer) function..

src/core/lua-utils/object.c
src/core/lua-utils/object.h

index 4dd68b1..7d36ad3 100644 (file)
@@ -1146,6 +1146,24 @@ int mrp_lua_object_deref_value(void *data, lua_State *L, int ref, int pushnil)
 }
 
 
+int mrp_lua_object_getref(void *owner, void *data, lua_State *L, int ref)
+{
+    userdata_t *uo = (userdata_t *)owner - 1;
+    userdata_t *ud = (userdata_t *)data  - 1;
+
+    if (ref == LUA_NOREF || ref == LUA_REFNIL)
+        return ref;
+
+    lua_rawgeti(L, LUA_REGISTRYINDEX, uo->reftbl);
+    lua_rawgeti(L, LUA_REGISTRYINDEX, ud->reftbl);
+    lua_rawgeti(L, -2, ref);
+    ref = luaL_ref(L, -2);
+    lua_pop(L, 2);
+
+    return ref;
+}
+
+
 static void object_create_exttbl(userdata_t *u, lua_State *L)
 {
     lua_newtable(L);
index 9f5b43e..2787361 100644 (file)
@@ -437,6 +437,12 @@ struct mrp_lua_class_member_s {
             .type_name = #_type,                                        \
             .type_id = -1        },
 
+#define MRP_LUA_CLASS_CHECKER(_type, _prefix, _class)                  \
+    static _type *_prefix##_check(lua_State *L, int idx)               \
+    {                                                                  \
+        return (_type *)mrp_lua_check_object(L, _class, idx);          \
+    } struct _prefix##_kludge_for_trailing_semicolon
+
 
 typedef struct mrp_lua_classdef_s     mrp_lua_classdef_t;
 typedef enum   mrp_lua_event_type_e   mrp_lua_event_type_t;
@@ -499,6 +505,10 @@ void mrp_lua_object_unref_value(void *object, lua_State *L, int ref);
 /** Retrieve and push to the stack the value for the fiven reference. */
 int mrp_lua_object_deref_value(void *object, lua_State *L, int ref,
                                int pushnil);
+/** Get a private reference for the given reference owned by the given object. */
+int mrp_lua_object_getref(void *owner, void *object, lua_State *L, int ref);
+/** Decreate the reference count of the given object reference. */
+#define mrp_lua_object_putref(o, L, ref) mrp_lua_object_unref_value(o, L, ref)
 /** Set a user-specified field for an extensible object to the value at vidx. */
 int mrp_lua_object_setext(void *object, lua_State *L, const char *name,
                           int vidx, char *err, size_t esize);