diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-03-19 10:53:18 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-03-19 10:53:18 -0300 |
commit | 9b37a4695ebf50b37b5b4fb279ae948f23b5b6a0 (patch) | |
tree | 2a6b0f6c1c2eb962bb383175eb0a67ea81a4564d /lopcodes.h | |
parent | 1e0c73d5b643707335b06abd2546a83d9439d14c (diff) | |
download | lua-9b37a4695ebf50b37b5b4fb279ae948f23b5b6a0.tar.gz lua-9b37a4695ebf50b37b5b4fb279ae948f23b5b6a0.tar.bz2 lua-9b37a4695ebf50b37b5b4fb279ae948f23b5b6a0.zip |
New semantics for the integer 'for' loop
The numerical 'for' loop over integers now uses a precomputed counter
to control its number of iteractions. This change eliminates several
weird cases caused by overflows (wrap-around) in the control variable.
(It also ensures that every integer loop halts.)
Also, the special opcodes for the usual case of step==1 were removed.
(The new code is already somewhat complex for the usual case,
but efficient.)
Diffstat (limited to 'lopcodes.h')
-rw-r--r-- | lopcodes.h | 4 |
1 files changed, 0 insertions, 4 deletions
@@ -280,10 +280,6 @@ OP_RETURN,/* A B C return R(A), ... ,R(A+B-2) (see note) */ | |||
280 | OP_RETURN0,/* return */ | 280 | OP_RETURN0,/* return */ |
281 | OP_RETURN1,/* A return R(A) */ | 281 | OP_RETURN1,/* A return R(A) */ |
282 | 282 | ||
283 | OP_FORLOOP1,/* A Bx R(A)++; | ||
284 | if R(A) <= R(A+1) then { pc-=Bx; R(A+3)=R(A) } */ | ||
285 | OP_FORPREP1,/* A Bx R(A)--; pc+=Bx */ | ||
286 | |||
287 | OP_FORLOOP,/* A Bx R(A)+=R(A+2); | 283 | OP_FORLOOP,/* A Bx R(A)+=R(A+2); |
288 | if R(A) <?= R(A+1) then { pc-=Bx; R(A+3)=R(A) } */ | 284 | if R(A) <?= R(A+1) then { pc-=Bx; R(A+3)=R(A) } */ |
289 | OP_FORPREP,/* A Bx R(A)-=R(A+2); pc+=Bx */ | 285 | OP_FORPREP,/* A Bx R(A)-=R(A+2); pc+=Bx */ |