You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.0 KiB
42 lines
1.0 KiB
|
2 years ago
|
-- Gets the signature of native (non-C) Lua function
|
||
|
|
-- Based on https://stackoverflow.com/a/24216007/181228
|
||
|
|
|
||
|
|
local function getlocals(l)
|
||
|
|
local i = 0
|
||
|
|
local direction = 1
|
||
|
|
return function()
|
||
|
|
i = i + direction
|
||
|
|
local k, v = debug.getlocal(l, i)
|
||
|
|
if (direction == 1 and (k == nil or k.sub(k, 1, 1) == '(')) then
|
||
|
|
i = -1
|
||
|
|
direction = -1
|
||
|
|
k, v = debug.getlocal(l, i)
|
||
|
|
end
|
||
|
|
return k, v
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function dumpsig(f)
|
||
|
|
assert(type(f) == 'function', "bad argument #1 to 'dumpsig' (function expected)")
|
||
|
|
local p = {}
|
||
|
|
pcall(function()
|
||
|
|
local oldhook
|
||
|
|
local hook = function(event, line)
|
||
|
|
for k, v in getlocals(3) do
|
||
|
|
if k == "(*vararg)" then
|
||
|
|
table.insert(p, "...")
|
||
|
|
break
|
||
|
|
end
|
||
|
|
table.insert(p, k)
|
||
|
|
end
|
||
|
|
debug.sethook(oldhook)
|
||
|
|
error('aborting the call')
|
||
|
|
end
|
||
|
|
oldhook = debug.sethook(hook, "c")
|
||
|
|
f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
|
||
|
|
end)
|
||
|
|
return "(" .. table.concat(p, ", ") .. ")"
|
||
|
|
end
|
||
|
|
|
||
|
|
return dumpsig
|