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

Levente Uzonyi leves at caesar.elte.hu
Tue Jun 5 09:41:36 UTC 2018


Pharo uses RB to rename classes. Squeak has not integrated that to the 
Trunk, so it is not possible to rewrite code using the renamed class just 
yet, therefore the old binding is kept and stored in Undeclared.

Levente

On Tue, 5 Jun 2018, Max Leske wrote:

> 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