[squeak-dev] Re: Issue with traits

Adrian Lienhard adi at netstyle.ch
Wed Oct 21 07:41:08 UTC 2009


I've fixed this issue in Pharo a couple of months ago. CompiledMethods  
are not shared anymore, so methodClass returns the expected class. At  
the time I implemented traits (2004?), there were no method properties  
and hence sharing compiled methods worked -- of course except for  
super sends in which case the method was always recompiled (so the  
answer to Andreas' question below is b)).

Cheers,
Adrian


On Oct 21, 2009, at 08:42 , Andreas Raab wrote:

> Igor Stasenko wrote:
>> now what i found interesting:
>> (ABBAB methodDict at: #foo) == (ABBAC methodDict at: #foo)
>> but as side effect, we got this one:
>> (ABBAB methodDict at: #foo) methodClass  ==> ABBAC
>> which i find a bit disturbing :(
>
> Yes, seems wrong. VERY wrong. Try this:
>
> Object subclass: #BaseA
>
> BaseA>>foo
>  ^42
>
> Object subclass: #BaseB
>
> BaseB>>foo
>  ^13
>
> And then create subclasses of BaseA and BaseB which use your trait  
> and have the trait implementation use "^super foo". One of two  
> things should happen:
>
> a) They both return the same (incorrect) value (which would be  
> expected if methodClass is the same). In this case it's just plain  
> broken.
>
> b) They both return different values, in which case there is code  
> that handles super sends specifically and the sharing is simply an  
> unnecessary optimization.
>
> I hope it's the latter case which would mean you only need to throw  
> out the test for super sends and do whatever that code was doing to  
> begin with ;-)
>
> Cheers,
>  - Andreas
>
>




More information about the Squeak-dev mailing list