diff --git a/src/lj_api.c b/src/lj_api.c index d17a5754d4..c1643ae05c 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -1144,8 +1144,19 @@ static TValue *cpcall(lua_State *L, lua_CFunction func, void *ud) return top-1; /* Now call the newly allocated C function. */ } -LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud) +static TValue *cpcall2(lua_State *L, lua_CFunction func, void *ud) { + GCfunc *fn = lj_func_newC(L, 0, getcurrenv(L)); + fn->c.f = func; + setfuncV(L, L->top++, fn); + if (LJ_FR2) setnilV(L->top++); + void **udp = (void **)lua_newuserdata(L, sizeof(void **)); + *udp = ud; + cframe_nres(L->cframe) = 1+0; /* Zero results. */ + return L->top-1; /* Now call the newly allocated C function. */ +} + +static int cpcall_help(lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cpcall) { global_State *g = G(L); uint8_t oldh = hook_save(g); int status; @@ -1155,6 +1166,16 @@ LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud) return status; } +LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud) +{ + return cpcall_help(L, func, ud, cpcall); +} + +LUA_API int lua_cpcall2(lua_State *L, lua_CFunction func, void *ud) +{ + return cpcall_help(L, func, ud, cpcall2); +} + LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field) { if (luaL_getmetafield(L, idx, field)) { @@ -1289,4 +1310,3 @@ LUA_API void lua_setallocf(lua_State *L, lua_Alloc f, void *ud) g->allocd = ud; g->allocf = f; } - diff --git a/src/lua.h b/src/lua.h index 850bd796ca..149008ab8f 100644 --- a/src/lua.h +++ b/src/lua.h @@ -202,6 +202,7 @@ LUA_API int (lua_setfenv) (lua_State *L, int idx); LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); +LUA_API int (lua_cpcall2) (lua_State *L, lua_CFunction func, void *ud); LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, const char *chunkname);