diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-10-29 14:26:48 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-10-29 14:26:48 -0300 |
commit | a006514ea138a29b6031058d9002b48a572b5dd6 (patch) | |
tree | b289a8af0c0497f2555784a0cf666659ceab0236 /testes | |
parent | 6e9b719694bffb8de711f182d405ec37d32ae0b1 (diff) | |
download | lua-a006514ea138a29b6031058d9002b48a572b5dd6.tar.gz lua-a006514ea138a29b6031058d9002b48a572b5dd6.tar.bz2 lua-a006514ea138a29b6031058d9002b48a572b5dd6.zip |
Big revamp in the implmentation of labels/gotos
Added restriction that, when a label is created, there cannot be
another label with the same name visible. That allows backward goto's
to be resolved when they are read. Backward goto's get a close if
they jump out of the scope of some variable; labels get a close only
if previous goto to it jumps out of the scope of some upvalue.
Diffstat (limited to 'testes')
-rw-r--r-- | testes/code.lua | 19 | ||||
-rw-r--r-- | testes/goto.lua | 3 |
2 files changed, 8 insertions, 14 deletions
diff --git a/testes/code.lua b/testes/code.lua index ad484485..9b3f2b68 100644 --- a/testes/code.lua +++ b/testes/code.lua | |||
@@ -297,7 +297,7 @@ check(function () | |||
297 | b[a], a = c, b | 297 | b[a], a = c, b |
298 | a, b = c, a | 298 | a, b = c, a |
299 | a = a | 299 | a = a |
300 | end, | 300 | end, |
301 | 'LOADNIL', | 301 | 'LOADNIL', |
302 | 'MOVE', 'MOVE', 'SETTABLE', | 302 | 'MOVE', 'MOVE', 'SETTABLE', |
303 | 'MOVE', 'MOVE', 'MOVE', 'SETTABLE', | 303 | 'MOVE', 'MOVE', 'MOVE', 'SETTABLE', |
@@ -329,18 +329,13 @@ checkequal(function (l) local a; return 0 <= a and a <= l end, | |||
329 | function (l) local a; return not (not(a >= 0) or not(a <= l)) end) | 329 | function (l) local a; return not (not(a >= 0) or not(a <= l)) end) |
330 | 330 | ||
331 | 331 | ||
332 | -- if-goto optimizations | 332 | -- if-break optimizations |
333 | check(function (a, b, c, d, e) | 333 | check(function (a, b) |
334 | if a == b then goto l1; | 334 | while a do |
335 | elseif a == c then goto l2; | 335 | if b then break else a = a + 1 end |
336 | elseif a == d then goto l2; | ||
337 | else if a == e then goto l3; | ||
338 | else goto l3 | ||
339 | end | ||
340 | end | 336 | end |
341 | ::l1:: ::l2:: ::l3:: ::l4:: | 337 | end, |
342 | end, 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'JMP', | 338 | 'TEST', 'JMP', 'TEST', 'JMP', 'ADDI', 'JMP', 'RETURN0') |
343 | 'CLOSE', 'CLOSE', 'CLOSE', 'CLOSE', 'RETURN0') | ||
344 | 339 | ||
345 | checkequal( | 340 | checkequal( |
346 | function (a) while a < 10 do a = a + 1 end end, | 341 | function (a) while a < 10 do a = a + 1 end end, |
diff --git a/testes/goto.lua b/testes/goto.lua index 238bc04a..85038d02 100644 --- a/testes/goto.lua +++ b/testes/goto.lua | |||
@@ -14,6 +14,7 @@ errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'") | |||
14 | 14 | ||
15 | -- repeated label | 15 | -- repeated label |
16 | errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") | 16 | errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") |
17 | errmsg([[ ::l1:: do ::l1:: end]], "label 'l1'") | ||
17 | 18 | ||
18 | 19 | ||
19 | -- undefined label | 20 | -- undefined label |
@@ -67,8 +68,6 @@ do | |||
67 | assert(assert(load(prog))() == 31) | 68 | assert(assert(load(prog))() == 31) |
68 | end | 69 | end |
69 | 70 | ||
70 | -- goto to correct label when nested | ||
71 | do goto l3; ::l3:: end -- does not loop jumping to previous label 'l3' | ||
72 | 71 | ||
73 | -- ok to jump over local dec. to end of block | 72 | -- ok to jump over local dec. to end of block |
74 | do | 73 | do |