1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
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:
apply(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)
|