added: #unloadSelectedModuleRemoveConnectedObjects:
changed:
#showInfoForNonClassLib:
#unloadSelectedModule
#unloadSelectedModuleAndRemoveClasses
#unloadSelectedModuleRemoveClasses:
When unloading an ObjectFileHandle, use ObjectFileHandle instance methods
instead of ObjectFileLoader's class methods.
Now can uninstall the method's code befor unloading a method ObjectFileHandle
--- a/Tools__ObjectModuleInformation.st Fri Apr 09 11:21:12 2010 +0200
+++ b/Tools__ObjectModuleInformation.st Fri Apr 16 19:20:25 2010 +0200
@@ -986,7 +986,7 @@
!
showInfoForNonClassLib:sel
- " selected a method, cObject or unknown "
+ "selected a method, cObject or unknown"
|module fileName list entry|
@@ -1002,7 +1002,9 @@
self canUnloadSelectedDLL value:true.
module isMethodHandle ifTrue:[
- |method nm entry1 entry2 entry3|
+ |method nm entry entries|
+
+ self canUnloadSelectedModule value:self readOnly not.
self middleLabelHolder value:'Compiled Method:'.
@@ -1024,16 +1026,22 @@
nm := (method whoString) colorizeAllWith:Color blue.
].
- entry1 := InfoRow new.
- entry1 name:'Compiled method'; value:nm.
+ entries := OrderedCollection new.
+ entry := InfoRow new.
+ entry name:'Compiled method'; value:nm.
+ entries add:entry.
- entry2 := InfoRow new.
- entry2 name:'Path'; value:fileName.
+ entry := InfoRow new.
+ entry name:'Path'; value:fileName.
+ entries add:entry.
- entry3 := InfoRow new.
- entry3 name:'Address'; value:('(16r) ' , (method code address hexPrintString leftPaddedTo:8 with:$0)).
+ (method notNil and:[method code notNil]) ifTrue:[
+ entry := InfoRow new.
+ entry name:'Address'; value:('(16r) ' , (method code address hexPrintString leftPaddedTo:8 with:$0)).
+ entries add:entry.
+ ].
- self infoTable2ListHolder value:(Array with:entry1 with:entry2 with:entry3).
+ self infoTable2ListHolder value:entries.
self table1VisibleHolder value:false.
self table2VisibleHolder value:true.
^ self.
@@ -1311,55 +1319,37 @@
!
unloadSelectedModule
- self unloadSelectedModuleRemoveClasses:false
+ self unloadSelectedModuleRemoveConnectedObjects:false
!
unloadSelectedModuleAndRemoveClasses
- self unloadSelectedModuleRemoveClasses:true
+ self unloadSelectedModuleRemoveConnectedObjects:true
!
-unloadSelectedModuleRemoveClasses:doRemoveClasses
- |module dll|
+unloadSelectedModuleRemoveConnectedObjects:doRemoveClasses
+ |module handle|
module := allModules at:self selectedModuleIndex ifAbsent:nil.
- module isNil ifTrue:[
- dll := objectHandles at:self selectedModuleIndex ifAbsent:nil.
- ].
module notNil ifTrue:[
(Dialog
confirm:'This is a possibly dangerous operation, as the DLL is unloaded without caring for
proper package-deinstallation procedures. Please use this only in repair situations and when the
regular unloadPackage operation fails.
-Continue ?')
- ifFalse:[
- ^ self
- ].
+Continue ?')
+ ifFalse:[ ^ self ].
].
-
- self withWaitCursorDo:[
- |info idx handle pathName|
-
- info := self selectedModuleInfo.
- handle := objectHandles at:(self selectedModuleIndex).
- self selectedModuleIndexHolder value:nil.
-
- info isNil ifTrue:[
- "/ selected a method/dll
- "/ idx := idx - allModules size.
- pathName := handle pathName.
- ] ifFalse:[
- "/ selected a package
- pathName := info pathName.
- ].
- pathName notNil ifTrue:[
- doRemoveClasses ifTrue:[
- ObjectFileLoader unloadObjectFileAndRemoveClasses:pathName.
- ] ifFalse:[
- ObjectFileLoader unloadObjectFile:pathName.
- ]
- ].
- self updateModuleList.
+ handle := objectHandles at:self selectedModuleIndex ifAbsent:nil.
+ handle notNil ifTrue:[
+ self
+ withWaitCursorDo:[
+ self selectedModuleIndexHolder value:nil.
+ doRemoveClasses ifTrue:[
+ handle removeConnectedObjects.
+ ].
+ handle unload.
+ self updateModuleList.
+ ].
]
!