> On 17.10.2014, at 15:52, Nicolas Cellier <[email protected]> 
> wrote:
> 
> 
> 
> 2014-10-17 15:49 GMT+02:00 Max Leske <[email protected] 
> <mailto:[email protected]>>:
> 
>> On 17.10.2014, at 15:25, Eliot Miranda <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Hi Max,
>> 
>> On Oct 17, 2014, at 12:34 AM, Max Leske <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>> 
>>>> On 17.10.2014, at 02:46, Ben Coman <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> Richard Sargent wrote:
>>>>> Eliot Miranda-2 wrote
>>>>>> On Wed, Oct 15, 2014 at 10:50 AM, Richard Sargent <
>>>>>> richard.sargent@
>>>>>>> wrote:
>>>>>>> One of the best things about Smalltalk is how easily we can say what we
>>>>>>> mean. I think you would be better off creating a method named something
>>>>>>> like
>>>>>>> #hasSameEffectAs: to answer what you are presently using #= to do, and
>>>>>>> change #= to answer the, in my opinion, more sensible "is the same as"
>>>>>>> that
>>>>>>> we conventionally think of #= meaning.
>>>>>>> 
>>>>>> But that's the point.  #= has to mean something and having it mean #==
>>>>>> isn't useful, so one has to choose some value-based semantic for
>>>>>> CompiledMethod>>#= and the one that's there is useful.  Defining what #=
>>>>>> means for some value type is far easier than defining what it might mean
>>>>>> for something as complex as a CompiledMethod.  The definition in
>>>>>> Squeak/Pharo has been useful to me in implementing a closure-based 
>>>>>> system,
>>>>>> so I'm unapologetic about the current definition.  It is a good one but 
>>>>>> it
>>>>>> doesn't preclude defining others.
>>>>> An interesting response. You ignored the point that e.g. #hasSameEffectAs:
>>>>> provides greater clarity and add an argument against something I didn't 
>>>>> say.
>>>>> I also don't think defining equality for a CompiledMethod is particularly
>>>>> difficult. If I were to recompile a method's source code, I would get a 
>>>>> new
>>>>> instance of a CompiledMethod that would, in my opinion, be equal to the 
>>>>> one
>>>>> already installed in the class (and perhaps cached in the VM's
>>>>> optimizations). So one would be able to say that we would not replace an
>>>>> existing CompiledMethod with an equal one. The current implementation of 
>>>>> #=
>>>>> has no such characteristic, since it proclaims a CompiledMethod named #a 
>>>>> to
>>>>> be equal to one named #z.
>>>> 
>>>> @Richard
>>>> 
>>>> That doesn't seem to be a good example for what your trying to say.
>>>> Given...
>>>> 
>>>> [1] SomeClass>>a "original instance"
>>>>    ^1
>>>> 
>>>> [2] SomeClass>>a "recompiled instance"
>>>>    ^1
>>>> 
>>>> [3] SomeClass>>z
>>>>    ^1
>>>> 
>>>> ...you seem to be saying that its useful to know if [1]=[2],
>>>> but imply that is invalidated by [2]=[3] ?
>>>> 
>>>> But [1]=[2] remains true, and just as useful for your example.
>>>> 
>>>> 
>>>> @Max
>>>> 
>>>> I guess to call it a bug, you bumped into a different use case
>>>> where [2]=[3] is problematic. Can you describe that?
>>> 
>>> Well, not problematic. Once you accept that neither selector nor class are 
>>> part of a CompiledMethod it is obvious that two instances with the same 
>>> byte codes produce the same hash.
>>> 
>>> The actual problem is more one of understanding and use. The following code 
>>> answers a collection with the CompiledMethods Collection>>add:, 
>>> Collection>>do: and Collection>>remove:ifAbsent:
>>> 
>>> Collection methods select: #isAbstract.
>>> 
>>> All three CompiledMethods are implemented as ‘^ self 
>>> subclassResponsibility’, so they have the same byte codes. Now, if you take 
>>> that collection and make a set out of it you’ll lose Collection>>do: since 
>>> #do: and #add: produce the same hash, but #remove:ifAbsent: doesn’t because 
>>> the number of arguments is calculated into the hash (actually the 
>>> CompiledMethod header is).
>> 
>> Surely the issue is that "aClass methods" should answer an IdentitySet right?
> 
> Well, in the case of my example that wouldn’t change anything. As soon as you 
> put the methods into a set you’ll end up with less entries than before again. 
> Selectors are unique per class anyway so I don’t quite see the benefit of 
> using an IdentitySet over an OrderedCollection (or a Bag for that matter), 
> except for making it more obvious that the result of the message #methods 
> doesn’t need to be filtered further.
> 
> I should add that the code, the student who discovered the clash wrote, 
> looked more like this:
> 
> result := Set new.
> Collection methods do: [ :m |
>       m isAbstract ifTrue: [ result add: m ] ].
> 
> Max
> 
> 
> Why not just keep a dictionary, like methodDictionary select: #isAbstract or 
> something like that…

You’re right of course, there’s no need to put methods into a set. The code is 
from an exercise and the students aren’t used to Smalltalk, so they end up with 
all sorts of code.

>  
>> 
>> 
>>> So, as long as you think of CompiledMethods as objects that have a name, it 
>>> looks like a bug and in my opinion this behaviour is something that messes 
>>> with the mind of newcomers. Just a (silly) idea: something like a 
>>> CompiledMethodWrapper might solve the problem (at least from the user 
>>> perspective; everything is slightly different from the VM perspective :) ), 
>>> as it could hold on to the class and the selector independently of the 
>>> actual CompiledMethod.
>>> 
>>> In the end however, one doesn’t work with compiled methods a lot and the 
>>> hash situation is unlikely to cause a lot of problems (people working with 
>>> CompiledMethod usually know what they are doing).
>>> 
>>> Cheers,
>>> Max
>>> 
>>>> 
>>>> 
>>>> cheers -ben
>>>> 
>>>> 
>>>>> The blue book say #= means "Answer whether the receiver and the argument
>>>>> represent the same component." The current implementation does so only for
>>>>> some, in my opinion, counter-intuitive definition of "same component".
>>>>> --
>>>>> View this message in context: 
>>>>> http://forum.world.st/CompiledMethod-hash-can-produce-clashes-tp4784722p4784779.html
>>>>>  
>>>>> <http://forum.world.st/CompiledMethod-hash-can-produce-clashes-tp4784722p4784779.html>
>>>>> Sent from the Pharo Smalltalk Developers mailing list archive at 
>>>>> Nabble.com <http://nabble.com/>.
>> 
>> Eliot (phone)

Reply via email to