aboutsummaryrefslogtreecommitdiff
path: root/lopcodes.h
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-03-19 10:53:18 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-03-19 10:53:18 -0300
commit9b37a4695ebf50b37b5b4fb279ae948f23b5b6a0 (patch)
tree2a6b0f6c1c2eb962bb383175eb0a67ea81a4564d /lopcodes.h
parent1e0c73d5b643707335b06abd2546a83d9439d14c (diff)
downloadlua-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.h4
1 files changed, 0 insertions, 4 deletions
diff --git a/lopcodes.h b/lopcodes.h
index 3e100259..f867a01b 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -280,10 +280,6 @@ OP_RETURN,/* A B C return R(A), ... ,R(A+B-2) (see note) */
280OP_RETURN0,/* return */ 280OP_RETURN0,/* return */
281OP_RETURN1,/* A return R(A) */ 281OP_RETURN1,/* A return R(A) */
282 282
283OP_FORLOOP1,/* A Bx R(A)++;
284 if R(A) <= R(A+1) then { pc-=Bx; R(A+3)=R(A) } */
285OP_FORPREP1,/* A Bx R(A)--; pc+=Bx */
286
287OP_FORLOOP,/* A Bx R(A)+=R(A+2); 283OP_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) } */
289OP_FORPREP,/* A Bx R(A)-=R(A+2); pc+=Bx */ 285OP_FORPREP,/* A Bx R(A)-=R(A+2); pc+=Bx */