Example #1
0
File: ffi.cpp Project: miviwi/DD
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));
}