title: Self referencing userdata and garbage collection
body: <p>Because my userdata objects reference themselves, I need to delete <strong>and</strong> nil a variable for the garbage collector to work.</p>
  
  <p>Lua code:</p>
  
  <pre><code>obj = object:new()
  -- 
  -- Some time later
  obj:delete()  -- Removes the self reference
  obj = nil     -- Ready for collection
  </code></pre>
  
  <p>C Code:</p>
  
  <pre><code>typedef struct {
      int self; // Reference to the object
      int callback; // Reference to a Lua function
      // Other members and function references removed
  } Object;
  
  // Called from Lua to create a new object
  static int object_new( lua_State *L ) {
      Object *obj = lua_newuserdata( L, sizeof( Object ) );
  
      // Create the 'self' reference, userdata is on the stack top
      obj-&gt;self = luaL_ref( L, LUA_REGISTRYINDEX );
  
      // Put the userdata back on the stack before returning
      lua_rawgeti( L, LUA_REGISTRYINDEX, obj-&gt;self );
  
      // The object pointer is also stored outside of Lua for processing in C
  
      return 1;
  }
  
  // Called by Lua to delete an object
  static int object_delete( lua_State *L ) {
      Object *obj = lua_touserdata( L, 1 );
  
      // Remove the objects self reference
      luaL_unref( L, LUA_REGISTRYINDEX, obj-&gt;self );
  
      return 0;
  }
  
  // Called from Lua to set a callback function
  static int object_set_callback( lua_State *L ) {
      Object *obj = lua_touserdata( L, 1 );
  
      // Unref an existing callbacks
      if ( obj-&gt;callback != 0 ) {
          luaL_unref( L, LUA_REGISTRYINDEX, obj-&gt;callback );
          obj-&gt;callback = 0;
      }
  
      // Set the new callback - function is on top of the stack
      obj-&gt;callback = luaL_ref( L, LUA_REGISTRYINDEX );
  }
  
  // Called from C to call a Lua function for the obj
  static void do_callback( Object *obj ) {
      // Push the Lua function onto the stack
      lua_rawgeti( L, LUA_REGISTRYINDEX, obj-&gt;callback );
  
      // Push the userdata onto the stack
      lua_rawgeti( L, LUA_REGISTRYINDEX, obj-&gt;self );
  
      // Call the function
      lua_call( L, 1, 0 );
  }
  </code></pre>
  
  <p>Is there some way I can set the object to nil in Lua, and have the delete() method called automatically? Alternatively, can the delete method nil all variables that reference the object? Can the self reference be made 'weak'?</p>
  
  <p>EDIT 1: I've included code to show why the object references itself; see the do_callback function. Each object is part of a tree-like structure, with the bulk of the processing done in C, but a user can set a custom Lua function that is called under certain conditions.</p>
  
  <p>EDIT 2: Another possible solution comes to mind; Instead of each obj keeping a reference to itself, can I lookup the object in the global index when I need to pass it to Lua, using its address as a key?</p>