--- 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): """