github.com/xmx/lua@v0.0.0-20230324063450-8a298e091302/_lua5.1-tests/locals.lua (about)

     1  print('testing local variables plus some extra stuff')
     2  
     3  do
     4    local i = 10
     5    do local i = 100; assert(i==100) end
     6    do local i = 1000; assert(i==1000) end
     7    assert(i == 10)
     8    if i ~= 10 then
     9      local i = 20
    10    else
    11      local i = 30
    12      assert(i == 30)
    13    end
    14  end
    15  
    16  
    17  
    18  f = nil
    19  
    20  local f
    21  x = 1
    22  
    23  a = nil
    24  loadstring('local a = {}')()
    25  assert(type(a) ~= 'table')
    26  
    27  function f (a)
    28    local _1, _2, _3, _4, _5
    29    local _6, _7, _8, _9, _10
    30    local x = 3
    31    local b = a
    32    local c,d = a,b
    33    if (d == b) then
    34      local x = 'q'
    35      x = b
    36      assert(x == 2)
    37    else
    38      assert(nil)
    39    end
    40    assert(x == 3)
    41    local f = 10
    42  end
    43  
    44  local b=10
    45  local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3
    46  
    47  
    48  assert(x == 1)
    49  
    50  f(2)
    51  assert(type(f) == 'function')
    52  
    53  
    54  -- testing globals ;-)
    55  do
    56    local f = {}
    57    local _G = _G
    58    for i=1,10 do f[i] = function (x) A=A+1; return A, _G.getfenv(x) end end
    59    A=10; assert(f[1]() == 11)
    60    for i=1,10 do assert(setfenv(f[i], {A=i}) == f[i]) end
    61    assert(f[3]() == 4 and A == 11)
    62    local a,b = f[8](1)
    63    assert(b.A == 9)
    64    a,b = f[8](0)
    65    assert(b.A == 11)   -- `real' global
    66    local g
    67    local function f () assert(setfenv(2, {a='10'}) == g) end
    68    g = function () f(); _G.assert(_G.getfenv(1).a == '10') end
    69    g(); assert(getfenv(g).a == '10')
    70  end
    71  
    72  -- test for global table of loaded chunks
    73  local function foo (s)
    74    return loadstring(s)
    75  end
    76  
    77  assert(getfenv(foo("")) == _G)
    78  local a = {loadstring = loadstring} 
    79  setfenv(foo, a)
    80  assert(getfenv(foo("")) == _G)
    81  setfenv(0, a)  -- change global environment
    82  assert(getfenv(foo("")) == a)
    83  setfenv(0, _G)
    84  
    85  
    86  -- testing limits for special instructions
    87  
    88  local a
    89  local p = 4
    90  for i=2,31 do
    91    for j=-3,3 do
    92      assert(loadstring(string.format([[local a=%s;a=a+
    93                                              %s;
    94                                        assert(a
    95                                        ==2^%s)]], j, p-j, i))) ()
    96      assert(loadstring(string.format([[local a=%s;
    97                                        a=a-%s;
    98                                        assert(a==-2^%s)]], -j, p-j, i))) ()
    99      assert(loadstring(string.format([[local a,b=0,%s;
   100                                        a=b-%s;
   101                                        assert(a==-2^%s)]], -j, p-j, i))) ()
   102    end
   103    p =2*p
   104  end
   105  
   106  print'+'
   107  
   108  
   109  if rawget(_G, "querytab") then
   110    -- testing clearing of dead elements from tables
   111    collectgarbage("stop")   -- stop GC
   112    local a = {[{}] = 4, [3] = 0, alo = 1, 
   113               a1234567890123456789012345678901234567890 = 10}
   114  
   115    local t = querytab(a)
   116  
   117    for k,_ in pairs(a) do a[k] = nil end
   118    collectgarbage()   -- restore GC and collect dead fiels in `a'
   119    for i=0,t-1 do
   120      local k = querytab(a, i)
   121      assert(k == nil or type(k) == 'number' or k == 'alo')
   122    end
   123  end
   124  
   125  print('OK')
   126  
   127  return 5,f