That is really interesting.  I've used metatables for extending LUA syntax to
C datatypes but I didn't realize you could attach garbage collector actions
to them.  This approach is quite interesting.  It doesn't directly solve my
problem in that it doesn't expose the C pointers stored in LUA data
structures to the gc in C.   Thus the C garbage collector will still see the
C objects stored in LUA as unreachable.  However what your solution does do
is to allow the LUA gc to automatically deallocate objects from C using say
the standard malloc and free approach.  That's pretty close to having a
garbage collector, though all the destructors will have to be written
explicitly and on the C side of things the C garbage collector will have to
be dropped or disabled.
Actually, I wasn't suggesting dropping the C garbage collector.  I
was suggesting making the Lua __gc metamethod call the C garbage
collectors  "release()" or whatever on the C pointer than exists
in the user type.  I don't think I can explain it very well but
hopefully you get the idea.
The reverse should also work if your C garbage collector has a hook
when items are collected.  You attach the C garbage collector's
equivalent to __gc to a Lua variable and have it release the Lua
objects as needed.
-- 
// Chris