1-- $Id: testes/verybig.lua $
  2-- See Copyright Notice in file all.lua
  3
  4print "testing RK"
  5
  6-- testing opcodes with RK arguments larger than K limit
  7local function foo ()
  8  local dummy = {
  9     -- fill first 256 entries in table of constants
 10     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
 11     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
 12     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
 13     49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
 14     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
 15     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
 16     97, 98, 99, 100, 101, 102, 103, 104,
 17     105, 106, 107, 108, 109, 110, 111, 112,
 18     113, 114, 115, 116, 117, 118, 119, 120,
 19     121, 122, 123, 124, 125, 126, 127, 128,
 20     129, 130, 131, 132, 133, 134, 135, 136,
 21     137, 138, 139, 140, 141, 142, 143, 144,
 22     145, 146, 147, 148, 149, 150, 151, 152,
 23     153, 154, 155, 156, 157, 158, 159, 160,
 24     161, 162, 163, 164, 165, 166, 167, 168,
 25     169, 170, 171, 172, 173, 174, 175, 176,
 26     177, 178, 179, 180, 181, 182, 183, 184,
 27     185, 186, 187, 188, 189, 190, 191, 192,
 28     193, 194, 195, 196, 197, 198, 199, 200,
 29     201, 202, 203, 204, 205, 206, 207, 208,
 30     209, 210, 211, 212, 213, 214, 215, 216,
 31     217, 218, 219, 220, 221, 222, 223, 224,
 32     225, 226, 227, 228, 229, 230, 231, 232,
 33     233, 234, 235, 236, 237, 238, 239, 240,
 34     241, 242, 243, 244, 245, 246, 247, 248,
 35     249, 250, 251, 252, 253, 254, 255, 256,
 36  }
 37  assert(24.5 + 0.6 == 25.1)
 38  local t = {foo = function (self, x) return x + self.x end, x = 10}
 39  t.t = t
 40  assert(t:foo(1.5) == 11.5)
 41  assert(t.t:foo(0.5) == 10.5)   -- bug in 5.2 alpha
 42  assert(24.3 == 24.3)
 43  assert((function () return t.x end)() == 10)
 44end
 45
 46
 47foo()
 48foo = nil
 49
 50if _soft then return 10 end
 51
 52print "testing large programs (>64k)"
 53
 54-- template to create a very big test file
 55local prog = [[$
 56
 57local a,b
 58
 59b = {$1$
 60  b30009 = 65534,
 61  b30010 = 65535,
 62  b30011 = 65536,
 63  b30012 = 65537,
 64  b30013 = 16777214,
 65  b30014 = 16777215,
 66  b30015 = 16777216,
 67  b30016 = 16777217,
 68  b30017 = 0x7fffff,
 69  b30018 = -0x7fffff,
 70  b30019 = 0x1ffffff,
 71  b30020 = -0x1ffffd,
 72  b30021 = -65534,
 73  b30022 = -65535,
 74  b30023 = -65536,
 75  b30024 = -0xffffff,
 76  b30025 = 15012.5,
 77  $2$
 78};
 79
 80assert(b.a50008 == 25004 and b["a11"] == -5.5)
 81assert(b.a33007 == -16503.5 and b.a50009 == -25004.5)
 82assert(b["b"..30024] == -0xffffff)
 83
 84function b:xxx (a,b) return a+b end
 85assert(b:xxx(10, 12) == 22)   -- pushself with non-constant index
 86b["xxx"] = undef
 87
 88local s = 0; local n=0
 89for a,b in pairs(b) do s=s+b; n=n+1 end
 90-- with 32-bit floats, exact value of 's' depends on summation order
 91assert(81800000.0 < s and s < 81860000 and n == 70001)
 92
 93a = nil; b = nil
 94print'+'
 95
 96local function f(x) b=x end
 97
 98a = f{$3$} or 10
 99
100assert(a==10)
101assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009")
102
103
104function xxxx (x) return b[x] end
105
106assert(xxxx(3) == "a11")
107
108a = nil; b=nil
109xxxx = nil
110
111return 10
112
113]]
114
115-- functions to fill in the $n$
116
117local function sig (x)
118  return (x % 2 == 0) and '' or '-'
119end
120
121local F = {
122function ()   -- $1$
123  for i=10,50009 do
124    io.write('a', i, ' = ', sig(i), 5+((i-10)/2), ',\n')
125  end
126end,
127
128function ()   -- $2$
129  for i=30026,50009 do
130    io.write('b', i, ' = ', sig(i), 15013+((i-30026)/2), ',\n')
131  end
132end,
133
134function ()   -- $3$
135  for i=10,50009 do
136    io.write('"a', i, '", ', sig(i), 5+((i-10)/2), ',\n')
137  end
138end,
139}
140
141local file = os.tmpname()
142io.output(file)
143for s in string.gmatch(prog, "$([^$]+)") do
144  local n = tonumber(s)
145  if not n then io.write(s) else F[n]() end
146end
147io.close()
148local result = dofile(file)
149assert(os.remove(file))
150print'OK'
151return result
152