Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env lua
- do
- local outside = "abc"
- function test()
- local inside = "def"
- return tostring(outside .. inside)
- end
- end
- -- higher poll-every = less slowdown, but may miss changes, or the entire in scope var
- -- lower ppoll-every = more slowdown, but less likley to miss a variable change
- function inspect_inside(vars, poll_every, func, ...)
- local variables = {}
- local hook = function()
- local idx = 1
- while true do
- local ln, lv = debug.getlocal(2, idx)
- if ln ~= nil then
- variables[ln] = lv
- else
- break
- end
- idx = 1 + idx
- end
- end
- local oldhook = debug.gethook()
- debug.sethook(hook, "", poll_every)
- local func_rets = {func(...)}
- debug.sethook(oldhook)
- local ret = {}
- for k,v in ipairs(vars) do
- ret[v] = variables[v]
- end
- return ret, unpack(func_rets)
- end
- function inspect_outside(vars, func)
- local upvals = {}
- local i = 1
- while true do
- local name, val = debug.getupvalue(func, i)
- if not name then break end
- upvals[name] = val
- i = i + 1
- end
- local ret = {}
- for k,v in ipairs(vars) do
- ret[v] = upvals[v]
- end
- return ret
- end
- -- WARNING, POLLEVERY = 1, SLOW AS HELL, INCREASE UNTIL IT'S STABLE!
- print(inspect_inside({"inside"}, 1, test).inside)
- -- try and cache the result from this
- print(inspect_outside({"outside"}, test).outside)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement