30 |
30 |
31 class PythonDisViewerModes(enum.Enum): |
31 class PythonDisViewerModes(enum.Enum): |
32 """ |
32 """ |
33 Class implementing the disassembly viewer operation modes. |
33 Class implementing the disassembly viewer operation modes. |
34 """ |
34 """ |
35 SourceDisassemblyMode = 0 |
35 SOURCEDISASSEMBLY = 0 |
36 TracebackMode = 1 |
36 TRACEBACK = 1 |
37 |
37 |
38 |
38 |
39 class PythonDisViewer(QWidget, Ui_PythonDisViewer): |
39 class PythonDisViewer(QWidget, Ui_PythonDisViewer): |
40 """ |
40 """ |
41 Class implementing a widget to visualize the Python Disassembly for some |
41 Class implementing a widget to visualize the Python Disassembly for some |
44 StartLineRole = Qt.ItemDataRole.UserRole |
44 StartLineRole = Qt.ItemDataRole.UserRole |
45 EndLineRole = Qt.ItemDataRole.UserRole + 1 |
45 EndLineRole = Qt.ItemDataRole.UserRole + 1 |
46 CodeInfoRole = Qt.ItemDataRole.UserRole + 2 |
46 CodeInfoRole = Qt.ItemDataRole.UserRole + 2 |
47 |
47 |
48 def __init__(self, viewmanager, |
48 def __init__(self, viewmanager, |
49 mode=PythonDisViewerModes.SourceDisassemblyMode, |
49 mode=PythonDisViewerModes.SOURCEDISASSEMBLY, |
50 parent=None): |
50 parent=None): |
51 """ |
51 """ |
52 Constructor |
52 Constructor |
53 |
53 |
54 @param viewmanager reference to the viewmanager object |
54 @param viewmanager reference to the viewmanager object |
76 self.tr("Parameters"), self.tr("Interpreted Parameters")]) |
76 self.tr("Parameters"), self.tr("Interpreted Parameters")]) |
77 self.codeInfoWidget.setHeaderLabels( |
77 self.codeInfoWidget.setHeaderLabels( |
78 [self.tr("Key"), self.tr("Value")]) |
78 [self.tr("Key"), self.tr("Value")]) |
79 |
79 |
80 self.__disMenu = QMenu(self.disWidget) |
80 self.__disMenu = QMenu(self.disWidget) |
81 if self.__mode == PythonDisViewerModes.SourceDisassemblyMode: |
81 if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY: |
82 self.__codeInfoAct = self.__disMenu.addAction( |
82 self.__codeInfoAct = self.__disMenu.addAction( |
83 self.tr("Show Code Info"), self.__showCodeInfo) |
83 self.tr("Show Code Info"), self.__showCodeInfo) |
84 self.__disMenu.addSeparator() |
84 self.__disMenu.addSeparator() |
85 self.__disMenu.addAction( |
85 self.__disMenu.addAction( |
86 self.tr('Expand All'), self.__expandAllDis) |
86 self.tr('Expand All'), self.__expandAllDis) |
89 self.__disMenu.addSeparator() |
89 self.__disMenu.addSeparator() |
90 self.__disMenu.addAction( |
90 self.__disMenu.addAction( |
91 self.tr('Configure...'), self.__configure) |
91 self.tr('Configure...'), self.__configure) |
92 |
92 |
93 self.__codeInfoMenu = QMenu(self.codeInfoWidget) |
93 self.__codeInfoMenu = QMenu(self.codeInfoWidget) |
94 if self.__mode == PythonDisViewerModes.SourceDisassemblyMode: |
94 if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY: |
95 self.__codeInfoMenu.addAction( |
95 self.__codeInfoMenu.addAction( |
96 self.tr("Hide"), self.codeInfoWidget.hide) |
96 self.tr("Hide"), self.codeInfoWidget.hide) |
97 self.__codeInfoMenu.addAction( |
97 self.__codeInfoMenu.addAction( |
98 self.tr('Expand All'), self.__expandAllCodeInfo) |
98 self.tr('Expand All'), self.__expandAllCodeInfo) |
99 self.__codeInfoMenu.addAction( |
99 self.__codeInfoMenu.addAction( |
110 Preferences.getPython("DisViewerLabeledColor")) |
110 Preferences.getPython("DisViewerLabeledColor")) |
111 |
111 |
112 self.__showCodeInfoDetails = Preferences.getPython( |
112 self.__showCodeInfoDetails = Preferences.getPython( |
113 "DisViewerExpandCodeInfoDetails") |
113 "DisViewerExpandCodeInfoDetails") |
114 |
114 |
115 if self.__mode == PythonDisViewerModes.SourceDisassemblyMode: |
115 if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY: |
116 self.disWidget.itemClicked.connect(self.__disItemClicked) |
116 self.disWidget.itemClicked.connect(self.__disItemClicked) |
117 self.disWidget.itemCollapsed.connect(self.__resizeDisColumns) |
117 self.disWidget.itemCollapsed.connect(self.__resizeDisColumns) |
118 self.disWidget.itemExpanded.connect(self.__resizeDisColumns) |
118 self.disWidget.itemExpanded.connect(self.__resizeDisColumns) |
119 self.disWidget.customContextMenuRequested.connect( |
119 self.disWidget.customContextMenuRequested.connect( |
120 self.__disContextMenuRequested) |
120 self.__disContextMenuRequested) |
122 self.codeInfoWidget.itemCollapsed.connect(self.__resizeCodeInfoColumns) |
122 self.codeInfoWidget.itemCollapsed.connect(self.__resizeCodeInfoColumns) |
123 self.codeInfoWidget.itemExpanded.connect(self.__resizeCodeInfoColumns) |
123 self.codeInfoWidget.itemExpanded.connect(self.__resizeCodeInfoColumns) |
124 self.codeInfoWidget.customContextMenuRequested.connect( |
124 self.codeInfoWidget.customContextMenuRequested.connect( |
125 self.__codeInfoContextMenuRequested) |
125 self.__codeInfoContextMenuRequested) |
126 |
126 |
127 if self.__mode == PythonDisViewerModes.SourceDisassemblyMode: |
127 if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY: |
128 self.__vm.disViewerStateChanged.connect( |
128 self.__vm.disViewerStateChanged.connect( |
129 self.__disViewerStateChanged) |
129 self.__disViewerStateChanged) |
130 |
130 |
131 self.codeInfoWidget.hide() |
131 self.codeInfoWidget.hide() |
132 self.hide() |
132 self.hide() |
133 |
133 |
134 elif self.__mode == PythonDisViewerModes.TracebackMode: |
134 elif self.__mode == PythonDisViewerModes.TRACEBACK: |
135 self.__styleLabels() |
135 self.__styleLabels() |
136 |
136 |
137 def __disContextMenuRequested(self, coord): |
137 def __disContextMenuRequested(self, coord): |
138 """ |
138 """ |
139 Private slot to show the context menu of the disassembly widget. |
139 Private slot to show the context menu of the disassembly widget. |
140 |
140 |
141 @param coord position of the mouse pointer |
141 @param coord position of the mouse pointer |
142 @type QPoint |
142 @type QPoint |
143 """ |
143 """ |
144 if self.__mode == PythonDisViewerModes.SourceDisassemblyMode: |
144 if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY: |
145 itm = self.disWidget.itemAt(coord) |
145 itm = self.disWidget.itemAt(coord) |
146 self.__codeInfoAct.setEnabled(bool(itm.data(0, self.CodeInfoRole))) |
146 self.__codeInfoAct.setEnabled(bool(itm.data(0, self.CodeInfoRole))) |
147 self.disWidget.setCurrentItem(itm) |
147 self.disWidget.setCurrentItem(itm) |
148 |
148 |
149 if self.disWidget.topLevelItemCount() > 0: |
149 if self.disWidget.topLevelItemCount() > 0: |
215 Public slot to show the DIS viewer. |
215 Public slot to show the DIS viewer. |
216 """ |
216 """ |
217 super().show() |
217 super().show() |
218 |
218 |
219 if ( |
219 if ( |
220 self.__mode == PythonDisViewerModes.SourceDisassemblyMode and |
220 self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY and |
221 not self.__vmConnected |
221 not self.__vmConnected |
222 ): |
222 ): |
223 self.__vm.editorChangedEd.connect(self.__editorChanged) |
223 self.__vm.editorChangedEd.connect(self.__editorChanged) |
224 self.__vm.editorSavedEd.connect(self.__editorSaved) |
224 self.__vm.editorSavedEd.connect(self.__editorSaved) |
225 self.__vm.editorLineChangedEd.connect(self.__editorLineChanged) |
225 self.__vm.editorLineChangedEd.connect(self.__editorLineChanged) |
237 |
237 |
238 if self.__editor: |
238 if self.__editor: |
239 self.__editor.clearAllHighlights() |
239 self.__editor.clearAllHighlights() |
240 |
240 |
241 if ( |
241 if ( |
242 self.__mode == PythonDisViewerModes.SourceDisassemblyMode and |
242 self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY and |
243 self.__vmConnected |
243 self.__vmConnected |
244 ): |
244 ): |
245 self.__vm.editorChangedEd.disconnect(self.__editorChanged) |
245 self.__vm.editorChangedEd.disconnect(self.__editorChanged) |
246 self.__vm.editorSavedEd.disconnect(self.__editorSaved) |
246 self.__vm.editorSavedEd.disconnect(self.__editorSaved) |
247 self.__vm.editorLineChangedEd.disconnect(self.__editorLineChanged) |
247 self.__vm.editorLineChangedEd.disconnect(self.__editorLineChanged) |
260 Private slot to toggle the display of the Disassembly viewer. |
260 Private slot to toggle the display of the Disassembly viewer. |
261 |
261 |
262 @param on flag indicating to show the Disassembly |
262 @param on flag indicating to show the Disassembly |
263 @type bool |
263 @type bool |
264 """ |
264 """ |
265 if self.__mode == PythonDisViewerModes.SourceDisassemblyMode: |
265 if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY: |
266 editor = self.__vm.activeWindow() |
266 editor = self.__vm.activeWindow() |
267 if on: |
267 if on: |
268 if editor is not self.__editor: |
268 if editor is not self.__editor: |
269 self.__editor = editor |
269 self.__editor = editor |
270 self.show() |
270 self.show() |
442 def __loadDIS(self): |
442 def __loadDIS(self): |
443 """ |
443 """ |
444 Private method to generate the Disassembly from the source of the |
444 Private method to generate the Disassembly from the source of the |
445 current editor and visualize it. |
445 current editor and visualize it. |
446 """ |
446 """ |
447 if self.__mode != PythonDisViewerModes.SourceDisassemblyMode: |
447 if self.__mode != PythonDisViewerModes.SOURCEDISASSEMBLY: |
448 # wrong mode, just return |
448 # wrong mode, just return |
449 return |
449 return |
450 |
450 |
451 if not self.__editor: |
451 if not self.__editor: |
452 self.__createErrorItem(self.tr( |
452 self.__createErrorItem(self.tr( |
499 |
499 |
500 @param disassembly dictionary containing the disassembly information |
500 @param disassembly dictionary containing the disassembly information |
501 @type dict |
501 @type dict |
502 """ |
502 """ |
503 if ( |
503 if ( |
504 self.__mode == PythonDisViewerModes.TracebackMode and |
504 self.__mode == PythonDisViewerModes.TRACEBACK and |
505 disassembly and |
505 disassembly and |
506 "instructions" in disassembly and |
506 "instructions" in disassembly and |
507 disassembly["instructions"] |
507 disassembly["instructions"] |
508 ): |
508 ): |
509 self.disWidget.clear() |
509 self.disWidget.clear() |