【发布时间】:2015-04-04 15:05:13
【问题描述】:
我在将一些较旧的 Lua 5.1 代码移植到 Lua 5.2 时遇到了一些问题。我希望能够使用现有的 Lua 5.2 dll/lib,因此任何移植都需要使用现有的 Lua 5.2 API 完成。为了让它更复杂一点,我使用DllImport 来 P/Invoke 一些 Lua API 调用。这意味着所提供的任何#define 快捷方式都将不起作用。例如使用lua_pushglobaltable 是不可能的。大多数更新都是必需的,因为无法再访问LUA_REGISTRYINDEX。
到目前为止,我有以下内容:
1a) 替换
lua_pushstring(luaState, "tablename");
lua_settable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible
1b) 有
lua_setglobal(luaState, "tablename");
2a) 替换
lua_pushstring(luaState, "tablename");
lua_gettable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible
2b) 有
lua_getglobal(luaState, "tablename");
3a) 替换
lua_pushvalue(luaState, LUA_GLOBALSINDEX);
3b) 有
// not sure, something equivalent to lua_pushglobaltable(L)
4a) 替换
lua_replace(luaState, LUA_GLOBALSINDEX);
4b) 有
// I dont even have a guess here
5a) 替换
luaL_ref(luaState, (int)LuaIndexes.LUA_REGISTRYINDEX); // also luaL_unref
5b) 有
luaL_ref(luaState, <some arbitrary constant>); // this is probably wrong
6a) 替换
lua_rawgeti(luaState, LUA_REGISTRYINDEX, reference);
6b) 有
lua_rawgeti(luaState, <same arbitrary constant>, reference); // this is probably wrong
7a) 替换
lua_pcall(IntPtr luaState, int nArgs, int nResults, int errfunc);
7b) 有
lua_pcallk(IntPtr luaState, int nArgs, int nResults, int errfunc, int ctx, [MarshalAs(UnmanagedType.FunctionPtr)]LuaCSFunction function);
lua_pcallk(luaState, nArgs, nResults, errfunc, 0, null);
8a) 替换
lua_getfield(luaState, LUA_REGISTRYINDEX, meta);
8b) 有
luaL_setmetatable(IntPtr luaState, string meta);
9a) 替换
lua_rawset(luaState, LUA_REGISTRYINDEX);
9b) 有
lua_settable(luaState, -3);
现在一切都编译了,但是我得到了内存访问冲突异常,这意味着我可能错误地替换了一些东西。任何帮助将不胜感激。
【问题讨论】:
-
注册表与全局表不一样。在 lua 5.1 中,全局表为
LUA_GLOBALSINDEX。 -
你看过Changes in the API吗?
-
@Etan - 我确实遇到了那个页面,但它没有提供翻译,只建议从注册表中获取全局环境。我很容易混淆注册表和全局表。
-
它确实明确表明你从另一个那里得到一个,所以虽然是的,有些混乱是可能的,但很明显它们是不一样的。此外,
LUA_REGISTRYINDEX还没有去任何地方,所以你不需要用其他东西替换它的问题。 -
用
set调用替换get调用也不是一个有意义的声明(项目11)和luaL_getmetatablestill exists in lua 5.2。
标签: c# c++ lua porting lua-5.2