簡體   English   中英

從Lua 5.1移植到5.2

[英]Porting from Lua 5.1 to 5.2

我在將一些較舊的Lua 5.1代碼移植到Lua 5.2時遇到了一些問題。 我希望能夠使用庫存的Lua 5.2 dll / lib,因此任何移植都需要使用現有的Lua 5.2 API來完成。 為了使其更加復雜,我使用DllImport P /調用一些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較低級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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM