已完成当前这一轮。
这一轮继续沿着基础库主线补受保护调用,把 xpcall 接到了当前运行时和 VM 主线上。
这一轮主要参考这些官方文件:
references/lua-5.5.0/src/lbaselib.creferences/lua-5.5.0/src/ldo.creferences/lua-5.5.0/src/lvm.c- Lua 5.5 手册:https://www.lua.org/manual/5.5/
这一轮关注的核心点是:
luaB_xpcallfinishpcall- message handler 的错误收敛
本轮先落这几件事:
- 在
_ENV中预置xpcall - 让
xpcall复用当前统一 callable 调用入口 - 让
xpcall支持额外参数透传 - 让
xpcall在失败时通过 message handler 转换错误对象 - 让 message handler 自己报错时返回
"error in error handling" - 用真实 Lua 5.5 chunk 验证
xpcall的 Lua 层行为
这一轮没有再单独复制一套 xpcall 调用逻辑,而是把它和 pcall 一起收进统一辅助逻辑里。
这样做有两个好处:
- 成功路径和失败路径的返回协议不会分叉
- 后面继续补
xpcall相关细节时,不需要改两套代码
Lua 里 xpcall 的 message handler 不是普通的“失败回调”,而是拿一个错误对象,返回一个新的错误对象。
这一轮先把最关键的 Lua 层可见语义钉住:
- 成功时返回
true, ... - 失败时返回
false, handledError - handler 返回多个值时,只取第一个
这一轮专门把一个容易写偏的地方钉住了:
- 如果 message handler 自己再报错,最终结果不是它的新错误对象
- 当前对齐到官方 Lua 5.5 的 Lua 层结果:
false, "error in error handling"
这一轮新增支持:
_ENV.xpcallxpcall(f, msgh, ...)的额外参数透传xpcall成功时的多返回值透传xpcall失败时的 message handler 转换- message handler 自己报错时的固定错误结果
xpcall复用当前统一 callable 解析路径
当前这一轮还没有展开的是:
tonumber/tostring(已拆到docs/029-step-07-number-string-conversion.md)next/pairs/ipairs(已拆到docs/030-step-07-table-iteration-functions.md)- 更完整的 traceback 与调试信息
- 更系统的标准库模块拆分
这一轮新增 fixture:
test/fixtures/lua55/source/xpcall_chunk.luatest/fixtures/lua55/chunks/xpcall_chunk.luac
它覆盖:
xpcall的成功路径xpcall对额外参数的透传xpcall对 userdata__call路径的复用xpcall对assert(false, "...")错误对象的转换- message handler 自己报错时的固定结果
- 编写本轮文档
- 在
_ENV中注册xpcall - 把
pcall/xpcall收到统一辅助逻辑中 - 为
xpcall增加 message handler 处理 - 为 message handler 自身报错增加固定收敛结果
- 新增对应运行时测试
- 新增对应真实 fixture
- 新增对应 VM 测试
本轮完成后,应满足:
- Lua 层可以直接调用
xpcall xpcall在真实 Lua 5.5 chunk 中可用xpcall可以复用当前普通函数和最小__call路径- message handler 的成功与失败结果都已经被测试钉住
接下来继续往下补:
tonumber/tostringnext/pairs/ipairs- 更完整的错误处理与 traceback
- 更系统的标准库模块拆分