Lua 如何将用户数据从元表 __index 放入 C 闭包?
Lua how put userdata to C closure from metatable __index?
我有创建用户数据和小元表的功能
static int index_lua(lua_State *L){
uint32_t * x;
x = lua_touserdata(L, 1);
printf("Buff __index ADDR: %08X\r\n", x);
return 0;
}
static int gc_lua(lua_State *L){
printf("Buff GC!\r\n");
return 0;
}
static int create_buff(lua_State *L){
uint32_t * x;
x = (uint32_t *) lua_newuserdata(L, 512);
printf("BUff ADDR: %08X\r\n", x);
*x = 0;
lua_newtable(L);
lua_pushcfunction(L, index_lua);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, gc_lua);
lua_setfield(L, -2, "__gc");
lua_setmetatable(L, -2);
return 1;
}
我想在 __index (index_lua) 中创建新的 C 函数并将用户数据放入他的闭包(upvalue),但我无法理解它是如何做到的。我可以放置一个指向用户数据的指针。但我认为这是个坏主意,因为 Lua 如果他不知道在某些功能中使用什么用户数据,则可以在进行垃圾收集时删除用户数据。
需要从堆栈中删除函数 __index 的第二个参数,并且在关闭堆栈的一个元素后,它将是一个用户数据。
static int index_lua(lua_State *L){
uint32_t * x;
x = lua_touserdata(L, 1);
printf("Buff __index ADDR: %08X\r\n", x);
lua_pop(L,1); // Remove second param __index
lua_pushcclosure (L, test, 1); // put on stack 1 element of stack
return 1;
}
我有创建用户数据和小元表的功能
static int index_lua(lua_State *L){
uint32_t * x;
x = lua_touserdata(L, 1);
printf("Buff __index ADDR: %08X\r\n", x);
return 0;
}
static int gc_lua(lua_State *L){
printf("Buff GC!\r\n");
return 0;
}
static int create_buff(lua_State *L){
uint32_t * x;
x = (uint32_t *) lua_newuserdata(L, 512);
printf("BUff ADDR: %08X\r\n", x);
*x = 0;
lua_newtable(L);
lua_pushcfunction(L, index_lua);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, gc_lua);
lua_setfield(L, -2, "__gc");
lua_setmetatable(L, -2);
return 1;
}
我想在 __index (index_lua) 中创建新的 C 函数并将用户数据放入他的闭包(upvalue),但我无法理解它是如何做到的。我可以放置一个指向用户数据的指针。但我认为这是个坏主意,因为 Lua 如果他不知道在某些功能中使用什么用户数据,则可以在进行垃圾收集时删除用户数据。
需要从堆栈中删除函数 __index 的第二个参数,并且在关闭堆栈的一个元素后,它将是一个用户数据。
static int index_lua(lua_State *L){
uint32_t * x;
x = lua_touserdata(L, 1);
printf("Buff __index ADDR: %08X\r\n", x);
lua_pop(L,1); // Remove second param __index
lua_pushcclosure (L, test, 1); // put on stack 1 element of stack
return 1;
}