'From Squeak4.2alpha of 19 August 2010 [latest update: #10382] on 22 September 2010 at 11:05:38 pm'! Object subclass: #WeakFinalizationList instanceVariableNames: 'first' classVariableNames: 'HasNewFinalization TestItem TestList' poolDictionaries: '' category: 'Collections-Weak'! !WeakFinalizationList commentStamp: 'Igor.Stasenko 9/22/2010 21:09' prior: 0! IMPORTANT!!!!!! This class is a special object, recognized by VM. Its only purpose is to a) identify a special kind of objects who usually having a weak references but also having an instance of me held by first non-weak fixed slot (instance variable). b) a 'first' instance variable points to the head of a list of items, reported by VM which has weak references which became garbage during last garbage collection At my class side, there are some public behavior, which is used by finalization process to detect if VM supports new finalization scheme or should use the old one. Weak registry using #hasNewFinalization for switching to correct finalization logic, depending on VM it currently runs on. ! !WeakFinalizationList methodsFor: 'accessing' stamp: 'Igor.Stasenko 9/22/2010 21:06'! first ^ first! ! !WeakFinalizationList methodsFor: 'accessing' stamp: 'Igor.Stasenko 9/22/2010 21:06'! swapWithNil | head | head := first. first := nil. ^ head! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! WeakFinalizationList class instanceVariableNames: ''! !WeakFinalizationList class methodsFor: 'vm capability test' stamp: 'Igor.Stasenko 9/22/2010 20:19'! checkTestPair HasNewFinalization := TestList swapWithNil notNil.! ! !WeakFinalizationList class methodsFor: 'vm capability test' stamp: 'Igor.Stasenko 9/22/2010 20:18'! hasNewFinalization ^ HasNewFinalization == true! ! !WeakFinalizationList class methodsFor: 'vm capability test' stamp: 'Igor.Stasenko 9/22/2010 20:18'! initTestPair TestItem := WeakFinalizerItem new list: TestList object: Object new. ! ! !WeakFinalizationList class methodsFor: 'class initialization' stamp: 'Igor.Stasenko 9/22/2010 20:17'! initialize TestList := self new.! ! WeakFinalizationList initialize!