Hi Eliot,


 

On 28 May 2018 at 22:03:24, squeak-dev-request@lists.squeakfoundation.org (squeak-dev-request@lists.squeakfoundation.org) wrote:

Hi Max,


> On May 27, 2018, at 2:44 PM, Max Leske <maxleske@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