<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi again,<div class=""><br class=""></div><div class="">Following-up on myself ;-)<br class=""><div class=""><br class=""></div><div class="">I suddenly realised I had never cross-checked the output of the same check on a fresh install of our code in a 3.4.5 repository (so not an upgraded one)…</div><div class="">The result is exactly the same list of classes, even when run on a repository with which 3.4.5 ships.</div><div class=""><br class=""></div><div class="">I guess all is well in that case, though there is some air of mystery around these instances ;-)</div><div class=""><br class=""></div><div class="">Sorry for the noise…</div><div class="">Johan</div><div class=""><br class=""></div><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 15 Feb 2022, at 18:33, Johan Brichau <<a href="mailto:johan@yesplan.be" class="">johan@yesplan.be</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">Hi,</div><div class=""><br class=""></div><div class="">I’m fleshing out the final details of our upgrade from 2.4.4.1 to 3.4.5. </div><div class="">At the end of the upgrade process, we do a check for ‘instances of orphaned classes’ (code at the bottom). This allows us to detect if any GsMethod, ExecutableBlock or other instances are still lingering.</div><div class="">I now end with the results below.</div><div class=""><br class=""></div><div class=""><div class="">--transcript--'Orphaned class <b class="">GsComSelectorLeaf</b> (244225) has 33 instance(s):'</div><div class="">--transcript--'    #(235454465 235454721 235474433 235474689 235474945 235475201 235475969 235476737 235477761 235478017 235479809 235480321 235481089 235481345 235481601 235482625 235482881 235483905 235484417 235488769 235489793 235490049 235490305 235490561 235491585 235492097 235492353 235493377 235494145 235495169 235495937 235496193 235496449)'</div><div class="">--transcript--'Orphaned class <b class="">FSFilePluginPrims</b> (187628033) has 2 instance(s):'</div><div class="">--transcript--'    #(199312129 200773633)'</div><div class="">--transcript--'Orphaned class <b class="">WordArray</b> (187715073) has 13 instance(s):'</div><div class="">--transcript--'    #(199707393 199708161 200611329 200611585 200611841 200612097 200612353 200612609 201169921 201170433 201938177 201938433 202275841)'</div><div class="">--transcript--'Orphaned class <b class="">ZipEncoderTree</b> (187732481) has 2 instance(s):'</div><div class="">--transcript--'    #(201169665 201170177)'</div><div class="">--transcript--'Number of orphaned classes with instances: 5’</div></div><div class=""><br class=""></div><div class="">Are <b class="">GsComSelectorLeaf </b>and<b class=""> </b><b class="">FSFilePluginPrims</b> class private/hidden classes that I can ignore since they are not in my user’s symbolList?</div><div class=""><br class=""></div><div class="">When I trace the reference path from an instance of <b class="">ZipEncoderTree,</b> I get at a ZipConstants but the ZipConstants I can directly reach in the symbolList is a different one. So I am unable to find out where that other ZipConstants is being held.</div><div class="">It does not yield any issues as far as I can see… but how can I find out where it’s being referenced as the repository reference methods stop at ZipConstants?</div><div class=""><br class=""></div><div class="">The references to <b class="">WordArray</b> point me to class variables in FastInflateStream but again the FastInflateStream I can reference from my symbolList is a different one and the class vars are nil.</div><div class="">So, again, I am wondering what I need to do about these and if I need to do anything about these?</div><div class=""><br class=""></div><div class="">Thanks for any help</div><div class="">Johan</div><div class=""><br class=""></div><div class="">— scripts:</div><div class=""><br class=""></div><div class="">orphanedClasses</div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">   </span>| globalClasses orphanedClasses metaclass metaclassInstances hiddenClassNames |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">   </span>globalClasses := IdentitySet new.</div><div class=""><span class="Apple-tab-span" style="white-space:pre"> </span>hiddenClassNames := { #LargeObjectNode . #NscBagLeaf . #NscSetLeaf . #Large4ByteLeaf . #ObsoleteMetaclass }.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">      </span>(Smalltalk at: #System) myUserProfile symbolList do: [ :symbolDictionary | </div><div class=""><span class="Apple-tab-span" style="white-space:pre">          </span>symbolDictionary valuesDo: [ :global | </div><div class=""><span class="Apple-tab-span" style="white-space:pre">                      </span>global isBehavior ifTrue: [ globalClasses add: global ] ] ].</div><div class=""><span class="Apple-tab-span" style="white-space:pre">      </span>(Smalltalk at: #System) commitTransaction.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>metaclass := Smalltalk at: #Metaclass ifAbsent: [ Smalltalk at: #Metaclass3 ].</div><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>metaclassInstances := IdentitySet withAll: metaclass allInstances.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>(Smalltalk at: #ObsoleteClasses ifAbsent: [ nil ]) ifNotNil: [ :obsoleteClasses |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">         </span>obsoleteClasses at: #ObsoleteMetaclass ifPresent: [ :obsoleteMetaclass |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                  </span>metaclassInstances addAll: obsoleteMetaclass allInstances ] ].</div><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>orphanedClasses := IdentitySet new.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>metaclassInstances do: [ :metaclassInstance |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">             </span>| baseclass |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">             </span>baseclass := metaclassInstance theNonMetaClass.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">           </span>(globalClasses includes: baseclass) ifFalse: [</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                    </span>orphanedClasses add: baseclass ] ].</div><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>^ Array withAll: (orphanedClasses reject:[ :cl | hiddenClassNames includes: cl name  ])</div></div><div class=""><br class=""></div><div class="">orphanedClassesWithInstances</div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>| orphanedClasses instancesArrays result |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>orphanedClasses := self orphanedClasses.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">  </span>instancesArrays := (Smalltalk at: #SystemRepository) listInstances: orphanedClasses.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">      </span>result := OrderedCollection new.</div><div class=""><span class="Apple-tab-span" style="white-space:pre">  </span>orphanedClasses with: instancesArrays do: [ :orphanedClass :instancesArray |</div><div class=""><span class="Apple-tab-span" style="white-space:pre">              </span>instancesArray ifNotEmpty: [</div><div class=""><span class="Apple-tab-span" style="white-space:pre">                      </span>result add: (Association key: orphanedClass value: instancesArray) ] ].</div><div class=""><span class="Apple-tab-span" style="white-space:pre">   </span>^ result</div></div></div></div></blockquote></div><br class=""></div></div></body></html>