【问题标题】:Porting from Lua 5.1 to 5.2从 Lua 5.1 移植到 5.2
【发布时间】: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


【解决方案1】:

我相信我已经设法升级了它,所以我将在下面添加我所做的和转换的详细信息。我在 LUA 低级 API 中创建了一个 C 包装器来导出我需要的功能:

1a) 替换

lua_settable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible

1b) 有

lua_settablereg(luaState);

2a) 替换

lua_gettable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible

2b) 有

lua_gettablereg(luaState);

3a) 替换

lua_pushvalue(luaState, LUA_GLOBALSINDEX);

3b) 有

lua_pushglobaltablefunction(luaState)

4a) 替换

lua_replace(luaState, LUA_GLOBALSINDEX);

4b) 有

lua_popglobaltablefunction(luaState)

5a) 替换

luaL_ref(luaState, (int)LuaIndexes.LUA_REGISTRYINDEX); // also luaL_unref

5b) 有

luaL_refreg(luaState); // also luaL_unrefreg

6a) 替换

lua_rawgeti(luaState, LUA_REGISTRYINDEX, reference);

6b) 有

lua_rawgetireg(luaState, reference);

7a) 替换

lua_pcall(luaState, nArgs, nResults, errfunc);

7b) 有

lua_pcalla(luaState, nArgs, nResults, errfunc);

8a) 替换

lua_getfield(luaState, LUA_REGISTRYINDEX, meta);

8b) 有

lua_getfieldreg(luaState, string meta);

9a) 替换

lua_rawset(luaState, LUA_REGISTRYINDEX);

9b) 有

lua_rawsetreg(luaState);

定义如下所示:

__declspec(dllexport) void lua_pushglobaltablefunction(lua_State *L) 
{
   lua_pushglobaltable(L);
}

__declspec(dllexport) void lua_popglobaltablefunction(lua_State *L) 
{
   lua_rawseti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);
}

__declspec(dllexport) int luaL_regref(lua_State *L) 
{
   return luaL_ref(L, LUA_REGISTRYINDEX);
}

__declspec(dllexport) void luaL_unregref(lua_State *L, int reference)
{
   luaL_unref(L, LUA_REGISTRYINDEX, reference);
}

__declspec(dllexport) void lua_settablereg(lua_State *L)
{
   lua_settable(L, LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_gettablereg(lua_State *L)
{
   lua_gettable(L, LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_rawsetreg(lua_State *L)
{
   lua_rawset(L, LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_rawgetreg(lua_State *L)
{
   lua_rawget(L, LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_rawgetireg(lua_State *L, int reference)
{
   lua_rawgeti(L, LUA_REGISTRYINDEX, reference);
}

__declspec(dllexport) void lua_getfieldreg(lua_State *L,const char *fieldname)
{
   lua_getfield(L, LUA_REGISTRYINDEX, fieldname);
}

__declspec(dllexport) int luaL_loadbuffername(lua_State *L,const char *buff, int size,const char * name)
{
   return luaL_loadbuffer(L,buff,size,name);
}

__declspec(dllexport) double lua_tonum(lua_State *L, int index)
{
   return lua_tonumber(L, index);
}

__declspec(dllexport) int lua_pcalla(lua_State *L,int nArgs,int nResults,int errfunc)
{
   return lua_pcall(L,nArgs,nResults,errfunc);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2012-02-21
    • 2013-04-27
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2012-06-03
    相关资源
    最近更新 更多