如何从lua_topointer访问lua的对象?

在 Lua 代码中:

Test = {}
function Test:new()
  local obj = {}
  setmetatable(obj, self)
  self.__index = self
  return obj
end
local a = Test:new()
a.ID = "abc123"
callCfunc(a)

在 C 代码中:

int callCfunc(lua_State* l)
{
  SetLuaState(l);
  void* lua_obj = lua_topointer(l, 1);            //我希望获取 Lua 的 a 变量
  processObj(lua_obj);
  ...
  return 0;
}

int processObj(void *lua_obj)
{
  lua_State* l = GetLuaState();
  lua_pushlightuserdata(l, lua_obj);              //访问 Lua 表对象
  int top = lua_gettop(l);
  lua_getfield(l, top, "ID");                     //错误:尝试在 userdata 值上索引
  std::string id = lua_tostring(l, -1);           //我希望获取值 "abc123"
  ...
  return 0;
}

我得到了 "ERROR: attempt to index a userdata value" 错误。

如何从 lua_topointer() 访问 Lua 的对象?

在 C 中存储 Lua 对象,然后从 C 中调用它。

点赞
用户1008957
用户1008957

你不应该使用 lua_topointer 来完成这个任务。实际上,lua_topointer 的唯一合理用途是用于调试目的(比如日志记录)。

由于 a 是一个 _table_,你需要使用 lua_gettable 来访问其中的一个字段,或者更简单地使用 lua_getfield。当然,你不能将 void* 指针传递给 processObj,但你可以使用堆栈索引来完成这个任务。

2013-01-09 09:33:17
用户1929432
用户1929432

你不应该使用 lua_topointer,因为你无法将其转换回 lua 对象,应该将你的对象存储在 registry 中,并且传递它的 registry index

int callCfunc(lua_State* L)
{
    lua_pushvalue(L, 1);//将第一个参数压入堆栈
    int r = luaL_ref(L, LUA_REGISTRYINDEX);//将对象引用存储在 registry 中 (并且将其从栈中弹出)
    processObj(r);
    luaL_unref(L, LUA_REGISTRYINDEX, r); // 从 registry 中移除对象引用
    ...

int processObj(int lua_obj_ref)
{
    lua_State* L = GetLuaState();
    lua_rawgeti(L, LUA_REGISTRYINDEX, lua_obj_ref);//从 registry 中检索你的对象 (并将其压入栈顶)
    ...
2013-01-09 09:39:28