verybig.lua (3726B)
1 -- $Id: testes/verybig.lua $ 2 -- See Copyright Notice in file all.lua 3 4 print "testing RK" 5 6 -- testing opcodes with RK arguments larger than K limit 7 local 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) 44 end 45 46 47 foo() 48 foo = nil 49 50 if _soft then return 10 end 51 52 print "testing large programs (>64k)" 53 54 -- template to create a very big test file 55 local prog = [[$ 56 57 local a,b 58 59 b = {$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 80 assert(b.a50008 == 25004 and b["a11"] == -5.5) 81 assert(b.a33007 == -16503.5 and b.a50009 == -25004.5) 82 assert(b["b"..30024] == -0xffffff) 83 84 function b:xxx (a,b) return a+b end 85 assert(b:xxx(10, 12) == 22) -- pushself with non-constant index 86 b["xxx"] = undef 87 88 local s = 0; local n=0 89 for 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 91 assert(81800000.0 < s and s < 81860000 and n == 70001) 92 93 a = nil; b = nil 94 print'+' 95 96 local function f(x) b=x end 97 98 a = f{$3$} or 10 99 100 assert(a==10) 101 assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009") 102 103 104 function xxxx (x) return b[x] end 105 106 assert(xxxx(3) == "a11") 107 108 a = nil; b=nil 109 xxxx = nil 110 111 return 10 112 113 ]] 114 115 -- functions to fill in the $n$ 116 117 local function sig (x) 118 return (x % 2 == 0) and '' or '-' 119 end 120 121 local F = { 122 function () -- $1$ 123 for i=10,50009 do 124 io.write('a', i, ' = ', sig(i), 5+((i-10)/2), ',\n') 125 end 126 end, 127 128 function () -- $2$ 129 for i=30026,50009 do 130 io.write('b', i, ' = ', sig(i), 15013+((i-30026)/2), ',\n') 131 end 132 end, 133 134 function () -- $3$ 135 for i=10,50009 do 136 io.write('"a', i, '", ', sig(i), 5+((i-10)/2), ',\n') 137 end 138 end, 139 } 140 141 local file = os.tmpname() 142 io.output(file) 143 for s in string.gmatch(prog, "$([^$]+)") do 144 local n = tonumber(s) 145 if not n then io.write(s) else F[n]() end 146 end 147 io.close() 148 local result = dofile(file) 149 assert(os.remove(file)) 150 print'OK' 151 return result 152