|
Hi, This doesn't seem to work in my code, but I wanted a sanity check - am I trying to do something illegal in Lua? I want to create a fulluserdata, but assign a Lua table to it as metatable (mt1), and in turn assign a C++ created metatable (mt2) to the first (mt1) Essentially, I want to be able to interact with a fulluserdata as if it were a table by treating mt1 as a proxy, and yet still inherit class methods from C functions in mt2. The problem is that the userdata does not seem to be looking up values in the metatable mt1 - can anyone see what I'm doing wrong? pseudocode: registerClass { luaL_newmetatable(L, classname) luaL_openlib(L, NULL, methods, 0) } newInstance { lua_newtable(L); // mt1 // create a test value lua_pushstring(L, "half") lua_pushnumber(L, 0.5) lua_settable(L, -3) // mt1.half = 0.5 void * udata = (void *)lua_newuserdata (L, sizeof(void *)); udata = new Object(); // duplicate userdata at index 1 for returning later lua_pushvalue(L, -1) lua_insert(L, 1) // udata.mt = mt1 lua_setmetatable(L, -2); // get class metatable (mt2) luaL_getmetatable(L, classname) lua_setmetatable(L, -2); // mt1.mt = mt2 // remove mt1 from stack lua_settop(L, 1) // return userdata to Lua return 1 } Lua: a = Class() -- calls newInstance in C print(type(a)) -- userdata print(a.half) -- should print 0.5 by finding "half" in the metatable mt1, but triggers an error: PANIC: unprotected error in call to Lua API: attempt to index global 'a' (a userdata value)) Why isn't my table mt1 acting as metatable to the lua object? Thanks in advance! |