| -- $Id: locals.lua,v 1.37 2016/11/07 13:11:28 roberto Exp $ |
| -- See Copyright Notice in file all.lua |
| |
| print('testing local variables and environments') |
| |
| local debug = require"debug" |
| |
| |
| -- bug in 5.1: |
| |
| local function f(x) x = nil; return x end |
| assert(f(10) == nil) |
| |
| local function f() local x; return x end |
| assert(f(10) == nil) |
| |
| local function f(x) x = nil; local y; return x, y end |
| assert(f(10) == nil and select(2, f(20)) == nil) |
| |
| do |
| local i = 10 |
| do local i = 100; assert(i==100) end |
| do local i = 1000; assert(i==1000) end |
| assert(i == 10) |
| if i ~= 10 then |
| local i = 20 |
| else |
| local i = 30 |
| assert(i == 30) |
| end |
| end |
| |
| |
| |
| f = nil |
| |
| local f |
| x = 1 |
| |
| a = nil |
| load('local a = {}')() |
| assert(a == nil) |
| |
| function f (a) |
| local _1, _2, _3, _4, _5 |
| local _6, _7, _8, _9, _10 |
| local x = 3 |
| local b = a |
| local c,d = a,b |
| if (d == b) then |
| local x = 'q' |
| x = b |
| assert(x == 2) |
| else |
| assert(nil) |
| end |
| assert(x == 3) |
| local f = 10 |
| end |
| |
| local b=10 |
| local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3 |
| |
| |
| assert(x == 1) |
| |
| f(2) |
| assert(type(f) == 'function') |
| |
| |
| local function getenv (f) |
| local a,b = debug.getupvalue(f, 1) |
| assert(a == '_ENV') |
| return b |
| end |
| |
| -- test for global table of loaded chunks |
| assert(getenv(load"a=3") == _G) |
| local c = {}; local f = load("a = 3", nil, nil, c) |
| assert(getenv(f) == c) |
| assert(c.a == nil) |
| f() |
| assert(c.a == 3) |
| |
| -- old test for limits for special instructions (now just a generic test) |
| do |
| local i = 2 |
| local p = 4 -- p == 2^i |
| repeat |
| for j=-3,3 do |
| assert(load(string.format([[local a=%s; |
| a=a+%s; |
| assert(a ==2^%s)]], j, p-j, i), '')) () |
| assert(load(string.format([[local a=%s; |
| a=a-%s; |
| assert(a==-2^%s)]], -j, p-j, i), '')) () |
| assert(load(string.format([[local a,b=0,%s; |
| a=b-%s; |
| assert(a==-2^%s)]], -j, p-j, i), '')) () |
| end |
| p = 2 * p; i = i + 1 |
| until p <= 0 |
| end |
| |
| print'+' |
| |
| |
| if rawget(_G, "querytab") then |
| -- testing clearing of dead elements from tables |
| collectgarbage("stop") -- stop GC |
| local a = {[{}] = 4, [3] = 0, alo = 1, |
| a1234567890123456789012345678901234567890 = 10} |
| |
| local t = querytab(a) |
| |
| for k,_ in pairs(a) do a[k] = nil end |
| collectgarbage() -- restore GC and collect dead fiels in `a' |
| for i=0,t-1 do |
| local k = querytab(a, i) |
| assert(k == nil or type(k) == 'number' or k == 'alo') |
| end |
| end |
| |
| |
| -- testing lexical environments |
| |
| assert(_ENV == _G) |
| |
| do |
| local dummy |
| local _ENV = (function (...) return ... end)(_G, dummy) -- { |
| |
| do local _ENV = {assert=assert}; assert(true) end |
| mt = {_G = _G} |
| local foo,x |
| A = false -- "declare" A |
| do local _ENV = mt |
| function foo (x) |
| A = x |
| do local _ENV = _G; A = 1000 end |
| return function (x) return A .. x end |
| end |
| end |
| assert(getenv(foo) == mt) |
| x = foo('hi'); assert(mt.A == 'hi' and A == 1000) |
| assert(x('*') == mt.A .. '*') |
| |
| do local _ENV = {assert=assert, A=10}; |
| do local _ENV = {assert=assert, A=20}; |
| assert(A==20);x=A |
| end |
| assert(A==10 and x==20) |
| end |
| assert(x==20) |
| |
| |
| print('OK') |
| |
| return 5,f |
| |
| end -- } |
| |