[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
|