[squeak-dev] sends of #class and #== considered harmful, may we please stop?
eliot.miranda at gmail.com
Fri Nov 23 18:59:21 UTC 2018
> On Nov 22, 2018, at 9:20 AM, Chris Muller <asqueaker at gmail.com> wrote:
> Hi guys,
> Something I've been wanting to ask the community for years, but never
> had the gumption, was about changing how we write our #= and #hash
> methods, but now that we're combing through them anyway, I must!
> Basically, it comes down to Proxy's. I want them to work better in
> Squeak. But every time we put another send to #class or #== in an
> implementation of #=, since those methods are inlined, they're too
> brittle to work with Proxy's. This causes hard-to-trackdown bugs in
> applications and mini-messes to deal with them since the app is forced
> to change its code to become "aware" of potential Proxy'iness of an
> object before comparing it with #=.
The disease is the inclining of #class and #==, not the use of these in comparison methods. In the VisualWorks vm I implemented a command-line/image header switch that enabled/disabled this inlining. It is easy to implement the same thing on Cog.
If we did, then these methods would not be inlined if the flag is enabled, on a per-image basis.
An alternative is Marcus Denker’s Opal compiler for Pharo which compiles #class and #== to normal sends, avoiding the inlined special selector bytecodes for these sends. That’s arguably an even better solution, because it retains the ability to inline. Although the mirror methods objectClass: and object:eqeq: can be used, with more overhead.
In any case, instead of proposing to change a natural and comprehensible idiom, we can instead evolve the implementation to meet our needs.
> This is no surprise, since writing a send to #== instead of #= for no
> more than "performance" is actually breaking encapsulation in the
> first place...
> There is an easy solution. When writing #= and #hash implementations,
> use (#species or #xxxClass or #isKindOf: instead of #class) and #=
> instead #==. So, for example, Eliot, I want to upgrade your new
> Message>>#= to something like:
> = anObject
> ^self xxxClass = anObject xxxClass
> and: [selector = anObject selector "selector lookup is by identity"
> and: [lookupClass = anObject lookupClass
> and: [args literalEqual: anObject arguments]]]
> Or #species or #isKindOf:, like we do in many other methods. Now the
> method is Proxy-compatible.
> What do you think?
I think it is wrong. xxxClass is a horrible hack that should be banished ASAP.
More information about the Squeak-dev