Inline below... Cheers, Alistair (on phone) On Wed., 18 Sep. 2019, 15:05 Guillermo Polito, <guillermopolito@gmail.com> wrote:
About bug1) Iâve found that Calypso query scopes use sometimes #methods and sometimes #localMethods
ClyLocalClassScope >> methodsDo: aBlock
self classesDo: [ :eachClass | self metaLevelsOf: eachClass do: [ :concreteMetaLevelClass | concreteMetaLevelClass methods do: aBlock ] ]
ClyClassHierarchyScope >> methodsDo: aBlock
self classesDo: [ :eachClass | self metaLevelsOf: eachClass do: [ :concreteMetaLevelClass | concreteMetaLevelClass methods do: aBlock ] ]
ClyPackageScope >> methodsDo: aBlock self classesDo: [:class | class localMethods do: aBlock. class classSide localMethods do: aBlock].
self packagesDo: [ :package | package extensionMethods do: aBlock ]
ClySystemEnvironmentScope >> methodsDo: aBlock
self classesDo: [:class | class instanceSide localMethods do: aBlock. class classSide localMethods do: aBlock]
We should get an homogeneous version of this.
Pablo is checking the UFFI compilation now :)
Right. I wrote that it shouldn't matter whether methodDict or local methods is used, but I agree that there should be a single accessor that is used everywhere. Thanks! Alistair
El 18 sept 2019, a las 14:20, Alistair Grant <akgrant0710@gmail.com> escribió:
P.S. Two implications of this:
1. The code you're looking at may not be the code that is executed. If in doubt, use the standard System Browser (not senders, implementers, etc.). 2. Iceberg may not be loading extension methods that override an existing method correctly, so the old version is left as the executable code. There may be happening in other situations as well, I haven't checked.
Thanks, Alistair
On Wed, 18 Sep 2019 at 11:04, Alistair Grant <akgrant0710@gmail.com> wrote:
Hi Everyone,
TraitedMetaclass stores methods in two different instance variables:
- methodDict (inherited from Behavior) - localMethods
And the same method can be different in each dictionary.
Different browsers show different versions, i.e.:
- The System Browser uses the method in methodDict. - Calypso's "Senders of" browser uses localMethods. - The Iceberg versions browser uses localMethods.
It appears that the method in methodDict is the one that is actually used when a message is sent, but it would be nice to get confirmation.
To reproduce this in a clean Pharo 8 image:
- Open the System Browser on LGitBuf class>>signature_free: (the methodDict version). - Open the system browser on TLGitCalloutTrait>>call:options: and then press "Senders". The resulting window will include LGitBuf class>>signature_free:, but the localMethods version.
In this example, #signature_free: isn't defined by the trait, and isn't overwritten, so I would expect that the method in both dictionaries should be the same or it should only be in one dictionary.
Can someone say what the intended behaviour is?
Thanks, Alistair