> On 17.10.2014, at 16:41, Eliot Miranda <[email protected]> wrote: > > Hi Max, > > On Oct 17, 2014, at 7:24 AM, Max Leske <[email protected] > <mailto:[email protected]>> wrote: > >> >>> On 17.10.2014, at 15:52, Nicolas Cellier >>> <[email protected] >>> <mailto:[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. > > And so they learn... >
:p > >>>>> 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) > > > Eliot (phone)
