eric6/DebugClients/Python/DebugClientBase.py

branch
multi_processing
changeset 7802
eefe954f01e8
parent 7646
39e3db2b4936
parent 7785
9978016560ec
child 7818
5c9271c2f662
equal deleted inserted replaced
7646:39e3db2b4936 7802:eefe954f01e8
17 import json 17 import json
18 import re 18 import re
19 import atexit 19 import atexit
20 import signal 20 import signal
21 import time 21 import time
22 if sys.version_info >= (3, 4): 22 import types
23 import types 23 import importlib
24 else:
25 import imp
26 24
27 25
28 import DebugClientCapabilities 26 import DebugClientCapabilities
29 import DebugVariables 27 import DebugVariables
30 from DebugBase import setRecursionLimit, printerr # __IGNORE_WARNING__ 28 from DebugBase import setRecursionLimit, printerr # __IGNORE_WARNING__
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())))

eric ide

mercurial