Flexible limit for use of registers by constructors

Instead of a fixed limit of 50 registers (which, in a bad worst case,
can limit the nesting of constructors to 5 levels), the compiler
computes an individual limit for each constructor based on how many
registers are available when it runs. This limit then controls the
frequency of SETLIST instructions.
This commit is contained in:
Roberto Ierusalimschy
2024-06-27 11:24:27 -03:00
parent fb7e5b76c9
commit 9904c253da
5 changed files with 31 additions and 7 deletions

View File

@@ -460,5 +460,16 @@ do -- check number of available registers
assert(string.find(msg, "too many registers"))
end
do -- basic check for SETLIST
-- create a list constructor with 50 elements
local source = "local a; return {" .. string.rep("a, ", 50) .. "}"
local func = assert(load(source))
local code = table.concat(T.listcode(func), "\n")
local _, count = string.gsub(code, "SETLIST", "")
-- code uses only 1 SETLIST for the constructor
assert(count == 1)
end
print 'OK'