--- a/eric6/DebugClients/Python/DebugClientBase.py Sun Jul 05 11:11:24 2020 +0200 +++ b/eric6/DebugClients/Python/DebugClientBase.py Sun Oct 18 12:35:30 2020 +0200 @@ -19,10 +19,8 @@ import atexit import signal import time -if sys.version_info >= (3, 4): - import types -else: - import imp +import types +import importlib import DebugClientCapabilities @@ -166,10 +164,7 @@ self.framenr = 0 # The context to run the debugged program in. - if sys.version_info >= (3, 4): - self.debugMod = types.ModuleType("__main__") - else: - self.debugMod = imp.new_module('__main__') + self.debugMod = types.ModuleType('__main__') self.debugMod.__dict__['__builtins__'] = __builtins__ # The list of complete lines to execute. @@ -200,6 +195,7 @@ self.callTraceEnabled = None + self.compile_command = codeop.CommandCompiler() self.coding_re = re.compile(r"coding[:=]\s*([-\w_.]+)") @@ -228,11 +224,10 @@ else: default = 'utf-8' try: - f = open(filename, 'rb') - # read the first and second line - text = f.readline() - text = "{0}{1}".format(text, f.readline()) - f.close() + with open(filename, 'rb') as f: + # read the first and second line + text = f.readline() + text = "{0}{1}".format(text, f.readline()) except IOError: self.__coding = default return @@ -372,6 +367,16 @@ "stack": stack, }) + elif method == "RequestDisassembly": + if self.disassembly is not None: + self.sendJsonCommand("ResponseDisassembly", { + "disassembly": self.disassembly + }) + else: + self.sendJsonCommand("ResponseDisassembly", { + "disassembly": {} + }) + elif method == "RequestCapabilities": clientType = "Python3" self.sendJsonCommand("ResponseCapabilities", { @@ -413,6 +418,7 @@ elif method == "RequestLoad": self._fncache = {} self.dircache = [] + self.disassembly = None sys.argv = [] self.__setCoding(params["filename"]) sys.argv.append(params["filename"]) @@ -454,6 +460,7 @@ self.mainThread.run(code, self.debugMod.__dict__, debug=True) elif method == "RequestRun": + self.disassembly = None sys.argv = [] self.__setCoding(params["filename"]) sys.argv.append(params["filename"]) @@ -489,6 +496,7 @@ elif method == "RequestCoverage": from coverage import Coverage + self.disassembly = None sys.argv = [] self.__setCoding(params["filename"]) sys.argv.append(params["filename"]) @@ -525,6 +533,7 @@ elif method == "RequestProfile": sys.setprofile(None) import PyProfile + self.disassembly = None sys.argv = [] self.__setCoding(params["filename"]) sys.argv.append(params["filename"]) @@ -850,14 +859,9 @@ discoveryStart, top_level_dir=top_level_dir) else: if params["filename"]: - if sys.version_info >= (3, 4): - import importlib - spec = importlib.util.spec_from_file_location( - params["testname"], params["filename"]) - utModule = importlib.util.module_from_spec(spec) - else: - utModule = imp.load_source( - params["testname"], params["filename"]) + spec = importlib.util.spec_from_file_location( + params["testname"], params["filename"]) + utModule = importlib.util.module_from_spec(spec) else: utModule = None if params["failed"]: @@ -904,6 +908,7 @@ elif method == "RequestUTRun": from DCTestResult import DCTestResult + self.disassembly = None self.testResult = DCTestResult(self, params["failfast"]) if self.cover: self.cover.start() @@ -965,6 +970,16 @@ ) return testCases + def setDisassembly(self, disassembly): + """ + Public method to store a disassembly of the code object raising an + exception. + + @param disassembly dictionary containing the disassembly information + @type dict + """ + self.disassembly = disassembly + def sendJsonCommand(self, method, params): """ Public method to send a single command or response to the IDE. @@ -1696,7 +1711,7 @@ ("internalId", "int", "{0}".format(value.internalId()))) varlist.append(("internalPointer", "void *", "{0}".format(value.internalPointer()))) - elif qttype == 'QRegExp': + elif qttype in ('QRegExp', "QRegularExpression"): varlist.append(("pattern", "str", "{0}".format(value.pattern()))) # GUI stuff