c # — портирование с Lua 5.1 на 5.2

У меня возникли проблемы с портированием более старого кода Lua 5.1 на Lua 5.2. Я хотел бы иметь возможность использовать стандартный Lua 5.2 dll / lib, поэтому любой перенос должен быть выполнен с использованием существующего API для Lua 5.2. Чтобы сделать это немного сложнее, я использую 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

1б) с

lua_setglobal(luaState, "tablename");

2a) Заменить

lua_pushstring(luaState, "tablename");
lua_gettable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible

2б) с

lua_getglobal(luaState, "tablename");

3a) Заменить

lua_pushvalue(luaState, LUA_GLOBALSINDEX);

3б) с

// not sure, something equivalent to lua_pushglobaltable(L)

4а) Заменить

lua_replace(luaState, LUA_GLOBALSINDEX);

4б) с

// I dont even have a guess here

5а) Заменить

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

5б) с

luaL_ref(luaState, <some arbitrary constant>); // this is probably wrong

6а) Заменить

lua_rawgeti(luaState, LUA_REGISTRYINDEX, reference);

6б) с

lua_rawgeti(luaState, <same arbitrary constant>, reference); // this is probably wrong

7a) Заменить

lua_pcall(IntPtr luaState, int nArgs, int nResults, int errfunc);

7б) С

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

8б) с

luaL_setmetatable(IntPtr luaState, string meta);

9а) Заменить

lua_rawset(luaState, LUA_REGISTRYINDEX);

9б) с

lua_settable(luaState, -3);

Прямо сейчас все компилируется, но я получаю исключения нарушения доступа к памяти, что означает, что я, вероятно, подставил что-то неправильно. Любая помощь будет оценена.

4

Решение

Я думаю, что мне удалось обновить это, поэтому я добавлю детали того, что я сделал ниже, и конверсию. Я создал оболочку C в API нижнего уровня LUA для экспорта необходимых мне функций:

1a) Заменено

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

1б) с

lua_settablereg(luaState);

2a) Заменено

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

2б) с

lua_gettablereg(luaState);

3a) Заменено

lua_pushvalue(luaState, LUA_GLOBALSINDEX);

3б) с

lua_pushglobaltablefunction(luaState)

4а) Заменено

lua_replace(luaState, LUA_GLOBALSINDEX);

4б) с

lua_popglobaltablefunction(luaState)

5а) Заменено

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

5б) с

luaL_refreg(luaState); // also luaL_unrefreg

6а) Заменено

lua_rawgeti(luaState, LUA_REGISTRYINDEX, reference);

6б) с

lua_rawgetireg(luaState, reference);

7a) Заменено

lua_pcall(luaState, nArgs, nResults, errfunc);

7б) С

lua_pcalla(luaState, nArgs, nResults, errfunc);

8a) Заменено

lua_getfield(luaState, LUA_REGISTRYINDEX, meta);

8б) с

lua_getfieldreg(luaState, string meta);

9а) Заменено

lua_rawset(luaState, LUA_REGISTRYINDEX);

9б) с

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

Другие решения


По вопросам рекламы [email protected]