diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-12-28 18:34:11 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-12-28 18:34:11 -0300 |
| commit | 314745ed8438d1276c6c928d5f9d4be018dfadb6 (patch) | |
| tree | 594b7e873f2c29113d95c75147ab10865cdd772c /testes | |
| parent | 0825cf237d9d3505155f8b40bcf83ea1b135e8da (diff) | |
| download | lua-github-314745ed8438d1276c6c928d5f9d4be018dfadb6.tar.gz | |
Avoid excessive name pollution in test files
Test files are more polite regarding the use of globals when locals
would do, and when globals are necessary deleting them after use.
Diffstat (limited to 'testes')
| -rw-r--r-- | testes/all.lua | 1 | ||||
| -rw-r--r-- | testes/api.lua | 112 | ||||
| -rw-r--r-- | testes/attrib.lua | 24 | ||||
| -rw-r--r-- | testes/big.lua | 2 | ||||
| -rw-r--r-- | testes/calls.lua | 44 | ||||
| -rw-r--r-- | testes/closure.lua | 6 | ||||
| -rw-r--r-- | testes/code.lua | 6 | ||||
| -rw-r--r-- | testes/constructs.lua | 36 | ||||
| -rw-r--r-- | testes/coroutine.lua | 56 | ||||
| -rw-r--r-- | testes/db.lua | 27 | ||||
| -rw-r--r-- | testes/errors.lua | 83 | ||||
| -rw-r--r-- | testes/events.lua | 3 | ||||
| -rw-r--r-- | testes/files.lua | 6 | ||||
| -rw-r--r-- | testes/gc.lua | 42 | ||||
| -rw-r--r-- | testes/literals.lua | 33 | ||||
| -rw-r--r-- | testes/locals.lua | 8 | ||||
| -rw-r--r-- | testes/main.lua | 4 | ||||
| -rw-r--r-- | testes/math.lua | 6 | ||||
| -rw-r--r-- | testes/nextvar.lua | 2 | ||||
| -rw-r--r-- | testes/pm.lua | 32 | ||||
| -rw-r--r-- | testes/sort.lua | 23 | ||||
| -rw-r--r-- | testes/strings.lua | 6 | ||||
| -rw-r--r-- | testes/tpack.lua | 2 | ||||
| -rw-r--r-- | testes/utf8.lua | 2 | ||||
| -rw-r--r-- | testes/vararg.lua | 18 | ||||
| -rw-r--r-- | testes/verybig.lua | 12 |
26 files changed, 335 insertions, 261 deletions
diff --git a/testes/all.lua b/testes/all.lua index a8e44024..5df0ff9b 100644 --- a/testes/all.lua +++ b/testes/all.lua @@ -163,6 +163,7 @@ f() dofile('db.lua') assert(dofile('calls.lua') == deep and deep) +_G.deep = nil olddofile('strings.lua') olddofile('literals.lua') dofile('tpack.lua') diff --git a/testes/api.lua b/testes/api.lua index bd85a923..752ff18f 100644 --- a/testes/api.lua +++ b/testes/api.lua @@ -14,7 +14,7 @@ local pack = table.pack -- standard error message for memory errors local MEMERRMSG = "not enough memory" -function tcheck (t1, t2) +local function tcheck (t1, t2) assert(t1.n == (t2.n or #t2) + 1) for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end end @@ -28,7 +28,7 @@ end print('testing C API') -a = T.testC("pushvalue R; return 1") +local a = T.testC("pushvalue R; return 1") assert(a == debug.getregistry()) @@ -43,10 +43,10 @@ a = T.d2s(12458954321123.0) assert(a == string.pack("d", 12458954321123.0)) assert(T.s2d(a) == 12458954321123.0) -a,b,c = T.testC("pushnum 1; pushnum 2; pushnum 3; return 2") +local a,b,c = T.testC("pushnum 1; pushnum 2; pushnum 3; return 2") assert(a == 2 and b == 3 and not c) -f = T.makeCfunc("pushnum 1; pushnum 2; pushnum 3; return 2") +local f = T.makeCfunc("pushnum 1; pushnum 2; pushnum 3; return 2") a,b,c = f() assert(a == 2 and b == 3 and not c) @@ -61,7 +61,7 @@ assert(a==false and b==true and c==false) a,b,c = T.testC("gettop; return 2", 10, 20, 30, 40) assert(a == 40 and b == 5 and not c) -t = pack(T.testC("settop 5; return *", 2, 3)) +local t = pack(T.testC("settop 5; return *", 2, 3)) tcheck(t, {n=4,2,3}) t = pack(T.testC("settop 0; settop 15; return 10", 3, 1, 23)) @@ -166,16 +166,17 @@ end -- testing globals -_G.a = 14; _G.b = "a31" +_G.AA = 14; _G.BB = "a31" local a = {T.testC[[ - getglobal a; - getglobal b; - getglobal b; - setglobal a; + getglobal AA; + getglobal BB; + getglobal BB; + setglobal AA; return * ]]} -assert(a[2] == 14 and a[3] == "a31" and a[4] == nil and _G.a == "a31") +assert(a[2] == 14 and a[3] == "a31" and a[4] == nil and _G.AA == "a31") +_G.AA, _G.BB = nil -- testing arith assert(T.testC("pushnum 10; pushnum 20; arith /; return 1") == 0.5) @@ -199,13 +200,14 @@ a,b,c = T.testC([[pushnum 1; pushstring 10; arith _; pushstring 5; return 3]]) assert(a == 1 and b == -10 and c == "5") -mt = {__add = function (a,b) return setmetatable({a[1] + b[1]}, mt) end, +local mt = { + __add = function (a,b) return setmetatable({a[1] + b[1]}, mt) end, __mod = function (a,b) return setmetatable({a[1] % b[1]}, mt) end, __unm = function (a) return setmetatable({a[1]* 2}, mt) end} a,b,c = setmetatable({4}, mt), setmetatable({8}, mt), setmetatable({-3}, mt) -x,y,z = T.testC("arith +; return 2", 10, a, b) +local x,y,z = T.testC("arith +; return 2", 10, a, b) assert(x == 10 and y[1] == 12 and z == nil) assert(T.testC("arith %; return 1", a, c)[1] == 4%-3) assert(T.testC("arith _; arith +; arith %; return 1", b, a, c)[1] == @@ -312,9 +314,9 @@ assert(T.testC("concat 1; return 1", "xuxu") == "xuxu") -- testing lua_is -function B(x) return x and 1 or 0 end +local function B (x) return x and 1 or 0 end -function count (x, n) +local function count (x, n) n = n or 2 local prog = [[ isnumber %d; @@ -345,7 +347,7 @@ assert(count(nil, 15) == 100) -- testing lua_to... -function to (s, x, n) +local function to (s, x, n) n = n or 2 return T.testC(string.format("%s %d; return 1", s, n), x) end @@ -486,11 +488,12 @@ a = T.testC([[ pushvalue 3; insert -2; pcall 1 1 0; pcall 0 0 0; return 1 -]], "x=150", function (a) assert(a==nil); return 3 end) +]], "XX=150", function (a) assert(a==nil); return 3 end) -assert(type(a) == 'string' and x == 150) +assert(type(a) == 'string' and XX == 150) +_G.XX = nil -function check3(p, ...) +local function check3(p, ...) local arg = {...} assert(#arg == 3) assert(string.find(arg[3], p)) @@ -500,7 +503,7 @@ check3("%.", T.testC("loadfile 2; return *", ".")) check3("xxxx", T.testC("loadfile 2; return *", "xxxx")) -- test errors in non protected threads -function checkerrnopro (code, msg) +local function checkerrnopro (code, msg) local th = coroutine.create(function () end) -- create new thread local stt, err = pcall(T.testC, th, code) -- run code there assert(not stt and string.find(err, msg)) @@ -510,8 +513,9 @@ if not _soft then collectgarbage("stop") -- avoid __gc with full stack checkerrnopro("pushnum 3; call 0 0", "attempt to call") print"testing stack overflow in unprotected thread" - function f () f() end - checkerrnopro("getglobal 'f'; call 0 0;", "stack overflow") + function F () F() end + checkerrnopro("getglobal 'F'; call 0 0;", "stack overflow") + F = nil collectgarbage("restart") end print"+" @@ -588,7 +592,7 @@ assert(a[a] == "x") b = setmetatable({p = a}, {}) getmetatable(b).__index = function (t, i) return t.p[i] end -k, x = T.testC("gettable 3, return 2", 4, b, 20, 35, "x") +local k, x = T.testC("gettable 3, return 2", 4, b, 20, 35, "x") assert(x == 15 and k == 35) k = T.testC("getfield 2 y, return 1", b) assert(k == 12) @@ -748,8 +752,8 @@ local i = T.ref{} T.unref(i) assert(T.ref{} == i) -Arr = {} -Lim = 100 +local Arr = {} +local Lim = 100 for i=1,Lim do -- lock many objects Arr[i] = T.ref({}) end @@ -761,7 +765,7 @@ for i=1,Lim do -- unlock all them T.unref(Arr[i]) end -function printlocks () +local function printlocks () local f = T.makeCfunc("gettable R; return 1") local n = f("n") print("n", n) @@ -793,8 +797,8 @@ assert(type(T.getref(a)) == 'table') -- colect in cl the `val' of all collected userdata -tt = {} -cl = {n=0} +local tt = {} +local cl = {n=0} A = nil; B = nil local F F = function (x) @@ -817,6 +821,7 @@ F = function (x) end tt.__gc = F + -- test whether udate collection frees memory in the right time do collectgarbage(); @@ -853,9 +858,9 @@ end collectgarbage("stop") -- create 3 userdatas with tag `tt' -a = T.newuserdata(0); debug.setmetatable(a, tt); na = T.udataval(a) -b = T.newuserdata(0); debug.setmetatable(b, tt); nb = T.udataval(b) -c = T.newuserdata(0); debug.setmetatable(c, tt); nc = T.udataval(c) +a = T.newuserdata(0); debug.setmetatable(a, tt); local na = T.udataval(a) +b = T.newuserdata(0); debug.setmetatable(b, tt); local nb = T.udataval(b) +c = T.newuserdata(0); debug.setmetatable(c, tt); local nc = T.udataval(c) -- create userdata without meta table x = T.newuserdata(4) @@ -866,9 +871,9 @@ checkerr("FILE%* expected, got userdata", io.input, x) assert(debug.getmetatable(x) == nil and debug.getmetatable(y) == nil) -d=T.ref(a); -e=T.ref(b); -f=T.ref(c); +local d = T.ref(a); +local e = T.ref(b); +local f = T.ref(c); t = {T.getref(d), T.getref(e), T.getref(f)} assert(t[1] == a and t[2] == b and t[3] == c) @@ -888,7 +893,7 @@ tt=nil -- frees tt for GC A = nil b = nil T.unref(d); -n5 = T.newuserdata(0) +local n5 = T.newuserdata(0) debug.setmetatable(n5, {__gc=F}) n5 = T.udataval(n5) collectgarbage() @@ -959,11 +964,11 @@ print'+' -- testing changing hooks during hooks -_G.t = {} +_G.TT = {} T.sethook([[ # set a line hook after 3 count hooks sethook 4 0 ' - getglobal t; + getglobal TT; pushvalue -3; append -2 pushvalue -2; append -2 ']], "c", 3) @@ -973,12 +978,13 @@ a = 1 -- count hook (set line hook) a = 1 -- line hook a = 1 -- line hook debug.sethook() -t = _G.t +local t = _G.TT assert(t[1] == "line") -line = t[2] +local line = t[2] assert(t[3] == "line" and t[4] == line + 1) assert(t[5] == "line" and t[6] == line + 2) assert(t[7] == nil) +_G.TT = nil ------------------------------------------------------------------------- @@ -1003,6 +1009,7 @@ do -- testing errors during GC collectgarbage("restart") warn("@on") end +_G.A = nil ------------------------------------------------------------------------- -- test for userdata vals do @@ -1032,8 +1039,8 @@ assert(a == 'alo' and b == '3') T.doremote(L1, "_ERRORMESSAGE = nil") -- error: `sin' is not defined -a, _, b = T.doremote(L1, "return sin(1)") -assert(a == nil and b == 2) -- 2 == run-time error +a, b, c = T.doremote(L1, "return sin(1)") +assert(a == nil and c == 2) -- 2 == run-time error -- error: syntax error a, b, c = T.doremote(L1, "return a+") @@ -1204,7 +1211,7 @@ T.alloccount() -- remove limit -- o that we get memory errors in all allocations of a given -- task, until there is enough memory to complete the task without -- errors. -function testbytes (s, f) +local function testbytes (s, f) collectgarbage() local M = T.totalmem() local oldM = M @@ -1229,7 +1236,7 @@ end -- task, until there is enough allocations to complete the task without -- errors. -function testalloc (s, f) +local function testalloc (s, f) collectgarbage() local M = 0 local a,b = nil @@ -1296,12 +1303,12 @@ end) -- testing threads -- get main thread from registry (at index LUA_RIDX_MAINTHREAD == 1) -mt = T.testC("rawgeti R 1; return 1") +local mt = T.testC("rawgeti R 1; return 1") assert(type(mt) == "thread" and coroutine.running() == mt) -function expand (n,s) +local function expand (n,s) if n==0 then return "" end local e = string.rep("=", n) return string.format("T.doonnewstack([%s[ %s;\n collectgarbage(); %s]%s])\n", @@ -1311,9 +1318,10 @@ end G=0; collectgarbage(); a =collectgarbage("count") load(expand(20,"G=G+1"))() assert(G==20); collectgarbage(); -- assert(gcinfo() <= a+1) +G = nil testamem("running code on new thread", function () - return T.doonnewstack("x=1") == 0 -- try to create thread + return T.doonnewstack("local x=1") == 0 -- try to create thread end) @@ -1327,13 +1335,13 @@ end) local testprog = [[ local function foo () return end local t = {"x"} -a = "aaa" -for i = 1, #t do a=a..t[i] end +AA = "aaa" +for i = 1, #t do AA = AA .. t[i] end return true ]] -- testing memory x dofile -_G.a = nil +_G.AA = nil local t =os.tmpname() local f = assert(io.open(t, "w")) f:write(testprog) @@ -1343,7 +1351,7 @@ testamem("dofile", function () return a and a() end) assert(os.remove(t)) -assert(_G.a == "aaax") +assert(_G.AA == "aaax") -- other generic tests @@ -1360,6 +1368,8 @@ testamem("dump/undump", function () return a and a() end) +_G.AA = nil + local t = os.tmpname() testamem("file creation", function () local f = assert(io.open(t, 'w')) @@ -1381,7 +1391,7 @@ testamem("constructors", function () end) local a = 1 -close = nil +local close = nil testamem("closure creation", function () function close (b) return function (x) return b + x end diff --git a/testes/attrib.lua b/testes/attrib.lua index 83821c06..458488a8 100644 --- a/testes/attrib.lua +++ b/testes/attrib.lua @@ -85,7 +85,7 @@ local DIR = "libs" .. dirsep -- prepend DIR to a name and correct directory separators local function D (x) - x = string.gsub(x, "/", dirsep) + local x = string.gsub(x, "/", dirsep) return DIR .. x end @@ -106,7 +106,7 @@ local function createfiles (files, preextras, posextras) end end -function removefiles (files) +local function removefiles (files) for n in pairs(files) do os.remove(D(n)) end @@ -154,10 +154,9 @@ local try = function (p, n, r, ext) assert(ext == x) end -a = require"names" +local a = require"names" assert(a[1] == "names" and a[2] == D"names.lua") -_G.a = nil local st, msg = pcall(require, "err") assert(not st and string.find(msg, "arithmetic") and B == 15) st, msg = pcall(require, "synerr") @@ -191,6 +190,7 @@ try("X", "XXxX", AA, "libs/XXxX") removefiles(files) +NAME, REQUIRED, AA, B = nil -- testing require of sub-packages @@ -223,7 +223,7 @@ assert(require"P1" == m and m.AA == 10) removefiles(files) - +AA = nil package.path = "" assert(not pcall(require, "file_does_not_exist")) @@ -305,6 +305,7 @@ else assert(_ENV.x == "lib1.sub" and _ENV.y == DC"lib1") assert(string.find(ext, "libs/lib1", 1, true)) assert(fs.id(45) == 45) + _ENV.x, _ENV.y = nil end _ENV = _G @@ -338,10 +339,10 @@ print("testing assignments, logical operators, and constructors") local res, res2 = 27 -a, b = 1, 2+3 +local a, b = 1, 2+3 assert(a==1 and b==5) a={} -function f() return 10, 11, 12 end +local function f() return 10, 11, 12 end a.x, b, a[1] = 1, 2, f() assert(a.x==1 and b==2 and a[1]==10) a[f()], b, a[f()+3] = f(), a, 'x' @@ -353,15 +354,15 @@ do local a,b,c a,b = 0, f(1) assert(a == 0 and b == 1) - A,b = 0, f(1) - assert(A == 0 and b == 1) + a,b = 0, f(1) + assert(a == 0 and b == 1) a,b,c = 0,5,f(4) assert(a==0 and b==5 and c==1) a,b,c = 0,5,f(0) assert(a==0 and b==5 and c==nil) end -a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6 +local a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6 assert(not a and b and c and d==6) d = 20 @@ -419,6 +420,7 @@ assert(not pcall(function () local a = {[nil] = 10} end)) assert(a[nil] == undef) a = nil +local a, b, c a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'} a, a.x, a.y = a, a[-3] assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y) @@ -455,7 +457,7 @@ while maxint ~= (maxint + 0.0) or (maxint - 1) ~= (maxint - 1.0) do maxint = maxint // 2 end -maxintF = maxint + 0.0 -- float version +local maxintF = maxint + 0.0 -- float version assert(maxintF == maxint and math.type(maxintF) == "float" and maxintF >= 2.0^14) diff --git a/testes/big.lua b/testes/big.lua index 39e293ef..46fd8466 100644 --- a/testes/big.lua +++ b/testes/big.lua @@ -32,7 +32,7 @@ setmetatable(env, { }) X = nil -co = coroutine.wrap(f) +local co = coroutine.wrap(f) assert(co() == 's') assert(co() == 'g') assert(co() == 'g') diff --git a/testes/calls.lua b/testes/calls.lua index ee8cce73..a1938584 100644 --- a/testes/calls.lua +++ b/testes/calls.lua @@ -16,7 +16,7 @@ assert(type(nil) == 'nil' and type(type) == 'function') assert(type(assert) == type(print)) -function f (x) return a:x (x) end +local function f (x) return a:x (x) end assert(type(f) == 'function') assert(not pcall(type)) @@ -33,10 +33,11 @@ do assert(fact(5) == 120) end assert(fact == false) +fact = nil -- testing declarations -a = {i = 10} -self = 20 +local a = {i = 10} +local self = 20 function a:x (x) return x+self.i end function a.y (x) return x+self end @@ -72,6 +73,8 @@ f(1,2, -- this one too 3,4) assert(t[1] == 1 and t[2] == 2 and t[3] == 3 and t[4] == 'a') +t = nil -- delete 't' + function fat(x) if x <= 1 then return 1 else return x*load("return fat(" .. x-1 .. ")", "")() @@ -80,26 +83,29 @@ end assert(load "load 'assert(fat(6)==720)' () ")() a = load('return fat(5), 3') -a,b = a() +local a,b = a() assert(a == 120 and b == 3) +fat = nil print('+') -function err_on_n (n) +local function err_on_n (n) if n==0 then error(); exit(1); else err_on_n (n-1); exit(1); end end do - function dummy (n) + local function dummy (n) if n > 0 then assert(not pcall(err_on_n, n)) dummy(n-1) end end + + dummy(10) end -dummy(10) +_G.deep = nil -- "declaration" (used by 'all.lua') function deep (n) if n>0 then deep(n-1) end @@ -209,7 +215,7 @@ assert(a == 23 and (function (x) return x*2 end)(20) == 40) -- testing closures -- fixed-point operator -Z = function (le) +local Z = function (le) local function a (f) return le(function (x) return f(f)(x) end) end @@ -219,14 +225,14 @@ Z = function (le) -- non-recursive factorial -F = function (f) +local F = function (f) return function (n) if n == 0 then return 1 else return n*f(n-1) end end end -fat = Z(F) +local fat = Z(F) assert(fat(0) == 1 and fat(4) == 24 and Z(F)(5)==5*Z(F)(4)) @@ -237,22 +243,21 @@ local function g (z) return f(z,z+1,z+2,z+3) end -f = g(10) +local f = g(10) assert(f(9, 16) == 10+11+12+13+10+9+16+10) -Z, F, f = nil print('+') -- testing multiple returns -function unlpack (t, i) +local function unlpack (t, i) i = i or 1 if (i <= #t) then return t[i], unlpack(t, i+1) end end -function equaltab (t1, t2) +local function equaltab (t1, t2) assert(#t1 == #t2) for i = 1, #t1 do assert(t1[i] == t2[i]) @@ -261,8 +266,8 @@ end local pack = function (...) return (table.pack(...)) end -function f() return 1,2,30,4 end -function ret2 (a,b) return a,b end +local function f() return 1,2,30,4 end +local function ret2 (a,b) return a,b end local a,b,c,d = unlpack{1,2,3} assert(a==1 and b==2 and c==3 and d==nil) @@ -291,7 +296,7 @@ table.sort({10,9,8,4,19,23,0,0}, function (a,b) return a<b end, "extra arg") local x = "-- a comment\0\0\0\n x = 10 + \n23; \ local a = function () x = 'hi' end; \ return '\0'" -function read1 (x) +local function read1 (x) local i = 0 return function () collectgarbage() @@ -300,7 +305,7 @@ function read1 (x) end end -function cannotload (msg, a,b) +local function cannotload (msg, a,b) assert(not a and string.find(b, msg)) end @@ -342,6 +347,7 @@ a = assert(load(read1(x), nil, "b")) assert(a() == 1 and _G.x == 1) cannotload("attempt to load a binary chunk", load(read1(x), nil, "t")) cannotload("attempt to load a binary chunk", load(x, nil, "t")) +_G.x = nil assert(not pcall(string.dump, print)) -- no dump of C functions @@ -366,7 +372,7 @@ debug.setupvalue(x, 2, _G) assert(x() == 123) assert(assert(load("return XX + ...", nil, nil, {XX = 13}))(4) == 17) - +XX = nil -- test generic load with nested functions x = [[ diff --git a/testes/closure.lua b/testes/closure.lua index c2453677..ea038e82 100644 --- a/testes/closure.lua +++ b/testes/closure.lua @@ -4,7 +4,7 @@ print "testing closures" local A,B = 0,{g=10} -function f(x) +local function f(x) local a = {} for i=1,1000 do local y = 0 @@ -89,6 +89,7 @@ assert(r == "a" and s == "b") -- testing closures with 'for' control variable x break +local f for i=1,3 do f = function () return i end break @@ -139,7 +140,7 @@ assert(b('get') == 'xuxu') b('set', 10); assert(b('get') == 14) -local w +local y, w -- testing multi-level closure function f(x) return function (y) @@ -230,6 +231,7 @@ t() -- test for debug manipulation of upvalues local debug = require'debug' +local foo1, foo2, foo3 do local a , b, c = 3, 5, 7 foo1 = function () return a+b end; diff --git a/testes/code.lua b/testes/code.lua index 543743fc..bd4b10d0 100644 --- a/testes/code.lua +++ b/testes/code.lua @@ -86,7 +86,7 @@ checkKlist(foo, {1, 1.0, 2, 2.0, 0, 0.0}) -- testing opcodes -- check that 'f' opcodes match '...' -function check (f, ...) +local function check (f, ...) local arg = {...} local c = T.listcode(f) for i=1, #arg do @@ -99,7 +99,7 @@ end -- check that 'f' opcodes match '...' and that 'f(p) == r'. -function checkR (f, p, r, ...) +local function checkR (f, p, r, ...) local r1 = f(p) assert(r == r1 and math.type(r) == math.type(r1)) check(f, ...) @@ -107,7 +107,7 @@ end -- check that 'a' and 'b' has the same opcodes -function checkequal (a, b) +local function checkequal (a, b) a = T.listcode(a) b = T.listcode(b) assert(#a == #b) diff --git a/testes/constructs.lua b/testes/constructs.lua index 0d9ec92d..6ac68166 100644 --- a/testes/constructs.lua +++ b/testes/constructs.lua @@ -11,6 +11,7 @@ local function checkload (s, msg) end -- testing semicollons +local a do ;;; end ; do ; a = 3; assert(a == 3) end; ; @@ -49,10 +50,10 @@ assert((((nil and true) or false) and true) == false) local a,b = 1,nil; assert(-(1 or 2) == -1 and (1 and 2)+(-1.25 or -4) == 0.75); -x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x); +local x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x); x = (((2<3) or 1) == true and (2<3 and 4) == 4); assert(x); -x,y=1,2; +local x, y = 1, 2; assert((x>y) and x or y == 2); x,y=2,1; assert((x>y) and x or y == 2); @@ -77,13 +78,13 @@ do -- testing operators with diffent kinds of constants local gab = f(o1, o2) _ENV.XX = o1 - code = string.format("return XX %s %s", op, o2) - res = assert(load(code))() + local code = string.format("return XX %s %s", op, o2) + local res = assert(load(code))() assert(res == gab) _ENV.XX = o2 - local code = string.format("return (%s) %s XX", o1, op) - local res = assert(load(code))() + code = string.format("return (%s) %s XX", o1, op) + res = assert(load(code))() assert(res == gab) code = string.format("return (%s) %s %s", o1, op, o2) @@ -92,6 +93,7 @@ do -- testing operators with diffent kinds of constants end end end + _ENV.XX = nil end @@ -100,7 +102,7 @@ repeat until 1; repeat until true; while false do end; while nil do end; do -- test old bug (first name could not be an `upvalue') - local a; function f(x) x={a=1}; x={x=1}; x={G=1} end + local a; local function f(x) x={a=1}; x={x=1}; x={G=1} end end @@ -128,7 +130,7 @@ do -- bug since 5.4.0 end -function f (i) +local function f (i) if type(i) ~= 'number' then return i,'jojo'; end; if i > 0 then return i, f(i-1); end; end @@ -154,10 +156,10 @@ end assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == nil) for i=1,1000 do break; end; -n=100; -i=3; -t = {}; -a=nil +local n=100; +local i=3; +local t = {}; +local a=nil while not a do a=0; for i=1,n do for i=i,1,-1 do a=a+1; t[i]=1; end; end; end @@ -200,14 +202,14 @@ a={y=1} x = {a.y} assert(x[1] == 1) -function f(i) +local function f (i) while 1 do if i>0 then i=i-1; else return; end; end; end; -function g(i) +local function g(i) while 1 do if i>0 then i=i-1 else return end @@ -272,7 +274,7 @@ function g (a,b,c,d,e) if not (a>=b or c or d and e or nil) then return 0; else return 1; end; end -function h (a,b,c,d,e) +local function h (a,b,c,d,e) while (a>=b or c or (d and e) or nil) do return 1; end; return 0; end; @@ -300,7 +302,7 @@ do assert(a==2) end -function F(a) +local function F (a) assert(debug.getinfo(1, "n").name == 'F') return a,2,3 end @@ -393,6 +395,8 @@ for n = 1, level do if i % 60000 == 0 then print('+') end end end +IX = nil +_G.GLOB1 = nil ------------------------------------------------------------------ -- testing some syntax errors (chosen through 'gcov') diff --git a/testes/coroutine.lua b/testes/coroutine.lua index 15fccc30..de7e46fb 100644 --- a/testes/coroutine.lua +++ b/testes/coroutine.lua @@ -30,7 +30,8 @@ local function eqtab (t1, t2) end _G.x = nil -- declare x -function foo (a, ...) +_G.f = nil -- declare f +local function foo (a, ...) local x, y = coroutine.running() assert(x == f and y == false) -- next call should not corrupt coroutine (but must fail, @@ -67,10 +68,11 @@ assert(coroutine.status(f) == "dead") s, a = coroutine.resume(f, "xuxu") assert(not s and string.find(a, "dead") and coroutine.status(f) == "dead") +_G.f = nil -- yields in tail calls local function foo (i) return coroutine.yield(i) end -f = coroutine.wrap(function () +local f = coroutine.wrap(function () for i=1,10 do assert(foo(i) == _G.x) end @@ -79,8 +81,10 @@ end) for i=1,10 do _G.x = i; assert(f(i) == i) end _G.x = 'xuxu'; assert(f('xuxu') == 'a') +_G.x = nil + -- recursive -function pf (n, i) +local function pf (n, i) coroutine.yield(n) pf(n*i, i+1) end @@ -93,14 +97,14 @@ for i=1,10 do end -- sieve -function gen (n) +local function gen (n) return coroutine.wrap(function () for i=2,n do coroutine.yield(i) end end) end -function filter (p, g) +local function filter (p, g) return coroutine.wrap(function () while 1 do local n = g() @@ -221,14 +225,14 @@ do -- <close> versus pcall in coroutines local X = false local Y = false - function foo () + local function foo () local x <close> = func2close(function (self, err) Y = debug.getinfo(2) X = err end) error(43) end - co = coroutine.create(function () return pcall(foo) end) + local co = coroutine.create(function () return pcall(foo) end) local st1, st2, err = coroutine.resume(co) assert(st1 and not st2 and err == 43) assert(X == 43 and Y.what == "C") @@ -275,7 +279,7 @@ end -- yielding across C boundaries -co = coroutine.wrap(function() +local co = coroutine.wrap(function() assert(not pcall(table.sort,{1,2,3}, coroutine.yield)) assert(coroutine.isyieldable()) coroutine.yield(20) @@ -303,15 +307,15 @@ local r1, r2, v = f1(nil) assert(r1 and not r2 and v[1] == (10 + 1)*10/2) -function f (a, b) a = coroutine.yield(a); error{a + b} end -function g(x) return x[1]*2 end +local function f (a, b) a = coroutine.yield(a); error{a + b} end +local function g(x) return x[1]*2 end co = coroutine.wrap(function () coroutine.yield(xpcall(f, g, 10, 20)) end) assert(co() == 10) -r, msg = co(100) +local r, msg = co(100) assert(not r and msg == 240) @@ -373,9 +377,10 @@ assert(not a and b == foo and coroutine.status(x) == "dead") a,b = coroutine.resume(x) assert(not a and string.find(b, "dead") and coroutine.status(x) == "dead") +goo = nil -- co-routines x for loop -function all (a, n, k) +local function all (a, n, k) if k == 0 then coroutine.yield(a) else for i=1,n do @@ -415,7 +420,7 @@ assert(f() == 43 and f() == 53) -- old bug: attempt to resume itself -function co_func (current_co) +local function co_func (current_co) assert(coroutine.running() == current_co) assert(coroutine.resume(current_co) == false) coroutine.yield(10, 20) @@ -491,15 +496,16 @@ a = nil -- access to locals of erroneous coroutines local x = coroutine.create (function () local a = 10 - _G.f = function () a=a+1; return a end + _G.F = function () a=a+1; return a end error('x') end) assert(not coroutine.resume(x)) -- overwrite previous position of local `a' assert(not coroutine.resume(x, 1, 1, 1, 1, 1, 1, 1)) -assert(_G.f() == 11) -assert(_G.f() == 12) +assert(_G.F() == 11) +assert(_G.F() == 12) +_G.F = nil if not T then @@ -510,7 +516,7 @@ else local turn - function fact (t, x) + local function fact (t, x) assert(turn == t) if x == 0 then return 1 else return x*fact(t, x-1) @@ -579,6 +585,7 @@ else _G.X = nil; co(); assert(_G.X == line + 2 and _G.XX == nil) _G.X = nil; co(); assert(_G.X == line + 3 and _G.XX == 20) assert(co() == 10) + _G.X = nil -- testing yields in count hook co = coroutine.wrap(function () @@ -656,6 +663,8 @@ else assert(X == 'a a a' and Y == 'OK') + X, Y = nil + -- resuming running coroutine C = coroutine.create(function () @@ -701,7 +710,7 @@ else X = function (x) coroutine.yield(x, 'BB'); return 'CC' end; return 'ok']])) - t = table.pack(T.testC(state, [[ + local t = table.pack(T.testC(state, [[ rawgeti R 1 # get main thread pushstring 'XX' getglobal X # get function for body @@ -730,13 +739,13 @@ end -- leaving a pending coroutine open -_X = coroutine.wrap(function () +_G.TO_SURVIVE = coroutine.wrap(function () local a = 10 local x = function () a = a+1 end coroutine.yield() end) -_X() +_G.TO_SURVIVE() if not _soft then @@ -935,7 +944,7 @@ assert(run(function () do local _ENV = _ENV f = function () AAA = BBB + 1; return AAA end end -g = new(10); g.k.BBB = 10; +local g = new(10); g.k.BBB = 10; debug.setupvalue(f, 1, g) assert(run(f, {"idx", "nidx", "idx"}) == 11) assert(g.k.AAA == 11) @@ -1075,6 +1084,8 @@ assert(#a == 3 and a[1] == a[2] and a[2] == a[3] and a[3] == 34) -- testing yields with continuations +local y + co = coroutine.wrap(function (...) return T.testC([[ # initial function yieldk 1 2 @@ -1127,6 +1138,9 @@ assert(x == "YIELD" and y == 4) assert(not pcall(co)) -- coroutine should be dead +_G.ctx = nil +_G.status = nil + -- bug in nCcalls local co = coroutine.wrap(function () diff --git a/testes/db.lua b/testes/db.lua index f891e9b8..02b96aca 100644 --- a/testes/db.lua +++ b/testes/db.lua @@ -16,7 +16,7 @@ end assert(not debug.gethook()) local testline = 19 -- line where 'test' is defined -function test (s, l, p) -- this must be line 19 +local function test (s, l, p) -- this must be line 19 collectgarbage() -- avoid gc during trace local function f (event, line) assert(event == 'line') @@ -50,7 +50,7 @@ end -- test file and string names truncation -a = "function f () end" +local a = "function f () end" local function dostring (s, x) return load(s, x)() end dostring(a) assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a)) @@ -72,7 +72,8 @@ dostring(a, string.format("=%s", string.rep('x', 500))) assert(string.find(debug.getinfo(f).short_src, "^x*$")) dostring(a, "=") assert(debug.getinfo(f).short_src == "") -a = nil; f = nil; +_G.a = nil; _G.f = nil; +_G[string.rep("p", 400)] = nil repeat @@ -120,6 +121,7 @@ else end ]], {2,3,4,7}) + test([[ local function foo() end @@ -128,6 +130,7 @@ A = 1 A = 2 A = 3 ]], {2, 3, 2, 4, 5, 6}) +_G.A = nil test([[-- @@ -175,6 +178,8 @@ end test([[for i=1,4 do a=1 end]], {1,1,1,1}) +_G.a = nil + do -- testing line info/trace with large gaps in source @@ -194,6 +199,7 @@ do -- testing line info/trace with large gaps in source end end end +_G.a = nil do -- testing active lines @@ -287,7 +293,6 @@ foo(200, 3, 4) local a = {} for i = 1, (_soft and 100 or 1000) do a[i] = i end foo(table.unpack(a)) -a = nil @@ -307,13 +312,14 @@ do -- test hook presence in debug info debug.sethook() assert(count == 4) end +_ENV.a = nil -- hook table has weak keys assert(getmetatable(debug.getregistry()._HOOKKEY).__mode == 'k') -a = {}; L = nil +a = {}; local L = nil local glob = 1 local oldglob = glob debug.sethook(function (e,l) @@ -354,7 +360,7 @@ function foo() end; foo() -- set L -- check line counting inside strings and empty lines -_ = 'alo\ +local _ = 'alo\ alo' .. [[ ]] @@ -403,6 +409,7 @@ function g(a,b) return (a+1) + f() end assert(g(0,0) == 30) +_G.f, _G.g = nil debug.sethook(nil); assert(not debug.gethook()) @@ -446,7 +453,7 @@ local function collectlocals (level) end -X = nil +local X = nil a = {} function a:f (a, b, ...) local arg = {...}; local c = 13 end debug.sethook(function (e) @@ -469,6 +476,7 @@ a:f(1,2,3,4,5) assert(X.self == a and X.a == 1 and X.b == 2 and X.c == nil) assert(XX == 12) assert(not debug.gethook()) +_G.XX = nil -- testing access to local variables in return hook (bug in 5.2) @@ -593,6 +601,7 @@ end debug.sethook() +local g, g1 -- tests for tail calls local function f (x) @@ -638,7 +647,7 @@ h(false) debug.sethook() assert(b == 2) -- two tail calls -lim = _soft and 3000 or 30000 +local lim = _soft and 3000 or 30000 local function foo (x) if x==0 then assert(debug.getinfo(2).what == "main") @@ -940,7 +949,7 @@ end print("testing debug functions on chunk without debug info") -prog = [[-- program to be loaded without debug information (strip) +local prog = [[-- program to be loaded without debug information (strip) local debug = require'debug' local a = 12 -- a local variable diff --git a/testes/errors.lua b/testes/errors.lua index 55bdab82..cf0ab526 100644 --- a/testes/errors.lua +++ b/testes/errors.lua @@ -114,12 +114,14 @@ checkmessage("a = {} | 1", "bitwise operation") checkmessage("a = {} < 1", "attempt to compare") checkmessage("a = {} <= 1", "attempt to compare") -checkmessage("a=1; bbbb=2; a=math.sin(3)+bbbb(3)", "global 'bbbb'") -checkmessage("a={}; do local a=1 end a:bbbb(3)", "method 'bbbb'") +checkmessage("aaa=1; bbbb=2; aaa=math.sin(3)+bbbb(3)", "global 'bbbb'") +checkmessage("aaa={}; do local aaa=1 end aaa:bbbb(3)", "method 'bbbb'") checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'") -assert(not string.find(doit"a={13}; local bbbb=1; a[bbbb](3)", "'bbbb'")) -checkmessage("a={13}; local bbbb=1; a[bbbb](3)", "number") -checkmessage("a=(1)..{}", "a table value") +assert(not string.find(doit"aaa={13}; local bbbb=1; aaa[bbbb](3)", "'bbbb'")) +checkmessage("aaa={13}; local bbbb=1; aaa[bbbb](3)", "number") +checkmessage("aaa=(1)..{}", "a table value") + +_G.aaa, _G.bbbb = nil -- calls checkmessage("local a; a(13)", "local 'a'") @@ -134,12 +136,13 @@ checkmessage([[ -- tail calls checkmessage("local a={}; return a.bbbb(3)", "field 'bbbb'") -checkmessage("a={}; do local a=1 end; return a:bbbb(3)", "method 'bbbb'") +checkmessage("aaa={}; do local aaa=1 end; return aaa:bbbb(3)", "method 'bbbb'") + +checkmessage("aaa = #print", "length of a function value") +checkmessage("aaa = #3", "length of a number value") -checkmessage("a = #print", "length of a function value") -checkmessage("a = #3", "length of a number value") +_G.aaa = nil -aaa = nil checkmessage("aaa.bbb:ddd(9)", "global 'aaa'") checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'") checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'") @@ -152,15 +155,16 @@ checkmessage("local a,b,cc; (function () a.x = 1 end)()", "upvalue 'a'") checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'") -checkmessage("b=1; local aaa={}; x=aaa+b", "local 'aaa'") +checkmessage("BB=1; local aaa={}; x=aaa+BB", "local 'aaa'") checkmessage("aaa={}; x=3.3/aaa", "global 'aaa'") -checkmessage("aaa=2; b=nil;x=aaa*b", "global 'b'") +checkmessage("aaa=2; BB=nil;x=aaa*BB", "global 'BB'") checkmessage("aaa={}; x=-aaa", "global 'aaa'") -- short circuit -checkmessage("a=1; local a,bbbb=2,3; a = math.sin(1) and bbbb(3)", +checkmessage("aaa=1; local aaa,bbbb=2,3; aaa = math.sin(1) and bbbb(3)", "local 'bbbb'") -checkmessage("a=1; local a,bbbb=2,3; a = bbbb(1) or a(3)", "local 'bbbb'") +checkmessage("aaa=1; local aaa,bbbb=2,3; aaa = bbbb(1) or aaa(3)", + "local 'bbbb'") checkmessage("local a,b,c,f = 1,1,1; f((a and b) or c)", "local 'f'") checkmessage("local a,b,c = 1,1,1; ((a and b) or c)()", "call a number value") assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'")) @@ -187,8 +191,8 @@ checkmessage("return ~-3e40", "has no integer representation") checkmessage("return ~-3.009", "has no integer representation") checkmessage("return 3.009 & 1", "has no integer representation") checkmessage("return 34 >> {}", "table value") -checkmessage("a = 24 // 0", "divide by zero") -checkmessage("a = 1 % 0", "'n%0'") +checkmessage("aaa = 24 // 0", "divide by zero") +checkmessage("aaa = 1 % 0", "'n%0'") -- type error for an object which is neither in an upvalue nor a register. @@ -269,13 +273,13 @@ end -- tests for field accesses after RK limit local t = {} for i = 1, 1000 do - t[i] = "a = x" .. i + t[i] = "aaa = x" .. i end local s = table.concat(t, "; ") t = nil -checkmessage(s.."; a = bbb + 1", "global 'bbb'") -checkmessage("local _ENV=_ENV;"..s.."; a = bbb + 1", "global 'bbb'") -checkmessage(s.."; local t = {}; a = t.bbb + 1", "field 'bbb'") +checkmessage(s.."; aaa = bbb + 1", "global 'bbb'") +checkmessage("local _ENV=_ENV;"..s.."; aaa = bbb + 1", "global 'bbb'") +checkmessage(s.."; local t = {}; aaa = t.bbb + 1", "field 'bbb'") checkmessage(s.."; local t = {}; t:bbb()", "method 'bbb'") checkmessage([[aaa=9 @@ -324,14 +328,17 @@ main() ]], "global 'NoSuchName'") print'+' -a = {}; setmetatable(a, {__index = string}) -checkmessage("a:sub()", "bad self") +aaa = {}; setmetatable(aaa, {__index = string}) +checkmessage("aaa:sub()", "bad self") checkmessage("string.sub('a', {})", "#2") checkmessage("('a'):sub{}", "#1") checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'") checkmessage("string.gsub('s', 's', setmetatable)", "'setmetatable'") +_G.aaa = nil + + -- tests for errors in coroutines local function f (n) @@ -349,7 +356,7 @@ checkerr("yield across", f) -- testing size of 'source' info; size of buffer for that info is -- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'. -idsize = 60 - 1 +local idsize = 60 - 1 local function checksize (source) -- syntax error local _, msg = load("x", source) @@ -411,13 +418,14 @@ x local p = [[ function g() f() end - function f(x) error('a', X) end + function f(x) error('a', XX) end g() ]] -X=3;lineerror((p), 3) -X=0;lineerror((p), false) -X=1;lineerror((p), 2) -X=2;lineerror((p), 1) +XX=3;lineerror((p), 3) +XX=0;lineerror((p), false) +XX=1;lineerror((p), 2) +XX=2;lineerror((p), 1) +_G.XX, _G.g, _G.f = nil lineerror([[ @@ -449,11 +457,11 @@ if not _soft then -- several tests that exaust the Lua stack collectgarbage() print"testing stack overflow" - C = 0 + local C = 0 -- get line where stack overflow will happen local l = debug.getinfo(1, "l").currentline + 1 local function auxy () C=C+1; auxy() end -- produce a stack overflow - function y () + function YY () collectgarbage("stop") -- avoid running finalizers without stack space auxy() collectgarbage("restart") @@ -465,9 +473,11 @@ if not _soft then return (string.find(m, "stack overflow")) end -- repeated stack overflows (to check stack recovery) - assert(checkstackmessage(doit('y()'))) - assert(checkstackmessage(doit('y()'))) - assert(checkstackmessage(doit('y()'))) + assert(checkstackmessage(doit('YY()'))) + assert(checkstackmessage(doit('YY()'))) + assert(checkstackmessage(doit('YY()'))) + + _G.YY = nil -- error lines in stack overflow @@ -561,7 +571,7 @@ do end -- xpcall with arguments -a, b, c = xpcall(string.find, error, "alo", "al") +local a, b, c = xpcall(string.find, error, "alo", "al") assert(a and b == 1 and c == 2) a, b, c = xpcall(string.find, function (x) return {} end, true, "al") assert(not a and type(b) == "table" and c == nil) @@ -581,11 +591,12 @@ checksyntax("a\1a = 1", "", "<\\1>", 1) -- test 255 as first char in a chunk checksyntax("\255a = 1", "", "<\\255>", 1) -doit('I = load("a=9+"); a=3') -assert(a==3 and not I) +doit('I = load("a=9+"); aaa=3') +assert(_G.aaa==3 and not _G.I) +_G.I,_G.aaa = nil print('+') -lim = 1000 +local lim = 1000 if _soft then lim = 100 end for i=1,lim do doit('a = ') diff --git a/testes/events.lua b/testes/events.lua index 17a73664..8d8563b9 100644 --- a/testes/events.lua +++ b/testes/events.lua @@ -420,6 +420,9 @@ assert(i == 3 and x[1] == 3 and x[3] == 5) assert(_G.X == 20) +_G.X, _G.B = nil + + print'+' local _g = _G diff --git a/testes/files.lua b/testes/files.lua index 78f962e5..be00bf3f 100644 --- a/testes/files.lua +++ b/testes/files.lua @@ -507,15 +507,17 @@ load((io.lines(file, 1)))() assert(_G.X == 4) load((io.lines(file, 3)))() assert(_G.X == 8) +_G.X = nil print('+') local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'" io.output(file) -assert(io.write(string.format("x2 = %q\n-- comment without ending EOS", x1))) +assert(io.write(string.format("X2 = %q\n-- comment without ending EOS", x1))) io.close() assert(loadfile(file))() -assert(x1 == x2) +assert(x1 == _G.X2) +_G.X2 = nil print('+') assert(os.remove(file)) assert(not os.remove(file)) diff --git a/testes/gc.lua b/testes/gc.lua index 381c5548..03093e34 100644 --- a/testes/gc.lua +++ b/testes/gc.lua @@ -125,7 +125,7 @@ do end a:test() - + _G.temp = nil end @@ -134,7 +134,7 @@ do local f = function () end end print("functions with errors") -prog = [[ +local prog = [[ do a = 10; function foo(x,y) @@ -153,22 +153,25 @@ do end end end +rawset(_G, "a", nil) +_G.x = nil -foo = nil -print('long strings') -x = "01234567890123456789012345678901234567890123456789012345678901234567890123456789" -assert(string.len(x)==80) -s = '' -k = math.min(300, (math.maxinteger // 80) // 2) -for n = 1, k do s = s..x; j=tostring(n) end -assert(string.len(s) == k*80) -s = string.sub(s, 1, 10000) -s, i = string.gsub(s, '(%d%d%d%d)', '') -assert(i==10000 // 4) -s = nil -x = nil - -assert(_G["while"] == 234) +do + foo = nil + print('long strings') + local x = "01234567890123456789012345678901234567890123456789012345678901234567890123456789" + assert(string.len(x)==80) + local s = '' + local k = math.min(300, (math.maxinteger // 80) // 2) + for n = 1, k do s = s..x; local j=tostring(n) end + assert(string.len(s) == k*80) + s = string.sub(s, 1, 10000) + local s, i = string.gsub(s, '(%d%d%d%d)', '') + assert(i==10000 // 4) + + assert(_G["while"] == 234) + _G["while"] = nil +end -- @@ -227,8 +230,8 @@ end print("clearing tables") -lim = 15 -a = {} +local lim = 15 +local a = {} -- fill a with `collectable' indices for i=1,lim do a[{}] = i end b = {} @@ -552,6 +555,7 @@ do for i=1,1000 do _ENV.a = {} end -- no collection during the loop until gcinfo() > 2 * x collectgarbage"restart" + _ENV.a = nil end diff --git a/testes/literals.lua b/testes/literals.lua index d5a769ed..30ab9ab1 100644 --- a/testes/literals.lua +++ b/testes/literals.lua @@ -10,6 +10,7 @@ local function dostring (x) return assert(load(x), "")() end dostring("x \v\f = \t\r 'a\0a' \v\f\f") assert(x == 'a\0a' and string.len(x) == 3) +_G.x = nil -- escape sequences assert('\n\"\'\\' == [[ @@ -129,16 +130,16 @@ end -- long variable names -var1 = string.rep('a', 15000) .. '1' -var2 = string.rep('a', 15000) .. '2' -prog = string.format([[ +local var1 = string.rep('a', 15000) .. '1' +local var2 = string.rep('a', 15000) .. '2' +local prog = string.format([[ %s = 5 %s = %s + 1 return function () return %s - %s end ]], var1, var2, var1, var1, var2) local f = dostring(prog) assert(_G[var1] == 5 and _G[var2] == 6 and f() == -1) -var1, var2, f = nil +_G[var1], _G[var2] = nil print('+') -- escapes -- @@ -150,13 +151,13 @@ assert([[ $debug]] == "\n $debug") assert([[ [ ]] ~= [[ ] ]]) -- long strings -- -b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" +local b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" assert(string.len(b) == 960) prog = [=[ print('+') -a1 = [["this is a 'string' with several 'quotes'"]] -a2 = "'quotes'" +local a1 = [["this is a 'string' with several 'quotes'"]] +local a2 = "'quotes'" assert(string.find(a1, a2) == 34) print('+') @@ -164,12 +165,13 @@ print('+') a1 = [==[temp = [[an arbitrary value]]; ]==] assert(load(a1))() assert(temp == 'an arbitrary value') +_G.temp = nil -- long strings -- -b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" +local b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" assert(string.len(b) == 960) print('+') -a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789 +local a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789 00123456789012345678901234567890123456789123456789012345678901234567890123456789 00123456789012345678901234567890123456789123456789012345678901234567890123456789 00123456789012345678901234567890123456789123456789012345678901234567890123456789 @@ -199,13 +201,11 @@ x = 1 ]=] print('+') -x = nil +_G.x = nil dostring(prog) assert(x) +_G.x = nil -prog = nil -a = nil -b = nil do -- reuse of long strings @@ -234,8 +234,8 @@ end -- testing line ends prog = [[ -a = 1 -- a comment -b = 2 +local a = 1 -- a comment +local b = 2 x = [=[ @@ -252,10 +252,11 @@ for _, n in pairs{"\n", "\r", "\n\r", "\r\n"} do assert(dostring(prog) == nn) assert(_G.x == "hi\n" and _G.y == "\nhello\r\n\n") end +_G.x, _G.y = nil -- testing comments and strings with long brackets -a = [==[]=]==] +local a = [==[]=]==] assert(a == "]=") a = [==[[===[[=[]]=][====[]]===]===]==] diff --git a/testes/locals.lua b/testes/locals.lua index d50beaa5..2c48546d 100644 --- a/testes/locals.lua +++ b/testes/locals.lua @@ -37,7 +37,7 @@ end f = nil local f -x = 1 +local x = 1 a = nil load('local a = {}')() @@ -152,7 +152,7 @@ local dummy local _ENV = (function (...) return ... end)(_G, dummy) -- { do local _ENV = {assert=assert}; assert(true) end -mt = {_G = _G} +local mt = {_G = _G} local foo,x A = false -- "declare" A do local _ENV = mt @@ -174,6 +174,8 @@ do local _ENV = {assert=assert, A=10}; end assert(x==20) +A = nil + do -- constants local a<const>, b, c<const> = 10, 20, 30 @@ -711,7 +713,7 @@ if rawget(_G, "T") then collectgarbage(); collectgarbage() - m = T.totalmem() + local m = T.totalmem() collectgarbage("stop") -- error in the first buffer allocation diff --git a/testes/main.lua b/testes/main.lua index 9187420e..f59badcf 100644 --- a/testes/main.lua +++ b/testes/main.lua @@ -339,7 +339,7 @@ prepfile("a = [[b\nc\nd\ne]]\n=a") RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) checkprogout("b\nc\nd\ne\n\n") -prompt = "alo" +local prompt = "alo" prepfile[[ -- a = 2 ]] @@ -390,7 +390,7 @@ NoRun("error object is a table value", [[lua %s]], prog) -- chunk broken in many lines -s = [=[ -- +local s = [=[ -- function f ( x ) local a = [[ xuxu diff --git a/testes/math.lua b/testes/math.lua index 48c1efe1..0191f7dd 100644 --- a/testes/math.lua +++ b/testes/math.lua @@ -50,7 +50,7 @@ end local msgf2i = "number.* has no integer representation" -- float equality -function eq (a,b,limit) +local function eq (a,b,limit) if not limit then if floatbits >= 50 then limit = 1E-11 else limit = 1E-5 @@ -62,7 +62,7 @@ end -- equality with types -function eqT (a,b) +local function eqT (a,b) return a == b and math.type(a) == math.type(b) end @@ -83,7 +83,7 @@ end do local x = -1 local mz = 0/x -- minus zero - t = {[0] = 10, 20, 30, 40, 50} + local t = {[0] = 10, 20, 30, 40, 50} assert(t[mz] == t[0] and t[-0] == t[0]) end diff --git a/testes/nextvar.lua b/testes/nextvar.lua index 0874e5bb..02b7dea2 100644 --- a/testes/nextvar.lua +++ b/testes/nextvar.lua @@ -189,7 +189,7 @@ end -- size tests for vararg lim = 35 -function foo (n, ...) +local function foo (n, ...) local arg = {...} check(arg, n, 0) assert(select('#', ...) == n) diff --git a/testes/pm.lua b/testes/pm.lua index 94bb63ca..795596d4 100644 --- a/testes/pm.lua +++ b/testes/pm.lua @@ -9,12 +9,12 @@ local function checkerror (msg, f, ...) end -function f(s, p) +local function f (s, p) local i,e = string.find(s, p) if i then return string.sub(s, i, e) end end -a,b = string.find('', '') -- empty patterns are tricky +local a,b = string.find('', '') -- empty patterns are tricky assert(a == 1 and b == 0); a,b = string.find('alo', '') assert(a == 1 and b == 0) @@ -88,7 +88,7 @@ assert(f("alo alo", "%C+") == "alo alo") print('+') -function f1(s, p) +local function f1 (s, p) p = string.gsub(p, "%%([0-9])", function (s) return "%" .. (tonumber(s)+1) end) @@ -113,7 +113,7 @@ local abc = string.char(range(0, 127)) .. string.char(range(128, 255)); assert(string.len(abc) == 256) -function strset (p) +local function strset (p) local res = {s=''} string.gsub(abc, p, function (c) res.s = res.s .. c end) return res.s @@ -147,7 +147,7 @@ assert(string.gsub('ülo ülo', 'ü', 'x') == 'xlo xlo') assert(string.gsub('alo úlo ', ' +$', '') == 'alo úlo') -- trim assert(string.gsub(' alo alo ', '^%s*(.-)%s*$', '%1') == 'alo alo') -- double trim assert(string.gsub('alo alo \n 123\n ', '%s+', ' ') == 'alo alo 123 ') -t = "abç d" +local t = "abç d" a, b = string.gsub(t, '(.)', '%1@') assert('@'..a == string.gsub(t, '', '@') and b == 5) a, b = string.gsub('abçd', '(.)', '%0@', 2) @@ -184,6 +184,7 @@ do local function setglobal (n,v) rawset(_G, n, v) end string.gsub("a=roberto,roberto=a", "(%w+)=(%w%w*)", setglobal) assert(_G.a=="roberto" and _G.roberto=="a") + _G.a = nil; _G.roberto = nil end function f(a,b) return string.gsub(a,'.',b) end @@ -195,20 +196,21 @@ assert(string.gsub("alo $a='x'$ novamente $return a$", "$([^$]*)%$", dostring) == "alo novamente x") -x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$", +local x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$", "$([^$]*)%$", dostring) assert(x == ' assim vai para ALO') - -t = {} -s = 'a alo jose joao' -r = string.gsub(s, '()(%w+)()', function (a,w,b) - assert(string.len(w) == b-a); - t[a] = b-a; - end) +_G.a, _G.x = nil + +local t = {} +local s = 'a alo jose joao' +local r = string.gsub(s, '()(%w+)()', function (a,w,b) + assert(string.len(w) == b-a); + t[a] = b-a; + end) assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4) -function isbalanced (s) +local function isbalanced (s) return not string.find(string.gsub(s, "%b()", ""), "[()]") end @@ -251,7 +253,7 @@ if not _soft then end -- recursive nest of gsubs -function rev (s) +local function rev (s) return string.gsub(s, "(.)(.+)", function (c,s1) return rev(s1)..c end) end diff --git a/testes/sort.lua b/testes/sort.lua index ef405d92..52919b8c 100644 --- a/testes/sort.lua +++ b/testes/sort.lua @@ -20,7 +20,7 @@ end checkerror("wrong number of arguments", table.insert, {}, 2, 3, 4) local x,y,z,a,n -a = {}; lim = _soft and 200 or 2000 +a = {}; local lim = _soft and 200 or 2000 for i=1, lim do a[i]=i end assert(select(lim, unpack(a)) == lim and select('#', unpack(a)) == lim) x = unpack(a) @@ -222,7 +222,7 @@ a = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", table.sort(a) check(a) -function perm (s, n) +local function perm (s, n) n = n or #s if n == 1 then local t = {unpack(s)} @@ -248,7 +248,7 @@ perm{1,2,3,3,5} perm{1,2,3,4,5,6} perm{2,2,3,3,5,6} -function timesort (a, n, func, msg, pre) +local function timesort (a, n, func, msg, pre) local x = os.clock() table.sort(a, func) x = (os.clock() - x) * 1000 @@ -257,7 +257,7 @@ function timesort (a, n, func, msg, pre) check(a, func) end -limit = 50000 +local limit = 50000 if _soft then limit = 5000 end a = {} @@ -274,7 +274,7 @@ for i=1,limit do a[i] = math.random() end -x = os.clock(); i=0 +local x = os.clock(); local i = 0 table.sort(a, function(x,y) i=i+1; return y<x end) x = (os.clock() - x) * 1000 print(string.format("Invert-sorting other %d elements in %.2f msec., with %i comparisons", @@ -289,18 +289,19 @@ timesort(a, limit, function(x,y) return nil end, "equal") for i,v in pairs(a) do assert(v == false) end -A = {"álo", "\0first :-)", "alo", "then this one", "45", "and a new"} -table.sort(A) -check(A) +AA = {"álo", "\0first :-)", "alo", "then this one", "45", "and a new"} +table.sort(AA) +check(AA) -table.sort(A, function (x, y) - load(string.format("A[%q] = ''", x), "")() +table.sort(AA, function (x, y) + load(string.format("AA[%q] = ''", x), "")() collectgarbage() return x<y end) +_G.AA = nil -tt = {__lt = function (a,b) return a.val < b.val end} +local tt = {__lt = function (a,b) return a.val < b.val end} a = {} for i=1,10 do a[i] = {val=math.random(100)}; setmetatable(a[i], tt); end table.sort(a) diff --git a/testes/strings.lua b/testes/strings.lua index 337c2937..b033c6ab 100644 --- a/testes/strings.lua +++ b/testes/strings.lua @@ -52,7 +52,7 @@ assert(("\000123456789"):sub(8) == "789") -- testing string.find assert(string.find("123456789", "345") == 3) -a,b = string.find("123456789", "345") +local a,b = string.find("123456789", "345") assert(string.sub("123456789", a, b) == "345") assert(string.find("1234567890123456789", "345", 3) == 3) assert(string.find("1234567890123456789", "345", 4) == 13) @@ -192,7 +192,7 @@ do -- tests for '%p' format end end -x = '"ílo"\n\\' +local x = '"ílo"\n\\' assert(string.format('%q%s', x, x) == '"\\"ílo\\"\\\n\\\\""ílo"\n\\') assert(string.format('%q', "\0") == [["\0"]]) assert(load(string.format('return %q', x))() == x) @@ -452,7 +452,7 @@ end do local f = string.gmatch("1 2 3 4 5", "%d+") assert(f() == "1") - co = coroutine.wrap(f) + local co = coroutine.wrap(f) assert(co() == "2") end diff --git a/testes/tpack.lua b/testes/tpack.lua index 2b9953f8..bfa63fc4 100644 --- a/testes/tpack.lua +++ b/testes/tpack.lua @@ -35,7 +35,7 @@ print("\talignment: " .. align) -- check errors in arguments -function checkerror (msg, f, ...) +local function checkerror (msg, f, ...) local status, err = pcall(f, ...) -- print(status, err, msg) assert(not status and string.find(err, msg)) diff --git a/testes/utf8.lua b/testes/utf8.lua index 7472cfd0..c5a9dd3f 100644 --- a/testes/utf8.lua +++ b/testes/utf8.lua @@ -230,7 +230,7 @@ do check(s, {0x10000, 0x1FFFFF}, true) end -x = "日本語a-4\0éó" +local x = "日本語a-4\0éó" check(x, {26085, 26412, 35486, 97, 45, 52, 0, 233, 243}) diff --git a/testes/vararg.lua b/testes/vararg.lua index 44848d25..1b025102 100644 --- a/testes/vararg.lua +++ b/testes/vararg.lua @@ -3,13 +3,13 @@ print('testing vararg') -function f(a, ...) +local function f (a, ...) local x = {n = select('#', ...), ...} for i = 1, x.n do assert(a[i] == x[i]) end return x.n end -function c12 (...) +local function c12 (...) assert(arg == _G.arg) -- no local 'arg' local x = {...}; x.n = #x local res = (x.n==2 and x[1] == 1 and x[2] == 2) @@ -17,7 +17,7 @@ function c12 (...) return res, 2 end -function vararg (...) return {n = select('#', ...), ...} end +local function vararg (...) return {n = select('#', ...), ...} end local call = function (f, args) return f(table.unpack(args, 1, args.n)) end @@ -29,7 +29,7 @@ assert(vararg().n == 0) assert(vararg(nil, nil).n == 2) assert(c12(1,2)==55) -a,b = assert(call(c12, {1,2})) +local a,b = assert(call(c12, {1,2})) assert(a == 55 and b == 2) a = call(c12, {1,2;n=2}) assert(a == 55 and b == 2) @@ -49,7 +49,7 @@ function t:f (...) local arg = {...}; return self[...]+#arg end assert(t:f(1,4) == 3 and t:f(2) == 11) print('+') -lim = 20 +local lim = 20 local i, a = 1, {} while i <= lim do a[i] = i+0.3; i=i+1 end @@ -59,7 +59,7 @@ function f(a, b, c, d, ...) more[lim-4] == lim+0.3 and not more[lim-3]) end -function g(a,b,c) +local function g (a,b,c) assert(a == 1.3 and b == 2.3 and c == 3.3) end @@ -76,7 +76,7 @@ print("+") -- new-style varargs -function oneless (a, ...) return ... end +local function oneless (a, ...) return ... end function f (n, a, ...) local b @@ -99,8 +99,8 @@ assert(a==nil and b==nil and c==nil and d==nil and e==nil) -- varargs for main chunks -f = load[[ return {...} ]] -x = f(2,3) +local f = load[[ return {...} ]] +local x = f(2,3) assert(x[1] == 2 and x[2] == 3 and x[3] == undef) diff --git a/testes/verybig.lua b/testes/verybig.lua index 8fb7b13e..250ea795 100644 --- a/testes/verybig.lua +++ b/testes/verybig.lua @@ -52,7 +52,7 @@ if _soft then return 10 end print "testing large programs (>64k)" -- template to create a very big test file -prog = [[$ +local prog = [[$ local a,b @@ -85,7 +85,7 @@ function b:xxx (a,b) return a+b end assert(b:xxx(10, 12) == 22) -- pushself with non-constant index b["xxx"] = undef -s = 0; n=0 +local s = 0; local n=0 for a,b in pairs(b) do s=s+b; n=n+1 end -- with 32-bit floats, exact value of 's' depends on summation order assert(81800000.0 < s and s < 81860000 and n == 70001) @@ -93,7 +93,7 @@ assert(81800000.0 < s and s < 81860000 and n == 70001) a = nil; b = nil print'+' -function f(x) b=x end +local function f(x) b=x end a = f{$3$} or 10 @@ -118,7 +118,7 @@ local function sig (x) return (x % 2 == 0) and '' or '-' end -F = { +local F = { function () -- $1$ for i=10,50009 do io.write('a', i, ' = ', sig(i), 5+((i-10)/2), ',\n') @@ -138,14 +138,14 @@ function () -- $3$ end, } -file = os.tmpname() +local file = os.tmpname() io.output(file) for s in string.gmatch(prog, "$([^$]+)") do local n = tonumber(s) if not n then io.write(s) else F[n]() end end io.close() -result = dofile(file) +local result = dofile(file) assert(os.remove(file)) print'OK' return result |
