Lua5.3 VM 分析(八)For 循环
Lua 支持两种 for 循环,一种是 C 语言系 的 数字循环,另外一种支持 迭代器。
stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end
for v = e1, e2, e3 do block end
Lua 手册中使用下列操作模拟。
do
local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
if not (var and limit and step) then error() end
var = var - step
while true do
var = var + step
if (step >= 0 and var > limit) or (step < 0 and var < limit) then
break
end
local v = var
block
end
end
为了更高效,Lua 的虚拟机提供了两个单独的指令操作提供Loop 支持。
在循环开始的时候, var 、limit 和 step 应该处于 ra 、ra + 1、ra + 2 位置。
用一条 OP_FORPREP 检查它们是否有效,然后立刻跳转到循环代码块尾部的 OP_FORLOOP 指令上,检查结束条件,OP_FORLOOP 在条件成立时,就会循环这个过程。
vm