from DebugClient import DebugClient,DebuggerCommEvent,\
wxEVT_DEBUGGER_OK, wxEVT_DEBUGGER_EXC
from IsolatedDebugger import NonBlockingDebuggerConnection,DebuggerController
class InProcessCallback:
def __init__(self, event_handler, win_id, r_name, r_args):
self.event_handler = event_handler
self.win_id = win_id
self.r_name = r_name
self.r_args = r_args
def notifyReturn(self, result):
if self.r_name:
evt = DebuggerCommEvent(wxEVT_DEBUGGER_OK, self.win_id)
evt.SetReceiverName(self.r_name)
evt.SetReceiverArgs(self.r_args)
evt.SetResult(result)
self.event_handler.AddPendingEvent(evt)
def notifyException(self):
t, v = sys.exc_info()[:2]
evt = DebuggerCommEvent(wxEVT_DEBUGGER_EXC, self.win_id)
evt.SetExc(t, v)
self.event_handler.AddPendingEvent(evt)
class InProcessClient (DebugClient):
dc = DebuggerController()
def __init__(self, win):
DebugClient.__init__(self, win)
self.conn_id = self.dc.createServer()
def invokeOnServer(self, m_name, m_args=(), r_name=None, r_args=()):
conn = NonBlockingDebuggerConnection(self.dc, self.conn_id)
cb = InProcessCallback(
self.event_handler, self.win_id, r_name, r_args)
conn.setCallback(cb)
try:
getattr(conn, m_name)(*m_args)
except:
cb.notifyException()
def __del__(self):
conn_id = self.conn_id
self.conn_id = None
self.dc.deleteServer(conn_id)
|