164 # special objects representing the main scripts thread and frame |
162 # special objects representing the main scripts thread and frame |
165 self.mainThread = self |
163 self.mainThread = self |
166 self.framenr = 0 |
164 self.framenr = 0 |
167 |
165 |
168 # The context to run the debugged program in. |
166 # The context to run the debugged program in. |
169 if sys.version_info >= (3, 4): |
167 self.debugMod = types.ModuleType('__main__') |
170 self.debugMod = types.ModuleType("__main__") |
|
171 else: |
|
172 self.debugMod = imp.new_module('__main__') |
|
173 self.debugMod.__dict__['__builtins__'] = __builtins__ |
168 self.debugMod.__dict__['__builtins__'] = __builtins__ |
174 |
169 |
175 # The list of complete lines to execute. |
170 # The list of complete lines to execute. |
176 self.buffer = '' |
171 self.buffer = '' |
177 |
172 |
198 |
193 |
199 self.__debuggerId = "" |
194 self.__debuggerId = "" |
200 |
195 |
201 self.callTraceEnabled = None |
196 self.callTraceEnabled = None |
202 |
197 |
|
198 |
203 self.compile_command = codeop.CommandCompiler() |
199 self.compile_command = codeop.CommandCompiler() |
204 |
200 |
205 self.coding_re = re.compile(r"coding[:=]\s*([-\w_.]+)") |
201 self.coding_re = re.compile(r"coding[:=]\s*([-\w_.]+)") |
206 self.defaultCoding = 'utf-8' |
202 self.defaultCoding = 'utf-8' |
207 self.__coding = self.defaultCoding |
203 self.__coding = self.defaultCoding |
226 if self.noencoding: |
222 if self.noencoding: |
227 self.__coding = sys.getdefaultencoding() |
223 self.__coding = sys.getdefaultencoding() |
228 else: |
224 else: |
229 default = 'utf-8' |
225 default = 'utf-8' |
230 try: |
226 try: |
231 f = open(filename, 'rb') |
227 with open(filename, 'rb') as f: |
232 # read the first and second line |
228 # read the first and second line |
233 text = f.readline() |
229 text = f.readline() |
234 text = "{0}{1}".format(text, f.readline()) |
230 text = "{0}{1}".format(text, f.readline()) |
235 f.close() |
|
236 except IOError: |
231 except IOError: |
237 self.__coding = default |
232 self.__coding = default |
238 return |
233 return |
239 |
234 |
240 for line in text.splitlines(): |
235 for line in text.splitlines(): |
370 stack = self.currentThread.getStack() |
365 stack = self.currentThread.getStack() |
371 self.sendJsonCommand("ResponseStack", { |
366 self.sendJsonCommand("ResponseStack", { |
372 "stack": stack, |
367 "stack": stack, |
373 }) |
368 }) |
374 |
369 |
|
370 elif method == "RequestDisassembly": |
|
371 if self.disassembly is not None: |
|
372 self.sendJsonCommand("ResponseDisassembly", { |
|
373 "disassembly": self.disassembly |
|
374 }) |
|
375 else: |
|
376 self.sendJsonCommand("ResponseDisassembly", { |
|
377 "disassembly": {} |
|
378 }) |
|
379 |
375 elif method == "RequestCapabilities": |
380 elif method == "RequestCapabilities": |
376 clientType = "Python3" |
381 clientType = "Python3" |
377 self.sendJsonCommand("ResponseCapabilities", { |
382 self.sendJsonCommand("ResponseCapabilities", { |
378 "capabilities": self.__clientCapabilities(), |
383 "capabilities": self.__clientCapabilities(), |
379 "clientType": clientType |
384 "clientType": clientType |
411 os.environ[key] = value |
416 os.environ[key] = value |
412 |
417 |
413 elif method == "RequestLoad": |
418 elif method == "RequestLoad": |
414 self._fncache = {} |
419 self._fncache = {} |
415 self.dircache = [] |
420 self.dircache = [] |
|
421 self.disassembly = None |
416 sys.argv = [] |
422 sys.argv = [] |
417 self.__setCoding(params["filename"]) |
423 self.__setCoding(params["filename"]) |
418 sys.argv.append(params["filename"]) |
424 sys.argv.append(params["filename"]) |
419 sys.argv.extend(params["argv"]) |
425 sys.argv.extend(params["argv"]) |
420 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
426 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
452 if code: |
458 if code: |
453 sys.setprofile(self.callTraceEnabled) |
459 sys.setprofile(self.callTraceEnabled) |
454 self.mainThread.run(code, self.debugMod.__dict__, debug=True) |
460 self.mainThread.run(code, self.debugMod.__dict__, debug=True) |
455 |
461 |
456 elif method == "RequestRun": |
462 elif method == "RequestRun": |
|
463 self.disassembly = None |
457 sys.argv = [] |
464 sys.argv = [] |
458 self.__setCoding(params["filename"]) |
465 self.__setCoding(params["filename"]) |
459 sys.argv.append(params["filename"]) |
466 sys.argv.append(params["filename"]) |
460 sys.argv.extend(params["argv"]) |
467 sys.argv.extend(params["argv"]) |
461 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
468 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
487 if code: |
494 if code: |
488 self.mainThread.run(code, self.debugMod.__dict__, debug=False) |
495 self.mainThread.run(code, self.debugMod.__dict__, debug=False) |
489 |
496 |
490 elif method == "RequestCoverage": |
497 elif method == "RequestCoverage": |
491 from coverage import Coverage |
498 from coverage import Coverage |
|
499 self.disassembly = None |
492 sys.argv = [] |
500 sys.argv = [] |
493 self.__setCoding(params["filename"]) |
501 self.__setCoding(params["filename"]) |
494 sys.argv.append(params["filename"]) |
502 sys.argv.append(params["filename"]) |
495 sys.argv.extend(params["argv"]) |
503 sys.argv.extend(params["argv"]) |
496 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
504 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
523 self.cover.save() |
531 self.cover.save() |
524 |
532 |
525 elif method == "RequestProfile": |
533 elif method == "RequestProfile": |
526 sys.setprofile(None) |
534 sys.setprofile(None) |
527 import PyProfile |
535 import PyProfile |
|
536 self.disassembly = None |
528 sys.argv = [] |
537 sys.argv = [] |
529 self.__setCoding(params["filename"]) |
538 self.__setCoding(params["filename"]) |
530 sys.argv.append(params["filename"]) |
539 sys.argv.append(params["filename"]) |
531 sys.argv.extend(params["argv"]) |
540 sys.argv.extend(params["argv"]) |
532 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
541 sys.path = self.__getSysPath(os.path.dirname(sys.argv[0])) |
848 else: |
857 else: |
849 self.test = testLoader.discover( |
858 self.test = testLoader.discover( |
850 discoveryStart, top_level_dir=top_level_dir) |
859 discoveryStart, top_level_dir=top_level_dir) |
851 else: |
860 else: |
852 if params["filename"]: |
861 if params["filename"]: |
853 if sys.version_info >= (3, 4): |
862 spec = importlib.util.spec_from_file_location( |
854 import importlib |
863 params["testname"], params["filename"]) |
855 spec = importlib.util.spec_from_file_location( |
864 utModule = importlib.util.module_from_spec(spec) |
856 params["testname"], params["filename"]) |
|
857 utModule = importlib.util.module_from_spec(spec) |
|
858 else: |
|
859 utModule = imp.load_source( |
|
860 params["testname"], params["filename"]) |
|
861 else: |
865 else: |
862 utModule = None |
866 utModule = None |
863 if params["failed"]: |
867 if params["failed"]: |
864 if utModule: |
868 if utModule: |
865 failed = [t.split(".", 1)[1] |
869 failed = [t.split(".", 1)[1] |
902 "message": "", |
906 "message": "", |
903 }) |
907 }) |
904 |
908 |
905 elif method == "RequestUTRun": |
909 elif method == "RequestUTRun": |
906 from DCTestResult import DCTestResult |
910 from DCTestResult import DCTestResult |
|
911 self.disassembly = None |
907 self.testResult = DCTestResult(self, params["failfast"]) |
912 self.testResult = DCTestResult(self, params["failfast"]) |
908 if self.cover: |
913 if self.cover: |
909 self.cover.start() |
914 self.cover.start() |
910 self.debugging = params["debug"] |
915 self.debugging = params["debug"] |
911 if params["debug"]: |
916 if params["debug"]: |
962 test.__module__.replace(".", os.sep) + ".py") |
967 test.__module__.replace(".", os.sep) + ".py") |
963 testCases.append( |
968 testCases.append( |
964 (test.id(), test.shortDescription(), filename) |
969 (test.id(), test.shortDescription(), filename) |
965 ) |
970 ) |
966 return testCases |
971 return testCases |
|
972 |
|
973 def setDisassembly(self, disassembly): |
|
974 """ |
|
975 Public method to store a disassembly of the code object raising an |
|
976 exception. |
|
977 |
|
978 @param disassembly dictionary containing the disassembly information |
|
979 @type dict |
|
980 """ |
|
981 self.disassembly = disassembly |
967 |
982 |
968 def sendJsonCommand(self, method, params): |
983 def sendJsonCommand(self, method, params): |
969 """ |
984 """ |
970 Public method to send a single command or response to the IDE. |
985 Public method to send a single command or response to the IDE. |
971 |
986 |
1694 varlist.append(("column", "int", "{0}".format(value.column()))) |
1709 varlist.append(("column", "int", "{0}".format(value.column()))) |
1695 varlist.append( |
1710 varlist.append( |
1696 ("internalId", "int", "{0}".format(value.internalId()))) |
1711 ("internalId", "int", "{0}".format(value.internalId()))) |
1697 varlist.append(("internalPointer", "void *", |
1712 varlist.append(("internalPointer", "void *", |
1698 "{0}".format(value.internalPointer()))) |
1713 "{0}".format(value.internalPointer()))) |
1699 elif qttype == 'QRegExp': |
1714 elif qttype in ('QRegExp', "QRegularExpression"): |
1700 varlist.append(("pattern", "str", "{0}".format(value.pattern()))) |
1715 varlist.append(("pattern", "str", "{0}".format(value.pattern()))) |
1701 |
1716 |
1702 # GUI stuff |
1717 # GUI stuff |
1703 elif qttype == 'QAction': |
1718 elif qttype == 'QAction': |
1704 varlist.append(("name", "str", "{0}".format(value.objectName()))) |
1719 varlist.append(("name", "str", "{0}".format(value.objectName()))) |