从Lua 5.1迁移到5.2

我在将一些旧的Lua 5.1代码移植到Lua 5.2时遇到了一些问题。我想使用原始的Lua 5.2 dll / lib,因此任何移植都需要使用Lua 5.2的现有API完成。为了使它有点复杂,我正在使用'DllImport'来调用一些Lua API调用。这意味着任何'#define'提供的快捷方式都将无法使用。例如使用'lua_pushglobaltable'将不可能。大部分更新都是因为'LUA_REGISTRYINDEX'不再可访问。

我目前拥有的是以下内容:

1a)替换

lua_pushstring(luaState,“tablename”);
lua_settable(luaState,LUA_REGISTRYINDEX); //LUA_REGISTRYINDEX不再可访问

1b)用以下内容替换

lua_setglobal(luaState,“tablename”);

2a)替换

lua_pushstring(luaState,“tablename”);
lua_gettable(luaState,LUA_REGISTRYINDEX); //LUA_REGISTRYINDEX不再可访问

2b)用以下内容替换

lua_getglobal(luaState,“tablename”);

3a)替换

lua_pushvalue(luaState,LUA_GLOBALSINDEX);

3b)用以下内容替换

//不确定,类似于lua_pushglobaltable(L)等价物

4a)替换

lua_replace(luaState,LUA_GLOBALSINDEX);

4b)用以下内容替换

//我甚至没有猜测

5a)替换

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

5b)用以下内容替换

luaL_ref(luaState,<一些任意常量>); //这可能是错误的

6a)替换

lua_rawgeti(luaState,LUA_REGISTRYINDEX,reference);

6b)用以下内容替换

lua_rawgeti(luaState,<相同的任意常量>,reference); //这可能是错误的

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);

现在一切都编译过了,但我得到了内存访问违规例外,这意味着我可能错误地替换了某些内容。任何帮助都将不胜感激。

点赞
用户95573
用户95573

我相信我已经成功升级了这个,所以我将在下面添加我所做的细节和转换。我创建了一个C的包装器到LUA底层的API来导出我所需的功能:

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);
}
2015-02-10 16:43:36