| > But is the reverse true? That is, can we be sure that two pointer- | distinct stable name objects contain different indices? | | I believe so, yes. Each stable name table entry has a pointer to the | linked stable name object. Calling makeStableName# checks whether the | passed pointer already has a stable name, and, if so, returns the linked | stable name object. Actually I'm confused. Currently we have data StableName a = StableName (StableName# a) I believe (but there is no documentation to state) that the (StableName# a) * Has kind (TYPE UnliftedRep) * Is the index of the entry in the Stable Name Table But if it's the index, why isn't it an IntRep? UnliftedRep is for pointers? Moreover eqStableName# :: StableName# a -> StableName# b -> Bool is directly implemented in the code generator (StgCmmPrim) by an equality comparison. If these things are correct, it would be great to write them down in a Note. And if they are right, I'm now lost about what you question is. Equality is /already/ implemented by direct equality comparison, no? Simon | -----Original Message----- | From: David Feuer <david@well-typed.com> | Sent: 20 August 2018 23:36 | To: ghc-devs@haskell.org; Simon Peyton Jones <simonpj@microsoft.com> | Cc: David Feuer <david.feuer@gmail.com>; marlowsd@gmail.com | Subject: Re: Stable name equality | | On Monday, August 20, 2018 11:56:44 AM EDT Simon Peyton Jones via ghc- | devs wrote: | > I defer to SimonM but IIRC each stable name corresponds to an entry in | the stable-name table; the index in the table is the “stable” thing in a | stable name. So I bet that comparison compares these indices. | > | > If two stable names are pointer-equal, they presumably contain the same | index into the table. | > | > But is the reverse true? That is, can we be sure that two pointer- | distinct stable name objects contain different indices? | | I believe so, yes. Each stable name table entry has a pointer to the | linked stable name object. Calling makeStableName# checks whether the | passed pointer already has a stable name, and, if so, returns the linked | stable name object. The design seems a bit surprising to me, but it looks | like that's actually how it works, at least for now. Each call locks the | stable name table, so it shouldn't be possible to miss entry creation.