已完成当前这一轮。
这一轮继续沿着 VM 主循环往前补,把 Lua 里最常见的一批循环执行路径接上了。
这次补上的重点有两类:
- 数值
for - 泛型
for
顺手还把 backward JMP 的执行语义修正了,这样 while 这类依赖回跳的控制流也能真正跑通。
这一轮主要参考这些官方文件:
references/lua-5.5.0/src/lvm.creferences/lua-5.5.0/src/lparser.creferences/lua-5.5.0/src/lopcodes.h- Lua 5.5 手册:https://www.lua.org/manual/5.5/
这一轮关注的核心指令是:
FORPREPFORLOOPTFORPREPTFORCALLTFORLOOPJMP
本轮先落这几件事:
- 在 VM 中支持整数数值
for - 在 VM 中支持浮点数值
for - 在 VM 中支持最小泛型
for - 修正
JMP的回跳路径 - 用真实 Lua 5.5 chunk 验证整数
for、浮点for、泛型for和while
Lua 的循环语义不止一类:
- 数值
for - 泛型
for whilerepeat
这一轮先把最常见、最能带动后续实现的一组路径接通:
FORPREP/FORLOOPTFORPREP/TFORCALL/TFORLOOP- backward
JMP
这样后面再补 repeat、迭代器细节和更完整的错误语义时,主干已经是通的。
官方 Lua 在数值 for 上分成两种执行模型:
- 整数循环
- 浮点循环
这一轮按这个结构拆开实现:
- 整数循环在寄存器里保存剩余计数、步长和控制变量
- 浮点循环在寄存器里保存 limit、step 和当前控制变量
这样和官方模型更接近,也方便后面继续细化边界行为。
这一轮的泛型 for 先支持最小但真实可跑的路径:
TFORPREP里的控制变量与关闭变量交换TFORCALL的迭代器调用TFORLOOP的nil终止判断
配合我们已经有的:
CALLRETURNCLOSE- to-be-closed 变量登记
已经足够跑通真实 Lua 5.5 编译产物里的最小泛型迭代闭环。
这一轮新增支持:
- 整数
FORPREP - 整数
FORLOOP - 浮点
FORPREP - 浮点
FORLOOP TFORPREPTFORCALLTFORLOOP- backward
JMP
当前这一轮还没有展开的是:
- 更完整的泛型
for关闭值场景 - 标准库迭代器配套能力
repeat/untilERRNNIL的完整错误信息路径
这一轮新增 fixture:
test/fixtures/lua55/source/for_integer_chunk.luatest/fixtures/lua55/chunks/for_integer_chunk.luactest/fixtures/lua55/source/for_float_chunk.luatest/fixtures/lua55/chunks/for_float_chunk.luactest/fixtures/lua55/source/for_generic_chunk.luatest/fixtures/lua55/chunks/for_generic_chunk.luactest/fixtures/lua55/source/while_chunk.luatest/fixtures/lua55/chunks/while_chunk.luac
它们分别覆盖:
- 整数数值
for - 浮点数值
for - 最小泛型
for - 依赖 backward
JMP的while
- 编写本轮文档
- 支持整数
FORPREP/FORLOOP - 支持浮点
FORPREP/FORLOOP - 支持
TFORPREP/TFORCALL/TFORLOOP - 修正 backward
JMP - 新增真实
for_integer_chunk.luac - 新增真实
for_float_chunk.luac - 新增真实
for_generic_chunk.luac - 新增真实
while_chunk.luac - 新增对应 VM 测试
本轮完成后,应满足:
- 整数数值
for可以执行 - 浮点数值
for可以执行 - 最小泛型
for可以执行 - backward
JMP可以执行
接下来继续往下补:
repeat/until- 更完整的迭代器与标准库配套
ERRNNIL的完整错误路径- 更一般的元方法分发