mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-19 16:42:48 +00:00
- 明确支持范围: doString/runScript(单次)/loadFunction/callFunction/IO重定向/typed - 明确不可实现: 管道模式与 load_lib 压栈(4.0 无 luaL_loadfile) - 关键 API 映射表(lua_call 即保护调用/lua_ref 替代 Registry/ pushboolean→pushnumber/_ERRORMESSAGE 全局取错误) - compat_40.h 骨架: 版本宏 LUA_VERSION_NUM=400 与 LUA_OK 定义
2.5 KiB
2.5 KiB
Lua 4.0 分支移植评估(ADAPTATION.md)
本分支已 vendor Lua 4.0.1 官方源码到
lib/lua/。 桥接层尚未适配——需要按本文档指引改造后方可有限使用。
支持范围
经过源码分析,Lua 4.0 可实现的有限支持:
| 功能 | 支持 | 说明 |
|---|---|---|
doString |
✅ | lua_dostring(L, s) 直接映射 |
runScript(单次) |
✅ | lua_dofile + lua_call 组合 |
loadFunction |
✅ | 文件名→lua_dofile(返回函数)→lua_ref 锁定 |
callFunction |
✅ | lua_getref→lua_call → lua_settop 取结果 |
unloadFunction |
✅ | lua_unref |
| I/O 重定向 | ✅ | Registry 存 iopath(同 5.1/5.2 方案) |
| typed interop | ✅ | 全部映射为 number(无 boolean 类型) |
| 管道模式 | ❌ | 4.0 无 luaL_loadfile,无法分离编译与执行 |
load_lib |
❌ | 同上,块压栈不可实现 |
关键 API 差异
| 5.x 函数 | 4.0 等价 | 备注 |
|---|---|---|
luaL_newstate() |
lua_open(stacksize) |
4.0 需指定栈大小(如 lua_open(1024)) |
luaL_openlibs() |
逐库 lua_*libopen |
逐个调用 lua_baselibopen/lua_iolibopen/... |
lua_pcall |
lua_call |
4.0 的 lua_call 是保护调用,返回 status |
luaL_loadfile |
不存在 | 无法预编译;管道模式不可实现 |
luaL_dostring |
lua_dostring(L, s) |
直接映射 |
| 错误信息 | _ERRORMESSAGE 全局 |
非栈顶,需取全局函数输出 |
LUA_REGISTRYINDEX |
lua_ref / lua_getref |
4.0 引用表机制不同 |
lua_pushboolean |
lua_pushnumber |
4.0 无 boolean 类型 |
lua_pushcfunction |
lua_pushcclosure(L, fn, 0) |
0 个闭包上值 |
luaL_ref/luaL_unref |
lua_ref/lua_unref |
4.0 的 lua_ref(L, 1) 锁定并返回 ref |
luaL_newmetatable |
无 | 需 lua_newtable + lua_settagmethod |
lua_pushlightuserdata |
lua_pushusertag |
需分配 tag |
估算工作量
- 桥接层 C++ 重写:~400 行
- 测试:GTest 中管道相关测试(
MultipleLoadUnload、管道链)无法运行 - 构建系统:CMakeLists 按 4.0 文件集重写(源码结构完全不同)
- 仓颉层:无需改动
结论
技术上可行但收益有限:
- 管道模式(项目核心特性)无法实现
- 无
luaL_loadfile导致load/runScript语义与 5.x 版本不同 - 4.0 发布于 2000 年,实际使用场景极少
- 建议仅在需要加载特定 Lua 4.0 遗留脚本时投入适配