DebugClients/Python3/DebugClientBase.py

branch
jsonrpc
changeset 5120
c5189d404cc7
parent 5119
80bd41498eef
child 5124
1ba8ee313b57
--- a/DebugClients/Python3/DebugClientBase.py	Wed Aug 31 18:31:57 2016 +0200
+++ b/DebugClients/Python3/DebugClientBase.py	Wed Aug 31 19:55:49 2016 +0200
@@ -313,8 +313,12 @@
         @param echo Flag indicating echoing of the input (boolean)
         @return the entered string
         """
-        self.write("{0}{1!r}\n".format(
-            DebugProtocol.ResponseRaw, (prompt, echo)))
+##        self.write("{0}{1!r}\n".format(
+##            DebugProtocol.ResponseRaw, (prompt, echo)))
+        self.__sendJsonCommand("RequestRaw", {
+            "prompt": prompt,
+            "echo": echo,
+        })
         self.inRawMode = True
         self.eventLoop(True)
         return self.rawLine
@@ -434,40 +438,40 @@
                         DebugProtocol.ResponseStack, stack))
                 return
             
-            if cmd == DebugProtocol.RequestStep:
-                self.currentThread.step(True)
-                self.eventExit = True
-                return
-
-            if cmd == DebugProtocol.RequestStepOver:
-                self.currentThread.step(False)
-                self.eventExit = True
-                return
-            
-            if cmd == DebugProtocol.RequestStepOut:
-                self.currentThread.stepOut()
-                self.eventExit = True
-                return
-            
-            if cmd == DebugProtocol.RequestStepQuit:
-                if self.passive:
-                    self.progTerminated(42)
-                else:
-                    self.set_quit()
-                    self.eventExit = True
-                return
-
-            if cmd == DebugProtocol.RequestContinue:
-                special = int(arg)
-                self.currentThread.go(special)
-                self.eventExit = True
-                return
-
-            if cmd == DebugProtocol.RequestOK:
-                self.write(self.pendingResponse + '\n')
-                self.pendingResponse = DebugProtocol.ResponseOK
-                return
-
+##            if cmd == DebugProtocol.RequestStep:
+##                self.currentThread.step(True)
+##                self.eventExit = True
+##                return
+##
+##            if cmd == DebugProtocol.RequestStepOver:
+##                self.currentThread.step(False)
+##                self.eventExit = True
+##                return
+##            
+##            if cmd == DebugProtocol.RequestStepOut:
+##                self.currentThread.stepOut()
+##                self.eventExit = True
+##                return
+##            
+##            if cmd == DebugProtocol.RequestStepQuit:
+##                if self.passive:
+##                    self.progTerminated(42)
+##                else:
+##                    self.set_quit()
+##                    self.eventExit = True
+##                return
+##
+##            if cmd == DebugProtocol.RequestContinue:
+##                special = int(arg)
+##                self.currentThread.go(special)
+##                self.eventExit = True
+##                return
+##
+##            if cmd == DebugProtocol.RequestOK:
+##                self.write(self.pendingResponse + '\n')
+##                self.pendingResponse = DebugProtocol.ResponseOK
+##                return
+##
             if cmd == DebugProtocol.RequestCallTrace:
                 if arg.strip().lower() == "on":
                     callTraceEnabled = True
@@ -535,143 +539,143 @@
 ##                    self.progTerminated(res)
 ##                return
 ##
-            if cmd == DebugProtocol.RequestRun:
-                sys.argv = []
-                wd, fn, args = arg.split('|')
-                self.__setCoding(fn)
-                sys.argv.append(fn)
-                sys.argv.extend(eval(args))
-                sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-                if wd == '':
-                    os.chdir(sys.path[1])
-                else:
-                    os.chdir(wd)
-
-                self.running = sys.argv[0]
-                self.mainFrame = None
-                self.botframe = None
-                self.inRawMode = False
-                
-                self.threads.clear()
-                self.attachThread(mainThread=True)
-                
-                # set the system exception handling function to ensure, that
-                # we report on all unhandled exceptions
-                sys.excepthook = self.__unhandled_exception
-                self.__interceptSignals()
-                
-                self.mainThread.tracePython = False
-                
-                self.debugMod.__dict__['__file__'] = sys.argv[0]
-                sys.modules['__main__'] = self.debugMod
-                res = 0
-                code = self.__compileFileSource(self.running)
-                if code:
-                    try:
-                        exec(code, self.debugMod.__dict__)
-                    except SystemExit as exc:
-                        res = exc.code
-                        atexit._run_exitfuncs()
-                    self.writestream.flush()
-                    self.progTerminated(res)
-                return
-
-            if cmd == DebugProtocol.RequestProfile:
-                sys.setprofile(None)
-                import PyProfile
-                sys.argv = []
-                wd, fn, args, erase = arg.split('|')
-                self.__setCoding(fn)
-                sys.argv.append(fn)
-                sys.argv.extend(eval(args))
-                sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-                if wd == '':
-                    os.chdir(sys.path[1])
-                else:
-                    os.chdir(wd)
-
-                # set the system exception handling function to ensure, that
-                # we report on all unhandled exceptions
-                sys.excepthook = self.__unhandled_exception
-                self.__interceptSignals()
-                
-                # generate a profile object
-                self.prof = PyProfile.PyProfile(sys.argv[0])
-                
-                if int(erase):
-                    self.prof.erase()
-                self.debugMod.__dict__['__file__'] = sys.argv[0]
-                sys.modules['__main__'] = self.debugMod
-                fp = open(sys.argv[0], encoding=self.__coding)
-                try:
-                    script = fp.read()
-                finally:
-                    fp.close()
-                if script:
-                    if not script.endswith('\n'):
-                        script += '\n'
-                    self.running = sys.argv[0]
-                    res = 0
-                    try:
-                        self.prof.run(script)
-                    except SystemExit as exc:
-                        res = exc.code
-                        atexit._run_exitfuncs()
-                    self.prof.save()
-                    self.writestream.flush()
-                    self.progTerminated(res)
-                return
-
-            if cmd == DebugProtocol.RequestCoverage:
-                from coverage import coverage
-                sys.argv = []
-                wd, fn, args, erase = arg.split('@@')
-                self.__setCoding(fn)
-                sys.argv.append(fn)
-                sys.argv.extend(eval(args))
-                sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-                if wd == '':
-                    os.chdir(sys.path[1])
-                else:
-                    os.chdir(wd)
-                
-                # set the system exception handling function to ensure, that
-                # we report on all unhandled exceptions
-                sys.excepthook = self.__unhandled_exception
-                self.__interceptSignals()
-                
-                # generate a coverage object
-                self.cover = coverage(
-                    auto_data=True,
-                    data_file="{0}.coverage".format(
-                        os.path.splitext(sys.argv[0])[0]))
-                
-                if int(erase):
-                    self.cover.erase()
-                sys.modules['__main__'] = self.debugMod
-                self.debugMod.__dict__['__file__'] = sys.argv[0]
-                fp = open(sys.argv[0], encoding=self.__coding)
-                try:
-                    script = fp.read()
-                finally:
-                    fp.close()
-                if script:
-                    if not script.endswith('\n'):
-                        script += '\n'
-                    code = compile(script, sys.argv[0], 'exec')
-                    self.running = sys.argv[0]
-                    res = 0
-                    self.cover.start()
-                    try:
-                        exec(code, self.debugMod.__dict__)
-                    except SystemExit as exc:
-                        res = exc.code
-                        atexit._run_exitfuncs()
-                    self.cover.stop()
-                    self.cover.save()
-                    self.writestream.flush()
-                    self.progTerminated(res)
-                return
+##            if cmd == DebugProtocol.RequestRun:
+##                sys.argv = []
+##                wd, fn, args = arg.split('|')
+##                self.__setCoding(fn)
+##                sys.argv.append(fn)
+##                sys.argv.extend(eval(args))
+##                sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+##                if wd == '':
+##                    os.chdir(sys.path[1])
+##                else:
+##                    os.chdir(wd)
+##
+##                self.running = sys.argv[0]
+##                self.mainFrame = None
+##                self.botframe = None
+##                self.inRawMode = False
+##                
+##                self.threads.clear()
+##                self.attachThread(mainThread=True)
+##                
+##                # set the system exception handling function to ensure, that
+##                # we report on all unhandled exceptions
+##                sys.excepthook = self.__unhandled_exception
+##                self.__interceptSignals()
+##                
+##                self.mainThread.tracePython = False
+##                
+##                self.debugMod.__dict__['__file__'] = sys.argv[0]
+##                sys.modules['__main__'] = self.debugMod
+##                res = 0
+##                code = self.__compileFileSource(self.running)
+##                if code:
+##                    try:
+##                        exec(code, self.debugMod.__dict__)
+##                    except SystemExit as exc:
+##                        res = exc.code
+##                        atexit._run_exitfuncs()
+##                    self.writestream.flush()
+##                    self.progTerminated(res)
+##                return
+##
+##            if cmd == DebugProtocol.RequestProfile:
+##                sys.setprofile(None)
+##                import PyProfile
+##                sys.argv = []
+##                wd, fn, args, erase = arg.split('|')
+##                self.__setCoding(fn)
+##                sys.argv.append(fn)
+##                sys.argv.extend(eval(args))
+##                sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+##                if wd == '':
+##                    os.chdir(sys.path[1])
+##                else:
+##                    os.chdir(wd)
+##
+##                # set the system exception handling function to ensure, that
+##                # we report on all unhandled exceptions
+##                sys.excepthook = self.__unhandled_exception
+##                self.__interceptSignals()
+##                
+##                # generate a profile object
+##                self.prof = PyProfile.PyProfile(sys.argv[0])
+##                
+##                if int(erase):
+##                    self.prof.erase()
+##                self.debugMod.__dict__['__file__'] = sys.argv[0]
+##                sys.modules['__main__'] = self.debugMod
+##                fp = open(sys.argv[0], encoding=self.__coding)
+##                try:
+##                    script = fp.read()
+##                finally:
+##                    fp.close()
+##                if script:
+##                    if not script.endswith('\n'):
+##                        script += '\n'
+##                    self.running = sys.argv[0]
+##                    res = 0
+##                    try:
+##                        self.prof.run(script)
+##                    except SystemExit as exc:
+##                        res = exc.code
+##                        atexit._run_exitfuncs()
+##                    self.prof.save()
+##                    self.writestream.flush()
+##                    self.progTerminated(res)
+##                return
+##
+##            if cmd == DebugProtocol.RequestCoverage:
+##                from coverage import coverage
+##                sys.argv = []
+##                wd, fn, args, erase = arg.split('@@')
+##                self.__setCoding(fn)
+##                sys.argv.append(fn)
+##                sys.argv.extend(eval(args))
+##                sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+##                if wd == '':
+##                    os.chdir(sys.path[1])
+##                else:
+##                    os.chdir(wd)
+##                
+##                # set the system exception handling function to ensure, that
+##                # we report on all unhandled exceptions
+##                sys.excepthook = self.__unhandled_exception
+##                self.__interceptSignals()
+##                
+##                # generate a coverage object
+##                self.cover = coverage(
+##                    auto_data=True,
+##                    data_file="{0}.coverage".format(
+##                        os.path.splitext(sys.argv[0])[0]))
+##                
+##                if int(erase):
+##                    self.cover.erase()
+##                sys.modules['__main__'] = self.debugMod
+##                self.debugMod.__dict__['__file__'] = sys.argv[0]
+##                fp = open(sys.argv[0], encoding=self.__coding)
+##                try:
+##                    script = fp.read()
+##                finally:
+##                    fp.close()
+##                if script:
+##                    if not script.endswith('\n'):
+##                        script += '\n'
+##                    code = compile(script, sys.argv[0], 'exec')
+##                    self.running = sys.argv[0]
+##                    res = 0
+##                    self.cover.start()
+##                    try:
+##                        exec(code, self.debugMod.__dict__)
+##                    except SystemExit as exc:
+##                        res = exc.code
+##                        atexit._run_exitfuncs()
+##                    self.cover.stop()
+##                    self.cover.save()
+##                    self.writestream.flush()
+##                    self.progTerminated(res)
+##                return
 
             if cmd == DebugProtocol.RequestShutdown:
                 self.sessionClose()
@@ -930,95 +934,95 @@
                 self.fork_auto, self.fork_child = eval(arg)
                 return
         
-        # If we are handling raw mode input then reset the mode and break out
-        # of the current event loop.
-        if self.inRawMode:
-            self.inRawMode = False
-            self.rawLine = line
-            self.eventExit = True
-            return
-
-        if self.buffer:
-            self.buffer = self.buffer + '\n' + line
-        else:
-            self.buffer = line
-
-        try:
-            code = self.compile_command(self.buffer, self.readstream.name)
-        except (OverflowError, SyntaxError, ValueError):
-            # Report the exception
-            sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info()
-            for l in traceback.format_exception_only(
-                    sys.last_type, sys.last_value):
-                self.write(l)
-            self.buffer = ''
-        else:
-            if code is None:
-                self.pendingResponse = DebugProtocol.ResponseContinue
-            else:
-                self.buffer = ''
-
-                try:
-                    if self.running is None:
-                        exec(code, self.debugMod.__dict__)
-                    else:
-                        if self.currentThread is None:
-                            # program has terminated
-                            self.running = None
-                            _globals = self.debugMod.__dict__
-                            _locals = _globals
-                        else:
-                            cf = self.currentThread.getCurrentFrame()
-                            # program has terminated
-                            if cf is None:
-                                self.running = None
-                                _globals = self.debugMod.__dict__
-                                _locals = _globals
-                            else:
-                                frmnr = self.framenr
-                                while cf is not None and frmnr > 0:
-                                    cf = cf.f_back
-                                    frmnr -= 1
-                                _globals = cf.f_globals
-                                _locals = \
-                                    self.currentThread.getFrameLocals(
-                                        self.framenr)
-                        # reset sys.stdout to our redirector (unconditionally)
-                        if "sys" in _globals:
-                            __stdout = _globals["sys"].stdout
-                            _globals["sys"].stdout = self.writestream
-                            exec(code, _globals, _locals)
-                            _globals["sys"].stdout = __stdout
-                        elif "sys" in _locals:
-                            __stdout = _locals["sys"].stdout
-                            _locals["sys"].stdout = self.writestream
-                            exec(code, _globals, _locals)
-                            _locals["sys"].stdout = __stdout
-                        else:
-                            exec(code, _globals, _locals)
-                        
-                        self.currentThread.storeFrameLocals(self.framenr)
-                except SystemExit as exc:
-                    self.progTerminated(exc.code)
-                except Exception:
-                    # Report the exception and the traceback
-                    try:
-                        exc_type, exc_value, exc_tb = sys.exc_info()
-                        sys.last_type = exc_type
-                        sys.last_value = exc_value
-                        sys.last_traceback = exc_tb
-                        tblist = traceback.extract_tb(exc_tb)
-                        del tblist[:1]
-                        list = traceback.format_list(tblist)
-                        if list:
-                            list.insert(0, "Traceback (innermost last):\n")
-                            list[len(list):] = traceback.format_exception_only(
-                                exc_type, exc_value)
-                    finally:
-                        tblist = exc_tb = None
-
-                    for l in list:
-                        self.write(l)
+##        # If we are handling raw mode input then reset the mode and break out
+##        # of the current event loop.
+##        if self.inRawMode:
+##            self.inRawMode = False
+##            self.rawLine = line
+##            self.eventExit = True
+##            return
+##
+##        if self.buffer:
+##            self.buffer = self.buffer + '\n' + line
+##        else:
+##            self.buffer = line
+##
+##        try:
+##            code = self.compile_command(self.buffer, self.readstream.name)
+##        except (OverflowError, SyntaxError, ValueError):
+##            # Report the exception
+##            sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info()
+##            for l in traceback.format_exception_only(
+##                    sys.last_type, sys.last_value):
+##                self.write(l)
+##            self.buffer = ''
+##        else:
+##            if code is None:
+##                self.pendingResponse = DebugProtocol.ResponseContinue
+##            else:
+##                self.buffer = ''
+##
+##                try:
+##                    if self.running is None:
+##                        exec(code, self.debugMod.__dict__)
+##                    else:
+##                        if self.currentThread is None:
+##                            # program has terminated
+##                            self.running = None
+##                            _globals = self.debugMod.__dict__
+##                            _locals = _globals
+##                        else:
+##                            cf = self.currentThread.getCurrentFrame()
+##                            # program has terminated
+##                            if cf is None:
+##                                self.running = None
+##                                _globals = self.debugMod.__dict__
+##                                _locals = _globals
+##                            else:
+##                                frmnr = self.framenr
+##                                while cf is not None and frmnr > 0:
+##                                    cf = cf.f_back
+##                                    frmnr -= 1
+##                                _globals = cf.f_globals
+##                                _locals = \
+##                                    self.currentThread.getFrameLocals(
+##                                        self.framenr)
+##                        # reset sys.stdout to our redirector (unconditionally)
+##                        if "sys" in _globals:
+##                            __stdout = _globals["sys"].stdout
+##                            _globals["sys"].stdout = self.writestream
+##                            exec(code, _globals, _locals)
+##                            _globals["sys"].stdout = __stdout
+##                        elif "sys" in _locals:
+##                            __stdout = _locals["sys"].stdout
+##                            _locals["sys"].stdout = self.writestream
+##                            exec(code, _globals, _locals)
+##                            _locals["sys"].stdout = __stdout
+##                        else:
+##                            exec(code, _globals, _locals)
+##                        
+##                        self.currentThread.storeFrameLocals(self.framenr)
+##                except SystemExit as exc:
+##                    self.progTerminated(exc.code)
+##                except Exception:
+##                    # Report the exception and the traceback
+##                    try:
+##                        exc_type, exc_value, exc_tb = sys.exc_info()
+##                        sys.last_type = exc_type
+##                        sys.last_value = exc_value
+##                        sys.last_traceback = exc_tb
+##                        tblist = traceback.extract_tb(exc_tb)
+##                        del tblist[:1]
+##                        list = traceback.format_list(tblist)
+##                        if list:
+##                            list.insert(0, "Traceback (innermost last):\n")
+##                            list[len(list):] = traceback.format_exception_only(
+##                                exc_type, exc_value)
+##                    finally:
+##                        tblist = exc_tb = None
+##
+##                    for l in list:
+##                        self.write(l)
     
     def __handleJsonCommand(self, jsonStr):
         """
@@ -1062,7 +1066,6 @@
             return
         
         if method == "RequestLoad":
-            printerr(method)
             self._fncache = {}
             self.dircache = []
             sys.argv = []
@@ -1074,6 +1077,7 @@
                 os.chdir(sys.path[1])
             else:
                 os.chdir(params["workdir"])
+            
             self.running = sys.argv[0]
             self.mainFrame = None
             self.inRawMode = False
@@ -1106,6 +1110,271 @@
                 self.progTerminated(res)
             return
 
+        if method == "RequestRun":
+            sys.argv = []
+            self.__setCoding(params["filename"])
+            sys.argv.append(params["filename"])
+            sys.argv.extend(params["argv"])
+            sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+            if params["workdir"] == '':
+                os.chdir(sys.path[1])
+            else:
+                os.chdir(params["workdir"])
+
+            self.running = sys.argv[0]
+            self.mainFrame = None
+            self.botframe = None
+            self.inRawMode = False
+            
+            self.fork_auto = params["autofork"]
+            self.fork_child = params["forkChild"]
+            
+            self.threads.clear()
+            self.attachThread(mainThread=True)
+            
+            # set the system exception handling function to ensure, that
+            # we report on all unhandled exceptions
+            sys.excepthook = self.__unhandled_exception
+            self.__interceptSignals()
+            
+            self.mainThread.tracePython = False
+            
+            self.debugMod.__dict__['__file__'] = sys.argv[0]
+            sys.modules['__main__'] = self.debugMod
+            res = 0
+            code = self.__compileFileSource(self.running)
+            if code:
+                try:
+                    exec(code, self.debugMod.__dict__)
+                except SystemExit as exc:
+                    res = exc.code
+                    atexit._run_exitfuncs()
+                self.writestream.flush()
+                self.progTerminated(res)
+            return
+
+        if method == "RequestCoverage":
+            from coverage import coverage
+            sys.argv = []
+            self.__setCoding(params["filename"])
+            sys.argv.append(params["filename"])
+            sys.argv.extend(params["argv"])
+            sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+            if params["workdir"] == '':
+                os.chdir(sys.path[1])
+            else:
+                os.chdir(params["workdir"])
+            
+            # set the system exception handling function to ensure, that
+            # we report on all unhandled exceptions
+            sys.excepthook = self.__unhandled_exception
+            self.__interceptSignals()
+            
+            # generate a coverage object
+            self.cover = coverage(
+                auto_data=True,
+                data_file="{0}.coverage".format(
+                    os.path.splitext(sys.argv[0])[0]))
+            
+            if params["erase"]:
+                self.cover.erase()
+            sys.modules['__main__'] = self.debugMod
+            self.debugMod.__dict__['__file__'] = sys.argv[0]
+            fp = open(sys.argv[0], encoding=self.__coding)
+            try:
+                script = fp.read()
+            finally:
+                fp.close()
+            if script:
+                if not script.endswith('\n'):
+                    script += '\n'
+                code = compile(script, sys.argv[0], 'exec')
+                self.running = sys.argv[0]
+                res = 0
+                self.cover.start()
+                try:
+                    exec(code, self.debugMod.__dict__)
+                except SystemExit as exc:
+                    res = exc.code
+                    atexit._run_exitfuncs()
+                self.cover.stop()
+                self.cover.save()
+                self.writestream.flush()
+                self.progTerminated(res)
+            return
+        
+        if method == "RequestProfile":
+            sys.setprofile(None)
+            import PyProfile
+            sys.argv = []
+            self.__setCoding(params["filename"])
+            sys.argv.append(params["filename"])
+            sys.argv.extend(params["argv"])
+            sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+            if params["workdir"] == '':
+                os.chdir(sys.path[1])
+            else:
+                os.chdir(params["workdir"])
+
+            # set the system exception handling function to ensure, that
+            # we report on all unhandled exceptions
+            sys.excepthook = self.__unhandled_exception
+            self.__interceptSignals()
+            
+            # generate a profile object
+            self.prof = PyProfile.PyProfile(sys.argv[0])
+            
+            if params["erase"]:
+                self.prof.erase()
+            self.debugMod.__dict__['__file__'] = sys.argv[0]
+            sys.modules['__main__'] = self.debugMod
+            fp = open(sys.argv[0], encoding=self.__coding)
+            try:
+                script = fp.read()
+            finally:
+                fp.close()
+            if script:
+                if not script.endswith('\n'):
+                    script += '\n'
+                self.running = sys.argv[0]
+                res = 0
+                try:
+                    self.prof.run(script)
+                except SystemExit as exc:
+                    res = exc.code
+                    atexit._run_exitfuncs()
+                self.prof.save()
+                self.writestream.flush()
+                self.progTerminated(res)
+            return
+        
+        if method == "ExecuteStatement":
+            if self.buffer:
+                self.buffer = self.buffer + '\n' + params["statement"]
+            else:
+                self.buffer = params["statement"]
+
+            try:
+                code = self.compile_command(self.buffer, self.readstream.name)
+            except (OverflowError, SyntaxError, ValueError):
+                # Report the exception
+                sys.last_type, sys.last_value, sys.last_traceback = \
+                    sys.exc_info()
+                for l in traceback.format_exception_only(
+                        sys.last_type, sys.last_value):
+                    self.write(l)
+                self.buffer = ''
+            else:
+                if code is None:
+                    self.__sendJsonCommand("ResponseContinue", {})
+                    return
+                else:
+                    self.buffer = ''
+
+                    try:
+                        if self.running is None:
+                            exec(code, self.debugMod.__dict__)
+                        else:
+                            if self.currentThread is None:
+                                # program has terminated
+                                self.running = None
+                                _globals = self.debugMod.__dict__
+                                _locals = _globals
+                            else:
+                                cf = self.currentThread.getCurrentFrame()
+                                # program has terminated
+                                if cf is None:
+                                    self.running = None
+                                    _globals = self.debugMod.__dict__
+                                    _locals = _globals
+                                else:
+                                    frmnr = self.framenr
+                                    while cf is not None and frmnr > 0:
+                                        cf = cf.f_back
+                                        frmnr -= 1
+                                    _globals = cf.f_globals
+                                    _locals = \
+                                        self.currentThread.getFrameLocals(
+                                            self.framenr)
+                            # reset sys.stdout to our redirector
+                            # (unconditionally)
+                            if "sys" in _globals:
+                                __stdout = _globals["sys"].stdout
+                                _globals["sys"].stdout = self.writestream
+                                exec(code, _globals, _locals)
+                                _globals["sys"].stdout = __stdout
+                            elif "sys" in _locals:
+                                __stdout = _locals["sys"].stdout
+                                _locals["sys"].stdout = self.writestream
+                                exec(code, _globals, _locals)
+                                _locals["sys"].stdout = __stdout
+                            else:
+                                exec(code, _globals, _locals)
+                            
+                            self.currentThread.storeFrameLocals(self.framenr)
+                    except SystemExit as exc:
+                        self.progTerminated(exc.code)
+                    except Exception:
+                        # Report the exception and the traceback
+                        try:
+                            exc_type, exc_value, exc_tb = sys.exc_info()
+                            sys.last_type = exc_type
+                            sys.last_value = exc_value
+                            sys.last_traceback = exc_tb
+                            tblist = traceback.extract_tb(exc_tb)
+                            del tblist[:1]
+                            list = traceback.format_list(tblist)
+                            if list:
+                                list.insert(0, "Traceback (innermost last):\n")
+                                list[len(list):] = \
+                                    traceback.format_exception_only(
+                                        exc_type, exc_value)
+                        finally:
+                            tblist = exc_tb = None
+
+                        for l in list:
+                            self.write(l)
+            
+            self.__sendJsonCommand("ResponseOK", {})
+            return
+        
+        if method == "RequestStep":
+            self.currentThread.step(True)
+            self.eventExit = True
+            return
+
+        if method == "RequestStepOver":
+            self.currentThread.step(False)
+            self.eventExit = True
+            return
+        
+        if method == "RequestStepOut":
+            self.currentThread.stepOut()
+            self.eventExit = True
+            return
+        
+        if method == "RequestStepQuit":
+            if self.passive:
+                self.progTerminated(42)
+            else:
+                self.set_quit()
+                self.eventExit = True
+            return
+        
+        if method == "RequestContinue":
+            self.currentThread.go(params["special"])
+            self.eventExit = True
+            return
+        
+        if method == "RawInput":
+            # If we are handling raw mode input then reset the mode and break out
+            # of the current event loop.
+##        if self.inRawMode:
+##            self.inRawMode = False
+            self.rawLine = params["input"]
+            self.eventExit = True
+            return
+
     
     def __sendJsonCommand(self, command, params):
         """

eric ide

mercurial