[squeak-dev] Don't rely on weak reference cleanup for lookup of undeclared references

Max Leske maxleske at gmail.com
Tue Jun 5 05:33:02 UTC 2018


Bump.


> Hi Eliot,
>
>
>  
>
> On 28 May 2018 at 22:03:24, 
> squeak-dev-request at lists.squeakfoundation.org 
> (squeak-dev-request at lists.squeakfoundation.org) wrote:
>
> Hi Max,
>
>
>>  On May 27, 2018, at 2:44 PM, Max Leske <maxleske at gmail.com> wrote:
>>  
>> Hi,
>>  
>> Once again, there's a situation in the Fuel test suite that uncovered 
>> an issue. Consider the following script:
>>  
>> Object subclass: #Foo
>> instanceVariableNames: ''
>> classVariableNames: ''
>> poolDictionaries: ''
>> category: 'Kernel-Classes'.
>>
>> 10 timesRepeat: [(Smalltalk at: #Foo) rename: #Bar.
>> (Smalltalk at: #Bar) rename: #Foo ]
>>  
>> In 5.2-alpha this will open a warning dialog, as at some point one of 
>> the class names will be undeclared. Class>>rename: only checks for an 
>> entry in the undeclared dictionary without considering that the weak 
>> references may not yet have been cleaned up.
>>  
>> I understand that this is not really a realistic real world use-case 
>> but it's still annoying for tests. My current workaround is a forced 
>> GC after *every* test in the entire suite (I use 
>> ClassFactoryForTestCase, so class names may be reused many times 
>> over). Luckily, the impact on
>> runtime isn't too bad.
>>  
>> I'd appreciate it if this could be fixed. I'd be even more happy if I 
>> could be notified of the fix, so that I can remove the workaround 
>> again.
>
> Do you have ideas about where the bug lies?
> Sort of. In Pharo it seems that when renaming a class, the original 
> class name is never added to Undeclared while in Squeak it is. 
>
> It looks to me, that the problem is that Environment>>unbind: is never 
> sent. In Environment>>renameClass:from:to: #binding:removedFrom: 
> undeclares the original class name and #binding:addedTo: adds the new 
> binding to the environment. But the now undeclared original class name 
> remains undeclared. The following modification gets rid of the 
> problem:
>
> 	<snip>
>
> 	aClass updateMethodBindingsTo: newBinding.
>
> 	declarations add: newBinding. 
>
> 	self binding: newBinding addedTo: self.
>
> 	self unbind: oldBinding key. "<---------------------- added"
>
> 	<snip>
>
>
>
> HTH,
>
> Max
>
>
>
>
>>  
>> Cheers,
>> Max


More information about the Squeak-dev mailing list