38 lines
981 B
Lua
Executable File
38 lines
981 B
Lua
Executable File
--[[--
|
|
num_args takes in 5.1 byte code and extracts the number of arguments
|
|
from its function header.
|
|
--]]--
|
|
|
|
function int(t)
|
|
return t:byte(1)+t:byte(2)*0x100+t:byte(3)*0x10000+t:byte(4)*0x1000000
|
|
end
|
|
|
|
function num_args(func)
|
|
local dump = string.dump(func)
|
|
local offset, cursor = int(dump:sub(13)), offset + 26
|
|
--Get the params and var flag (whether there's a ... in the param)
|
|
return dump:sub(cursor):byte(), dump:sub(cursor+1):byte()
|
|
end
|
|
|
|
-- Usage:
|
|
num_args(function(a,b,c,d, ...) end) -- return 4, 7
|
|
|
|
-- Python styled string format operator
|
|
local gm = debug.getmetatable("")
|
|
|
|
gm.__mod=function(self, other)
|
|
if type(other) ~= "table" then other = {other} end
|
|
for i,v in ipairs(other) do other[i] = tostring(v) end
|
|
return self:format(unpack(other))
|
|
end
|
|
|
|
print([===[
|
|
blah blah %s, (%d %d)
|
|
]===]%{"blah", num_args(int)})
|
|
|
|
--[=[--
|
|
table.maxn is deprecated, use # instead.
|
|
--]=]--
|
|
print(table.maxn{1,2,[4]=4,[8]=8) -- outputs 8 instead of 2
|
|
|
|
print(5 --[[ blah ]]) |