1 "{ Package: 'stx:libtool2' }"
5 ToolApplicationModel subclass:#ObjectModuleInformation
6 instanceVariableNames:'readOnly listOfModuleNames selectedModuleIndexHolder allModules
7 objectHandles showOthers showCObjects showBuiltIn showMethods
8 showClassLibs table1VisibleHolder table2VisibleHolder
9 selectedInfoIndexHolder canBrowseSelectedModule
10 canUnloadSelectedModule classNamesShown classInfoShown
14 category:'Monitors-ST/X'
17 Object subclass:#InfoRow
18 instanceVariableNames:'name version date value'
21 privateIn:ObjectModuleInformation
24 !ObjectModuleInformation class methodsFor:'documentation'!
28 Shows the modules (dll's) of ST/X.
29 Both builtIn modules, and dynamically loaded modules are listed.
38 Starting the application:
40 ObjectModuleInformation open
46 !ObjectModuleInformation class methodsFor:'info'!
49 ^ 'Object Module Info'
51 "Created: / 05-10-2007 / 11:56:59 / cg"
54 !ObjectModuleInformation class methodsFor:'interface specs'!
57 "This resource specification was automatically generated
58 by the UIPainter of ST/X."
60 "Do not manually edit this!! If it is corrupted,
61 the UIPainter may not be able to read the specification."
64 UIPainter new openOnClass:Tools::ObjectModuleInformation andSelector:#windowSpec
65 Tools::ObjectModuleInformation new openInterface:#windowSpec
66 Tools::ObjectModuleInformation open
76 label: 'ST/X Module & Version Information'
77 name: 'ST/X Module & Version Information'
79 bounds: (Rectangle 0 0 505 567)
87 layout: (LayoutFrame 0 0 0 0 0 1 30 0)
91 (VariableVerticalPanelSpec
92 name: 'VariableVerticalPanel1'
93 layout: (LayoutFrame 0 0 30 0 0 1 0 1)
99 model: selectedModuleIndexHolder
101 hasHorizontalScrollBar: true
102 hasVerticalScrollBar: true
104 sequenceList: listOfModuleNames
113 layout: (LayoutFrame 0 0 0 0 0 1 30 0)
115 labelChannel: middleLabelHolder
120 layout: (LayoutFrame 0 0 30 0 0 1 0 1)
121 visibilityChannel: table1VisibleHolder
122 model: selectedInfoIndexHolder
124 hasHorizontalScrollBar: true
125 hasVerticalScrollBar: true
126 dataList: infoTable1ListHolder
127 columnHolder: tableColumns
128 separatorOneDColor: (Color 66.999313344015 66.999313344015 66.999313344015)
132 layout: (LayoutFrame 0 0 30 0 0 1 0 1)
133 initiallyInvisible: true
134 visibilityChannel: table2VisibleHolder
135 model: selectedInfoIndexHolder
136 hasHorizontalScrollBar: true
137 hasVerticalScrollBar: true
138 dataList: infoTable2ListHolder
139 columnHolder: tableColumnsForSingleInfo
140 separatorOneDColor: (Color 66.999313344015 66.999313344015 66.999313344015)
149 handles: (Any 0.35195530726257 1.0)
157 !ObjectModuleInformation class methodsFor:'menu specs'!
160 "This resource specification was automatically generated
161 by the MenuEditor of ST/X."
163 "Do not manually edit this!! If it is corrupted,
164 the MenuEditor may not be able to read the specification."
167 MenuEditor new openOnClass:Tools::ObjectModuleInformation andSelector:#mainMenu
168 (Menu new fromLiteralArrayEncoding:(Tools::ObjectModuleInformation mainMenu)) startUp
184 itemValue: closeRequest
201 hideMenuOnActivated: false
202 indication: showBuiltIn
205 label: 'Class Libraries'
207 hideMenuOnActivated: false
208 indication: showClassLibs
213 hideMenuOnActivated: false
214 indication: showMethods
219 hideMenuOnActivated: false
220 indication: showCObjects
225 hideMenuOnActivated: false
226 indication: showOthers
233 itemValue: menuUpdateModuleList
248 enabled: canBrowseSelectedModule
250 itemValue: browseModule
254 enabled: canCopyClassNameList
255 label: 'Copy Version Info to Clipboard'
256 itemValue: copyClassOrVMNameList
263 enabled: canUnloadSelectedModule
265 itemValue: unloadSelectedModule
269 enabled: canUnloadSelectedModule
270 label: 'Remove Classes && Unload'
271 itemValue: unloadSelectedModuleAndRemoveClasses
282 startGroup: conditionalRight
287 label: 'Documentation'
288 itemValue: openDocumentation
295 label: 'About this Application...'
296 itemValue: openAboutThisApplication
311 "This resource specification was automatically generated
312 by the MenuEditor of ST/X."
314 "Do not manually edit this!! If it is corrupted,
315 the MenuEditor may not be able to read the specification."
318 MenuEditor new openOnClass:Tools::ObjectModuleInformation andSelector:#moduleItemMenu
319 (Menu new fromLiteralArrayEncoding:(Tools::ObjectModuleInformation moduleItemMenu)) startUp
328 enabled: canBrowseSelectedClass
330 itemValue: browseClass
337 enabled: canCopyClassNameList
338 label: 'Copy Version Info to Clipboard'
339 itemValue: copyClassOrVMNameList
349 "This resource specification was automatically generated
350 by the MenuEditor of ST/X."
352 "Do not manually edit this!! If it is corrupted,
353 the MenuEditor may not be able to read the specification."
356 MenuEditor new openOnClass:Tools::ObjectModuleInformation andSelector:#moduleMenu
357 (Menu new fromLiteralArrayEncoding:(Tools::ObjectModuleInformation moduleMenu)) startUp
366 enabled: canBrowseSelectedModule
368 itemValue: browseModule
372 enabled: canCopyClassNameList
373 label: 'Copy Version Info to Clipboard'
374 itemValue: copyClassOrVMNameList
381 enabled: canUnloadSelectedModule
382 label: 'Remove Classes && Unload'
383 itemValue: unloadSelectedModuleAndRemoveClasses
387 enabled: canUnloadSelectedModule
389 itemValue: unloadSelectedModule
398 !ObjectModuleInformation class methodsFor:'tableColumns specs'!
401 "This resource specification was automatically generated
402 by the DataSetBuilder of ST/X."
404 "Do not manually edit this!! If it is corrupted,
405 the DataSetBuilder may not be able to read the specification."
408 DataSetBuilder new openOnClass:ObjectModuleInformation andSelector:#tableColumns
411 <resource: #tableColumns>
417 labelButtonType: Button
425 labelButtonType: Button
432 labelButtonType: Button
440 tableColumnsForSingleInfo
441 "This resource specification was automatically generated
442 by the DataSetBuilder of ST/X."
444 "Do not manually edit this!! If it is corrupted,
445 the DataSetBuilder may not be able to read the specification."
448 DataSetBuilder new openOnClass:Tools::ObjectModuleInformation andSelector:#tableColumnsForSingleInfo
451 <resource: #tableColumns>
457 labelButtonType: None
465 labelButtonType: None
473 !ObjectModuleInformation methodsFor:'aspects'!
475 canBrowseSelectedClass
476 ^ [classNamesShown notEmptyOrNil
477 and:[ self selectedInfoIndex notNil
478 and:[ self selectedInfoIndex ~~ 0 ]]]
480 "Modified: / 05-10-2007 / 10:51:39 / cg"
483 canBrowseSelectedModule
484 canBrowseSelectedModule isNil ifTrue:[
485 canBrowseSelectedModule := false asValue
487 ^ canBrowseSelectedModule.
489 "Modified: / 05-10-2007 / 10:51:39 / cg"
493 ^ [table1VisibleHolder value
494 and:[classInfoShown notEmptyOrNil or:[vmInfoShown notEmptyOrNil] ]]
496 "Modified: / 05-10-2007 / 10:51:39 / cg"
499 canUnloadSelectedModule
500 canUnloadSelectedModule isNil ifTrue:[
501 canUnloadSelectedModule := false asValue
503 ^ canUnloadSelectedModule.
505 "Modified: / 05-10-2007 / 10:51:39 / cg"
509 ^ builder valueAspectFor:#'infoTable1ListHolder' initialValue:#()
511 "Created: / 05-10-2007 / 12:48:06 / cg"
515 ^ builder valueAspectFor:#'infoTable2ListHolder' initialValue:#()
517 "Created: / 05-10-2007 / 12:48:10 / cg"
521 listOfModuleNames isNil ifTrue:[
522 listOfModuleNames := List new.
526 "Modified: / 05-10-2007 / 10:49:19 / cg"
530 ^ builder valueAspectFor:#'middleLabelHolder' initialValue:''
532 "Created: / 05-10-2007 / 11:05:08 / cg"
538 "Created: / 05-10-2007 / 13:06:00 / cg"
544 "Created: / 05-10-2007 / 13:05:51 / cg"
550 "Created: / 05-10-2007 / 13:05:51 / cg"
556 sel := self selectedInfoIndexHolder value.
560 selectedInfoIndexHolder
561 selectedInfoIndexHolder isNil ifTrue:[
562 selectedInfoIndexHolder := ValueHolder new.
563 selectedInfoIndexHolder onChangeSend:#selectedInfoIndexChanged to:self.
565 ^ selectedInfoIndexHolder.
567 "Modified: / 05-10-2007 / 10:51:39 / cg"
573 sel := self selectedModuleIndexHolder value.
577 selectedModuleIndexHolder
578 selectedModuleIndexHolder isNil ifTrue:[
579 selectedModuleIndexHolder := ValueHolder new.
580 selectedModuleIndexHolder onChangeSend:#selectedModuleIndexChanged to:self.
582 ^ selectedModuleIndexHolder.
584 "Modified: / 05-10-2007 / 10:51:39 / cg"
588 showBuiltIn isNil ifTrue:[
589 showBuiltIn := true asValue.
590 showBuiltIn onChangeSend:#filterChanged to:self.
594 "Modified: / 05-10-2007 / 12:43:23 / cg"
598 showCObjects isNil ifTrue:[
599 showCObjects := true asValue.
600 showCObjects onChangeSend:#filterChanged to:self.
604 "Modified: / 05-10-2007 / 12:43:16 / cg"
608 showClassLibs isNil ifTrue:[
609 showClassLibs := true asValue.
610 showClassLibs onChangeSend:#filterChanged to:self.
614 "Modified: / 05-10-2007 / 12:43:10 / cg"
618 showMethods isNil ifTrue:[
619 showMethods := true asValue.
620 showMethods onChangeSend:#filterChanged to:self.
624 "Modified: / 05-10-2007 / 12:43:02 / cg"
628 showOthers isNil ifTrue:[
629 showOthers := true asValue.
630 showOthers onChangeSend:#filterChanged to:self.
634 "Modified: / 05-10-2007 / 12:42:54 / cg"
638 table1VisibleHolder isNil ifTrue:[
639 table1VisibleHolder := true asValue.
641 ^ table1VisibleHolder.
643 "Modified: / 05-10-2007 / 12:53:05 / cg"
647 table2VisibleHolder isNil ifTrue:[
648 table2VisibleHolder := false asValue.
650 ^ table2VisibleHolder.
652 "Modified: / 05-10-2007 / 12:53:14 / cg"
655 !ObjectModuleInformation methodsFor:'change & update'!
657 selectedInfoIndexChanged
663 sel := self selectedModuleIndex.
664 sel isNil ifTrue:[^ nil].
665 ^ objectHandles at:sel.
668 selectedModuleIndexChanged
671 info := self selectedModuleInfo.
672 module := self selectedModule.
674 self canBrowseSelectedModule value:(info notNil and:[info ~~ #VM and:[module notNil]]).
675 self canUnloadSelectedModule value:(self readOnly not and:[info ~~ #VM and:[info notNil and:[info dynamic]]]).
677 classNamesShown := nil.
678 classInfoShown := nil.
682 "/ selected a method, cObject or unknown
683 self showInfoForNonClassLib:(self selectedModuleIndex).
687 "/ selected the pseudo entry for the VM itself
691 "/ selected a class-library package
692 self showInfoForClassLib:info.
694 "Modified: / 05-10-2007 / 12:56:13 / cg"
700 sel := self selectedModuleIndex.
702 (self showClassLibs value or:[self showBuiltIn value]) ifTrue:[
703 info := allModules at:sel ifAbsent:nil.
709 showInfoForClassLib:info
710 "/ selected a package; fill bottom list with class-info
714 self middleLabelHolder value:'Contains Modules:'.
716 classNamesShown := self shownClassNamesFor:info.
718 rows := classNamesShown collect:[:cName |
719 |cls entry rev listEntry revisionInfo|
721 listEntry := InfoRow new.
722 listEntry name:cName.
724 cls := Smalltalk classNamed:cName.
726 (cName endsWith:'_extensions') ifFalse:[
727 listEntry version:'(class removed)'.
730 rev := cls binaryRevision.
732 cls isLoaded ifFalse:[
733 entry := '(stub for: ' , rev.
735 entry :='(bin: ' , rev.
737 cls revision ~= rev ifTrue:[
738 entry := entry , ' / src: ' , (cls revision printString)
740 entry := entry , ')'.
741 listEntry version:entry
743 cls revision notNil ifTrue:[
744 listEntry version:'(overloaded by: ' , cls revision , ')'
747 revisionInfo := cls revisionInfo.
748 revisionInfo notNil ifTrue:[
749 listEntry date:(revisionInfo at:#date)
755 classInfoShown := rows.
757 self infoTable1ListHolder value:rows.
758 self table1VisibleHolder value:true.
759 self table2VisibleHolder value:false.
761 "Modified: / 05-10-2007 / 13:03:56 / cg"
764 showInfoForNonClassLib:sel
765 "/ selected a method, cObject or unknown
767 |module fileName list entry|
770 self table1VisibleHolder value:false.
771 self table2VisibleHolder value:false.
775 module := objectHandles at:sel.
776 fileName := module pathName.
778 module isMethodHandle ifTrue:[
779 |method nm entry1 entry2 entry3|
781 self middleLabelHolder value:'Compiled Method:'.
783 (method := module method) isNil ifTrue:[
784 nm := '** removed **'.
787 "/ labels:#('Inspect' 'Browse')
788 "/ selectors:#(inspect browse).
789 "/ menu actionAt:#inspect put:[ method inspect ].
790 "/ menu actionAt:#browse put:[ |who|
791 "/ who := method who.
792 "/ UserPreferences systemBrowserClass
793 "/ openInClass:(who methodClass)
794 "/ selector:(who methodSelector)
796 "/ listView1 middleButtonMenu:menu.
798 nm := (method whoString) asText emphasizeAllWith:(#color->Color blue).
800 entry1 := InfoRow new.
801 entry1 name:'Compiled method'; value:nm.
803 entry2 := InfoRow new.
804 entry2 name:'Path'; value:fileName.
806 entry3 := InfoRow new.
807 entry3 name:'Address'; value:('(16r) ' , (method code address hexPrintString leftPaddedTo:8 with:$0)).
809 self infoTable2ListHolder value:(Array with:entry1 with:entry2 with:entry3).
810 self table1VisibleHolder value:false.
811 self table2VisibleHolder value:true.
815 (module isFunctionObjectHandle
816 and:[module functions notEmpty]) ifTrue:[
817 self middleLabelHolder value:'Functions:'.
820 "/ labels:#('Inspect')
821 "/ selectors:#(inspect).
822 "/ menu actionAt:#inspect put:[ module functions inspect ].
823 "/ listView1 middleButtonMenu:menu.
825 list := (module functions select:[:f | f notNil])
826 collect:[:f | |entry|
827 entry := InfoRow new.
828 entry name:(f name asText emphasizeAllWith:(#color->Color blue)).
829 entry value:('address: (16r) ' , (f code address hexPrintString leftPaddedTo:8 with:$0)).
832 self infoTable2ListHolder value:list.
833 self table1VisibleHolder value:false.
834 self table2VisibleHolder value:true.
838 entry := InfoRow new.
839 entry name:'Unknown'.
840 self infoTable2ListHolder value:(Array with:entry).
841 self table1VisibleHolder value:false.
842 self table2VisibleHolder value:true.
844 "Modified: / 05-10-2007 / 13:01:33 / cg"
848 "/ show file versions in lower view.
852 self middleLabelHolder value:'Contains Modules:'.
854 l := (ObjectMemory getVMIdentificationStrings).
855 l := l select:[:entry | entry includesString:'$Header'].
856 l := l select:[:entry | entry includesString:',v'].
857 l := l collect:[:entry |
858 |i1 i2 file revision date listEntry|
860 listEntry := InfoRow new.
862 i1 := entry indexOfSubCollection:'librun'.
864 i2 := entry indexOfSubCollection:',v' startingAt:i1.
866 file := entry copyFrom:i1+7 to:(i2-1).
870 i2 := entry indexOfSeparatorStartingAt:i1.
871 revision := entry copyFrom:i1 to:(i2-1).
872 listEntry version:revision.
875 i2 := entry indexOfSeparatorStartingAt:i1.
876 date := entry copyFrom:i1 to:(i2-1).
884 self infoTable1ListHolder value:l.
885 self table1VisibleHolder value:true.
886 self table2VisibleHolder value:false.
888 "/ readOnly ifFalse:[
889 "/ unloadButton disable.
890 "/ unloadAndRemoveButton disable.
893 "Modified: / 05-10-2007 / 12:53:44 / cg"
896 shownClassNamesFor:info
897 "/ selected a package; fill bottom list with class-info
901 classNames := info classNames asSortedCollection.
906 cls := Smalltalk classNamed:cName.
908 true "a removed class"
915 !ObjectModuleInformation methodsFor:'initialization'!
917 postBuildWith:aBuilder
920 super postBuildWith:aBuilder.
922 canDoIt := ObjectFileLoader notNil and:[ObjectFileLoader canLoadObjectFiles].
923 self showBuiltIn value:canDoIt.
924 self showCObjects value:canDoIt.
925 self showClassLibs value:canDoIt.
926 self showMethods value:canDoIt.
927 self showOthers value:canDoIt.
929 self updateModuleList
931 "Created: / 05-10-2007 / 10:50:27 / cg"
934 !ObjectModuleInformation methodsFor:'menu actions'!
937 |module info classNames selectedClassName selectedClass packageID methods|
939 module := self selectedModule.
940 info := self selectedModuleInfo.
941 classNames := (self shownClassNamesFor:info) asSortedCollection.
942 selectedClassName := classNames at:(self selectedInfoIndex).
943 selectedClass := Smalltalk classNamed:selectedClassName.
945 selectedClass notNil ifTrue:[
946 Smalltalk browseInClass:selectedClass.
950 "/ clicked on an extensions-module ?
951 (selectedClassName endsWith:'_extensions') ifTrue:[
952 packageID := (selectedClassName copyWithoutLast:('_extensions' size)) asSymbol.
953 methods := Smalltalk allExtensionsForPackage:packageID.
954 (UserPreferences browserClass) browseMethods:methods title:('Extensions for ',packageID).
962 module := self selectedModule.
963 classes := module classNames collect:[:nm | Smalltalk classNamed:nm].
964 UserPreferences systemBrowserClass
965 browseClasses:classes
966 label:(resources string:'Classes in %1' with:module libraryName)
969 copyClassOrVMNameList
972 text := ((classInfoShown ? vmInfoShown)collect:[:eachRow | eachRow infoString]) asStringCollection asString.
973 self window setClipboardText:text.
977 self updateModuleList
979 "Modified: / 05-10-2007 / 13:11:45 / cg"
983 self openHTMLDocument: 'tools/misc/TOP.html#MODULEINFO'
985 "Modified: / 05-10-2007 / 13:11:45 / cg"
989 self unloadSelectedModuleRemoveClasses:false
992 unloadSelectedModuleAndRemoveClasses
993 self unloadSelectedModuleRemoveClasses:true
996 unloadSelectedModuleRemoveClasses:doRemoveClasses
997 self withWaitCursorDo:[
998 |info idx handle pathName|
1000 info := self selectedModuleInfo.
1001 handle := objectHandles at:(self selectedModuleIndex).
1002 self selectedModuleIndexHolder value:nil.
1005 "/ selected a method
1006 "/ idx := idx - allModules size.
1007 pathName := handle pathName.
1009 "/ selected a package
1010 pathName := info pathName.
1012 pathName notNil ifTrue:[
1013 doRemoveClasses ifTrue:[
1014 ObjectFileLoader unloadObjectFileAndRemoveClasses:pathName.
1016 ObjectFileLoader unloadObjectFile:pathName.
1019 self updateModuleList.
1023 !ObjectModuleInformation methodsFor:'private'!
1026 self updateModuleList
1028 "Created: / 05-10-2007 / 12:43:36 / cg"
1032 |showClassLibs showBuiltIn showMethods showCObjects showOthers
1033 listOfModuleNames allObjects handles|
1035 showClassLibs := self showClassLibs value.
1036 showBuiltIn := self showBuiltIn value.
1037 showMethods := self showMethods value.
1038 showCObjects := self showCObjects value.
1039 showOthers := self showOthers value.
1041 listOfModuleNames := OrderedCollection new.
1042 handles := OrderedCollection new.
1044 allObjects := ObjectFileLoader loadedObjectHandles.
1046 (showClassLibs or:[showBuiltIn]) ifTrue:[
1049 allModules := ObjectMemory binaryModuleInfo asOrderedCollection.
1050 (showBuiltIn and:[showClassLibs]) ifFalse:[
1051 allModules := allModules select:
1055 wantToSee := i dynamic.
1056 showBuiltIn ifTrue:[
1057 wantToSee := wantToSee not
1063 "/ sorting by reverse id brings newest ones to the top (a side effect)
1064 allModules sort:[:a :b | (a id) > (b id)].
1065 moduleNames := allModules collect:[:entry | entry name].
1066 listOfModuleNames addAll:moduleNames.
1067 handles addAll:allModules.
1070 showMethods ifTrue:[
1071 |methodObjects methodNames|
1073 methodObjects := (allObjects select:[:h | h isMethodHandle]) asArray.
1074 methodNames := methodObjects collect:[:mH | mH method isNil ifTrue:[
1075 'compiled method - removed' " , ' (in ' , mH pathName , ')' "
1077 'compiled method ' , mH method whoString " , ' (in ' , mH pathName , ')' "
1080 listOfModuleNames addAll:methodNames.
1081 handles addAll:methodObjects.
1084 showCObjects ifTrue:[
1085 |cObjects cObjectNames|
1087 cObjects := (allObjects select:[:h | h isFunctionObjectHandle]) asArray.
1088 cObjectNames := cObjects collect:[:entry | entry pathName].
1089 listOfModuleNames addAll:cObjectNames.
1090 handles addAll:cObjects.
1094 |otherObjects otherObjectNames|
1096 otherObjects := (allObjects select:[:h | (h isFunctionObjectHandle
1097 or:[h isMethodHandle
1098 or:[h isClassLibHandle]]) not]) asArray.
1099 otherObjectNames := otherObjects collect:[:entry | entry pathName].
1100 listOfModuleNames addAll:otherObjectNames.
1101 handles addAll:otherObjects.
1104 showBuiltIn ifTrue:[
1105 listOfModuleNames addFirst:'VM'.
1106 handles addFirst:#VM.
1107 allModules addFirst:#VM.
1110 self listOfModuleNames contents:listOfModuleNames.
1111 objectHandles := handles.
1113 "Modified: / 05-10-2007 / 12:45:37 / cg"
1116 !ObjectModuleInformation::InfoRow methodsFor:'accessing'!
1134 name:nameArg version:versionArg date:dateArg
1136 version := versionArg.
1153 version := something.
1156 !ObjectModuleInformation::InfoRow methodsFor:'info'!
1159 ^ name , ' ', (version ? '-') , ' ', (date ? '-') printString
1162 !ObjectModuleInformation class methodsFor:'documentation'!