class
MyClass
{
public
:
void
say()
{
print(
"Hello\r\n"
);
}
};
int
test(lua_State* l)
{
MyClass** c = (MyClass**)lua_newuserdata(l,
sizeof
(MyClass*));
*c =
new
MyClass();
// we manage this
luaL_setmetatable(l,
"MyClass"
);
//assign MyClass metatable
return
1;
}
void
l_registerClass()
{
lua_newtable(l);
int
methods = lua_gettop(l);
luaL_newmetatable(l,
"MyClass"
);
int
metatable = lua_gettop(l);
lua_pushvalue(l, methods);
lua_setglobal(l,
"MyClass"
);
lua_pushvalue(l, methods);
l_set(l, metatable,
"__metatable"
);
//set metatable __index
lua_pushvalue(l, methods);
l_set(l, metatable,
"__index"
);
//set metatable __gc
lua_pushcfunction(l, l_destructor);
l_set(l, metatable,
"__gc"
);
//set method table
lua_newtable(l);
// mt for method table
lua_pushcfunction(l, l_constructor);
lua_pushvalue(l, -1);
// dup new_T function
l_set(l, methods,
"new"
);
// add new_T to method table
l_set(l, -3,
"__call"
);
// mt.__call = new_T
lua_setmetatable(l, methods);
// set methods metatable
lua_pushstring(l,
"say"
);
lua_pushcclosure(l, l_proxy, 1);
lua_settable(l, methods);
lua_pop(l, 2);
}
int
l_proxy(lua_State* l)
{
int
i = (
int
)lua_tonumber(l, lua_upvalueindex(1));
lua_remove(l, 1);
// remove self so member function args start at index 1
//call real function
MyClass* obj = getInstance();
obj->say();
return
1;
}