从Lua 5.1迁移到5.2
2015-2-5 19:23:30
收藏:0
阅读:112
评论:1
我在将一些旧的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);
现在一切都编译过了,但我得到了内存访问违规例外,这意味着我可能错误地替换了某些内容。任何帮助都将不胜感激。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我相信我已经成功升级了这个,所以我将在下面添加我所做的细节和转换。我创建了一个C的包装器到LUA底层的API来导出我所需的功能:
1a) 替换为
lua_settable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible1b) 使用
2a) 替换为
lua_gettable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible2b) 使用
3a) 替换为
3b) 使用
4a) 替换为
4b) 使用
5a) 替换为
luaL_ref(luaState, (int)LuaIndexes.LUA_REGISTRYINDEX); // also luaL_unref5b) 使用
luaL_refreg(luaState); // also luaL_unrefreg6a) 替换为
6b) 使用
7a) 替换为
7b) 使用
8a) 替换为
8b) 使用
lua_getfieldreg(luaState, string meta);9a) 替换为
9b) 使用
定义如下:
__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); }