---@meta jit.util

---@class Trace
---@class Proto

local util = {}

---@class jit.funcinfo.lua
local funcinfo = {
    linedefined = 0,
    lastlinedefined = 0,
    stackslots = 0,
    params = 0,
    bytecodes = 0,
    gcconsts = 0,
    nconsts = 0,
    upvalues = 0,
    currentline = 0,
    isvararg = false,
    children = false,
    source = "",
    loc = "",
    ---@type Proto[]
    proto = {}
}

---@class jit.funcinfo.c
---@field ffid integer|nil
local funcinfo2 = {
    addr = 0,
    upvalues = 0,
}


---@param func function
---@param pc? integer
---@return jit.funcinfo.c|jit.funcinfo.lua info
function util.funcinfo(func, pc)
end

---@param func function
---@param pc integer
---@return integer? ins
---@return integer? m
function util.funcbc(func, pc)
end

---@param func function
---@param idx integer
---@return any? k
function util.funck(func, idx)
end

---@param func function
---@param idx integer
---@return string? name
function util.funcuvname(func, idx)
end

---@class jit.traceinfo
local traceinfo = {
    nins = 0,
    nk = 0,
    link = 0,
    nexit = 0,
    linktype = ""
}

---@param tr Trace
---@return jit.traceinfo? info
function util.traceinfo(tr)
end

---@param tr Trace
---@param ref integer
---@return integer? m
---@return integer? ot
---@return integer? op1
---@return integer? op2
---@return integer? prev
function util.traceir(tr, ref)
end

---@param tr Trace
---@param idx integer
---@return any? k
---@return integer? t
---@return integer? slot
function util.tracek(tr, idx)
end

---@class jit.snap : integer[]

---@param tr Trace
---@param sn integer
---@return jit.snap? snap
function util.tracesnap(tr, sn)
end

---@param tr Trace
---@return string? mcode
---@return integer? addr
---@return integer? loop
function util.tracemc(tr)
end

---@overload fun(exitno: integer): integer
---@param tr Trace
---@param exitno integer
---@return integer? addr
function util.traceexitstub(tr, exitno)
end

---@param idx integer
---@return integer? addr
function util.ircalladdr(idx)
end

return util
