上一轮把 locals.lua 的缺口收敛到了:
debug.sethook/debug.gethook- return hook 的触发时机
__close回调在 hook 里的可见名字
这一轮的目标就是把 locals.lua 从 “__close vs. return hooks in Lua functions 失败” 推进到下一个真实缺口。
在 LuaThread 上增加了:
- 当前 hook function
- hook mask
- hook count
- hook 执行深度
这样 debug.sethook / debug.gethook 不再是空壳,而是有真实的线程级状态可以读写。
LuaState.Debug 现在支持:
debug.sethook(hook, mask, count)debug.sethook()/debug.sethook(nil)清空 hookdebug.gethook()返回function, mask, count- 可选的首参 thread 解析
这一轮只实现了当前 locals.lua 需要的 return-hook 路径,没有提前把 line/count/call 全部做完。
VM 现在会在两类路径上触发 return hook:
- Lua bytecode frame 在
TryCompleteFrame成功关闭资源之后、真正弹栈之前 - native closure 在执行结束、真正弹出 native frame 之前
这个顺序很关键,因为官方脚本依赖:
debug.sethook自己返回时先打到return sethook__close回调返回时再打到return close- 外层函数
foo的return foo必须发生在所有 close 完成之后
为了避免 hook 回调自己再触发 hook,线程上增加了 hook 执行深度计数。hook 正在运行时,新的 return hook 会被抑制。
这让 debug.getinfo(2)、debug.sethook(nil) 这类 hook 内部调用不会把事件序列打乱。
源码里的匿名关闭回调原本会退化成 function@line。为了对齐 locals.lua 的断言,VM 在调用 __close 时会为匿名 closure 建一个仅运行时使用的 close 名字视图。
因此,hook 里通过 debug.getinfo(2).name 观察关闭回调时,现在能拿到 close,不再是 function@14 这类编译器生成名。
本轮新增两组测试:
- 编译器集成测试:钉住
return sethook -> return close -> x -> return close -> return foo的顺序 - Runtime 单元测试:钉住
debug.sethook/debug.gethook的基础存取与清空
官方 compatibility 诊断也同步更新:locals.lua 已经不再停在 return hook,而是继续推进到了 coroutine 里的 to-be-closed/yield 组合语义。
locals.lua 现在已经通过了:
__close vs. return hooks in Lua functionsdebug.sethook/debug.gethook的基础 return-hook 路径
当前下一缺口已经推进到:
to-be-closed variables in coroutines- 更具体地说,是 close 回调里
coroutine.yield的暂停/恢复语义
这说明下一轮需要集中到 coroutine close continuation,而不是继续补普通 return hook。