[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: RE: Intercept function call
- From: RLake@...
- Date: Wed, 22 Oct 2003 16:18:46 -0500
> In another different file I should have one list (I still don't know how
> to make this list. It has to be in a generic way to be used for any
> program just changing the list) of the functions that I want to 
intercept
> (for example, the query and remove). Before or after the execution of
> them, it must execute the function logging and then return to execute 
the
> next function.
You will want to use the "reflexive debug interface", as described
in the manual. Set a hook function to intercept on call and return, and
then try to identify the function that is being intercepted.
If your functions are globals, it is not too difficult.
eg:
do
  local intercepts = {}
  function intercept(f, on)
    local rv = intercepts[f]
    intercepts[f] = on
    return rv
  end
 
  local hookstack = {n = 0}
  local function callhook()
    local f = debug.getinfo(3, "f").func
    table.insert(hookstack, f)
    if intercepts[f] then doOnCall(f) end
  end
  local function rethook()
    local f = table.remove(hookstack)
    if intercepts[f] then doOnReturn(f) end
  end
  local case = {
    ["call"] = callhook,
    ["return"] = rethook,
    ["tail return"] = rethook
  }
 
  local function nothing() end
  local function myhook(what)
    (case[what] or nothing)()
  end
  debug.sethook(myhook, "cr")
end
-- define doOnCall and doOnReturn to do whatever
-- to intercept a function:
function foo(a) print "foo" end
intercept(foo, true)
-- to intercept a function given its name (if it is a global)
a = "foo"
intercept(getfenv()[a], true)
-- I hope the above code is easy to follow.
-- Quick test:
> function doOnCall(func) print "An intercepted call" end
> function doOnReturn(func) print "An intercepted return" end
> foo(3)
An intercepted call
foo
An intercepted return
>