}
+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);
.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;
/** 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);