void *LuaScript::registerCFunc(void *context, const char *name, void *func) { DECL_STATE(L, context); auto func_wrapper = [](lua_State *L) -> int { ScriptContext::CFunc func = (ScriptContext::CFunc)lua_touserdata(L, lua_upvalueindex(1)); int argc = lua_gettop(L); Vector<ScriptObject> args(argc); args.resize(argc); for(int i = argc; i; i--) { void *ref = OBJECT(luaL_ref(L, LUA_REGISTRYINDEX)); args[i-1] = ScriptObject(L, ref); } ScriptObject ret = func(args, kwargs_stub); if(!ret.isBound()) return 0; PUSH_REF(L, ret.object); return 1; }; lua_pushlightuserdata(L, func); lua_pushcclosure(L, func_wrapper, 1); if(name) { lua_pushvalue(L, -1); lua_setglobal(L, name); } return OBJECT(luaL_ref(L, LUA_REGISTRYINDEX)); }