teal-language / tl

The compiler for Teal, a typed dialect of Lua
MIT License
2.11k stars 109 forks source link

Stack overflow checking strict.lua #515

Closed zevv closed 2 years ago

zevv commented 2 years ago

Latest version teal crashes with a stackdump when checking the below snipped which comes from strict.lua:

local mt = getmetatable(_G)
if mt == nil then
  mt = {}
  setmetatable(_G, mt)
end

mt.__declared = {}

mt.__newindex = function (t, n, v)
  if not mt.__declared[n] then
    local w = debug.getinfo(2, "S").what
    if w ~= "main" and w ~= "C" then
      error("assign to undeclared variable '"..n.."'", 2)
    end
    mt.__declared[n] = true
  end
  rawset(t, n, v)
end

mt.__index = function (t, n)
  if not mt.__declared[n] and debug.getinfo(2, "S").what ~= "C" then
    error("Accessing undeclared variable '"..n.."'", 2)
  end
  return rawget(t, n)
end

Trace:

lua: /home/ico/external/tl//tl.lua:6145: stack overflow
stack traceback:
    /home/ico/external/tl//tl.lua:6145: in local 'cmp'
    /home/ico/external/tl//tl.lua:5879: in upvalue 'arg_check'
    /home/ico/external/tl//tl.lua:6205: in local 'cmp'
    /home/ico/external/tl//tl.lua:5848: in upvalue 'match_record_fields'
    /home/ico/external/tl//tl.lua:5862: in upvalue 'match_fields_to_record'
    /home/ico/external/tl//tl.lua:6191: in function </home/ico/external/tl//tl.lua:6144>
    (...tail calls...)
    /home/ico/external/tl//tl.lua:5879: in upvalue 'arg_check'
    /home/ico/external/tl//tl.lua:6205: in local 'cmp'
    /home/ico/external/tl//tl.lua:5848: in upvalue 'match_record_fields'
    /home/ico/external/tl//tl.lua:5862: in upvalue 'match_fields_to_record'
    ... (skipping 142810 levels)
    /home/ico/external/tl//tl.lua:3210: in local 'fn'
    /home/ico/external/tl//tl.lua:3307: in upvalue 'recurse'
    /home/ico/external/tl//tl.lua:3201: in local 'fn'
    /home/ico/external/tl//tl.lua:3307: in upvalue 'recurse'
    /home/ico/external/tl//tl.lua:3130: in local 'fn'
    /home/ico/external/tl//tl.lua:3307: in function </home/ico/external/tl//tl.lua:3287>
    (...tail calls...)
    /home/ico/external/tl//tl.lua:9139: in function 'tl.type_check'
    /home/ico/external/tl//tl.lua:9520: in function 'tl.process_string'
    (...tail calls...)
    /home/ico/external/tl/tl:1105: in field '?'
    /home/ico/external/tl/tl:1333: in main chunk
    [C]: in ?
hishamhm commented 2 years ago

The minimal test case for this was:

local mt = getmetatable(_G)
setmetatable(_G, mt)

It's now fixed in master! Thank you for reporting!