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

Max Leske maxleske at gmail.com
Wed May 30 18:17:52 UTC 2018


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 <http://airmail.calendar/2018-05-27 14:44:00
CEST>, 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20180530/ed6a4cdc/attachment.html>


More information about the Squeak-dev mailing list