123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- -- $Id: testes/heavy.lua,v $
- -- See Copyright Notice in file lua.h
- local function teststring ()
- print("creating a string too long")
- do
- local a = "x"
- local st, msg = pcall(function ()
- while true do
- a = a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a
- print(string.format("string with %d bytes", #a))
- end
- end)
- assert(not st and
- (string.find(msg, "string length overflow") or
- string.find(msg, "not enough memory")))
- print("string length overflow with " .. #a * 100)
- end
- print('+')
- end
- local function loadrep (x, what)
- local p = 1<<20
- local s = string.rep(x, p)
- local count = 0
- local function f()
- count = count + p
- if count % (0x80*p) == 0 then
- io.stderr:write("(", count // 2^20, " M)")
- end
- return s
- end
- local st, msg = load(f, "=big")
- print("\nmemory: ", collectgarbage'count' * 1024)
- msg = string.match(msg, "^[^\n]+") -- get only first line
- print(string.format("total: 0x%x %s ('%s')", count, what, msg))
- return st, msg
- end
- function controlstruct ()
- print("control structure too long")
- local lim = ((1 << 24) - 2) // 3
- local s = string.rep("a = a + 1\n", lim)
- s = "while true do " .. s .. "end"
- assert(load(s))
- print("ok with " .. lim .. " lines")
- lim = lim + 3
- s = string.rep("a = a + 1\n", lim)
- s = "while true do " .. s .. "end"
- local st, msg = load(s)
- assert(not st and string.find(msg, "too long"))
- print(msg)
- end
- function manylines ()
- print("loading chunk with too many lines")
- local st, msg = loadrep("\n", "lines")
- assert(not st and string.find(msg, "too many lines"))
- print('+')
- end
- function hugeid ()
- print("loading chunk with huge identifier")
- local st, msg = loadrep("a", "chars")
- assert(not st and
- (string.find(msg, "lexical element too long") or
- string.find(msg, "not enough memory")))
- print('+')
- end
- function toomanyinst ()
- print("loading chunk with too many instructions")
- local st, msg = loadrep("a = 10; ", "instructions")
- print('+')
- end
- local function loadrepfunc (prefix, f)
- local count = -1
- local function aux ()
- count = count + 1
- if count == 0 then
- return prefix
- else
- if count % (0x100000) == 0 then
- io.stderr:write("(", count // 2^20, " M)")
- end
- return f(count)
- end
- end
- local st, msg = load(aux, "k")
- print("\nmemory: ", collectgarbage'count' * 1024)
- msg = string.match(msg, "^[^\n]+") -- get only first line
- print("expected error: ", msg)
- end
- function toomanyconst ()
- print("loading function with too many constants")
- loadrepfunc("function foo () return {0,",
- function (n)
- -- convert 'n' to a string in the format [["...",]],
- -- where '...' is a kind of number in base 128
- -- (in a range that does not include either the double quote
- -- and the escape.)
- return string.char(34,
- ((n // 128^0) & 127) + 128,
- ((n // 128^1) & 127) + 128,
- ((n // 128^2) & 127) + 128,
- ((n // 128^3) & 127) + 128,
- ((n // 128^4) & 127) + 128,
- 34, 44)
- end)
- end
- function toomanystr ()
- local a = {}
- local st, msg = pcall(function ()
- for i = 1, math.huge do
- if i % (0x100000) == 0 then
- io.stderr:write("(", i // 2^20, " M)")
- end
- a[i] = string.pack("I", i)
- end
- end)
- local size = #a
- a = collectgarbage'count'
- print("\nmemory:", a * 1024)
- print("expected error:", msg)
- print("size:", size)
- end
- function toomanyidx ()
- local a = {}
- local st, msg = pcall(function ()
- for i = 1, math.huge do
- if i % (0x100000) == 0 then
- io.stderr:write("(", i // 2^20, " M)")
- end
- a[i] = i
- end
- end)
- print("\nmemory: ", collectgarbage'count' * 1024)
- print("expected error: ", msg)
- print("size:", #a)
- end
-
- -- teststring()
- -- controlstruct()
- -- manylines()
- -- hugeid()
- -- toomanyinst()
- -- toomanyconst()
- -- toomanystr()
- toomanyidx()
- print "OK"
|