aboutsummaryrefslogtreecommitdiff
path: root/testes
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-10-29 14:26:48 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-10-29 14:26:48 -0300
commita006514ea138a29b6031058d9002b48a572b5dd6 (patch)
treeb289a8af0c0497f2555784a0cf666659ceab0236 /testes
parent6e9b719694bffb8de711f182d405ec37d32ae0b1 (diff)
downloadlua-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.lua19
-rw-r--r--testes/goto.lua3
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
300end, 300end,
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
333check(function (a, b, c, d, e) 333check(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,
342end, '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
345checkequal( 340checkequal(
346function (a) while a < 10 do a = a + 1 end end, 341function (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
16errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") 16errmsg([[ ::l1:: ::l1:: ]], "label 'l1'")
17errmsg([[ ::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)
68end 69end
69 70
70-- goto to correct label when nested
71do 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
74do 73do