added: #unloadSelectedModuleRemoveConnectedObjects:
authorStefan Vogel <sv@exept.de>
Fri, 16 Apr 2010 19:20:25 +0200
changeset 2773 a3e5bbb440f4
parent 2772 647f186ccb22
child 2774 14d44daed89a
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
Tools__ObjectModuleInformation.st
--- 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.
+            ].
     ]
 !