Lua 跨越 C 调用边界

问题描述

我试图在调试钩子内调用 lambda,并在我的输出中得到这个错误。我想在处理了一定数量的指令后让步,并希望这是这样做的方式。

我正在使用一些 Python lua_yield 绑定编写此代码

ctypes

我认为这应该可行,因为我使用的是 LuaJIT 并且它有一个 fully resumable VM

yielding
b'test.lua:1: attempt to yield across C-call boundary'

解决方法

我首先必须使用 lua_newthread 推送一个新线程,然后调用 luaL_loadfile,而不是调用 lua_pcall,调用 lua_resume

我用 C 重写了这个,以检查是否存在从 Lua 到 Python 的堆栈展开问题。

void l_dbg_count(lua_State *L,lua_Debug *ar) {
    if(ar->event == LUA_HOOKCOUNT) {
        printf("yielding\n");
        lua_yield(L,0);
    }
}

...

int main(int argc,char **argv) {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    lua_sethook(L,l_dbg_count,LUA_MASKCOUNT,5);

    lua_State *L_t = lua_newthread(L);
    luaL_loadfile(L_t,"test.lua");
    int ret = lua_resume(L_t,0);
    while(true) {
        if(ret != 0 && ret != LUA_YIELD) {
            fprintf(stderr,"%s",lua_tostring(L_t,-1));
            break;
        } else if(ret == LUA_YIELD) {
            printf("resuming\n");
            ret = lua_resume(L_t,0);
        } else {
            break;
        }
    }

    lua_close(L);
    return EXIT_SUCCESS;
}

然而,这似乎使协程库无法正常工作,因此目前正在寻找可能的解决方案。