Lua 如何将 __index 元方法中的 userdata 放入 C 闭包?

我有一个函数用来创建用户数据和一些小型的元表

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 函数,并将 userdata 放入其闭包(upvalue)中,但我不知道如何做到这一点。我可以放一个指向 userdata 的指针,但我认为这是一个不好的主意,因为 Lua 在垃圾回收时如果不知道哪些函数在使用 userdata,就会删除它。

点赞
用户10922731
用户10922731

需要从函数__index的堆栈中删除第二个参数,然后将其重新打开以关闭堆栈中的一个元素,它将成为一个userdata。

```` 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); // 删除第二个参数__index lua_pushcclosure (L, test, 1); // 将堆栈中的1个元素推入堆栈 return 1; } ```

2020-07-16 09:29:59