help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-smalltalk] (no subject)


From: J Pfersich
Subject: Re: [Help-smalltalk] (no subject)
Date: Tue, 16 Jan 2007 15:35:53 -0700

At 09:01 AM 1/15/2007 +0100, Paolo Bonzini wrote:
If the value of
      receiver == comparand
   is true then the receiver and comparand must have equivalent
   identity hash values. Or more formally:
      receiver == comparand ==>
         receiver identityHash = comparand identityHash

This is not an "if and only if". If two objects have the same identityHash you cannot conclude that they are identical. In GNU Smalltalk "x identityHash identityHash == x identityHash" in particular, so every object's identityHash will collide with exactly one integer's identityHash.

This was the question that I needed an answer for. I saw that the spec in the ANSI document and it didn't match the behavior exhibited. Nor did it match the behavior in Squeak or VW either. I figured that something else must be used to distinguish objects because primitives are used instead of just a comparison of identityHashes.


Also note that "51546 asOop" is an error, while "51546 identityHash" is the integer 51546 itself.

In the other case, (123/3) is the integer 41 rather than the fraction (41/1), so

  123 / 3 identityHash = 123 / (3 identityHash) = 123 / 3 = 41
  (123 / 3) identityHash = 41 identityHash = 41
  (123 / 3) asFraction identityHash = (41/1) identityHash = an object index
                                      ^^^^^^
           this represents a Fraction object, not the value of 41/1

Paolo





reply via email to

[Prev in Thread] Current Thread [Next in Thread]