Hi Florin, hi Clément --
yes, that's what Squeak's #becomeForward:copyHash: is for.
See this discussion, where the interference between #becomeForward:, copy hash, and ModificationForbidden is explained: http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-April/208596.htm... [http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-April/208596.htm...]
Best, Marcel Am 24.01.2022 08:04:38 schrieb Clément Béra bera.clement@gmail.com: Hi Florin,
I believe there are 2 primitives for 2 different use-cases: - primitiveArrayBecomeOneWayNoCopyHash 248 - primitiveArrayBecomeOneWayCopyHash 249
The difference between both is which hash is preserved. I think for your use-case you should use the other primitive.
On Mon, Jan 24, 2022 at 5:04 AM Florin Mateoc wrote:
Hi,
I am a bit surprised by the #becomeForward: behavior in Squeak. This is a one way become, where the target of the operation is the receiver, which sheds its identity/existence. Nobody points to it after the primitive execution, so it is discarded. This understanding also conforms to the method comment. As such, I remember a pattern of usage in VisualAge Smalltalk, where one way become was used as a cheap cleanup/avoidance of memory leaks, by doing oneWayBecome: nil. It's not that I advocate for it, but this works in Squeak too, except in Squeak #becomeForward: does an additional thing to the pointers redirection, it changes the identityHash of the argument, the non (obvious) target. While I understand this may be useful in certain situations, I think it is a dangerous conflation of activities. A new primitive that sets the identity hash could be used (VA has it) explicitly instead when such behavior is desired. As it is, if I do "Object new becomeForward: nil", it succeeds and it changes nil's identityHash.
Sorry if this has been debated before,
Cheers, Florin
-- Clément Béra https://clementbera.github.io/ https://clementbera.wordpress.com/
Hi Florin,
I believe there are 2 primitives for 2 different use-cases: - primitiveArrayBecomeOneWayNoCopyHash 248 - primitiveArrayBecomeOneWayCopyHash 249
The difference between both is which hash is preserved. I think for your use-case you should use the other primitive.
On Mon, Jan 24, 2022 at 5:04 AM Florin Mateoc <florin.mateoc@gmail.com [mailto:florin.mateoc@gmail.com]> wrote:
Hi,
I am a bit surprised by the #becomeForward: behavior in Squeak. This is a one way become, where the target of the operation is the receiver, which sheds its identity/existence. Nobody points to it after the primitive execution, so it is discarded. This understanding also conforms to the method comment.
As such, I remember a pattern of usage in VisualAge Smalltalk, where one way become was used as a cheap cleanup/avoidance of memory leaks, by doing oneWayBecome: nil. It's not that I advocate for it, but this works in Squeak too, except in Squeak #becomeForward: does an additional thing to the pointers redirection, it changes the identityHash of the argument, the non (obvious) target. While I understand this may be useful in certain situations, I think it is a dangerous conflation of activities. A new primitive that sets the identity hash could be used (VA has it) explicitly instead
when such behavior is desired. As it is, if I do "Object new becomeForward: nil", it succeeds and it changes nil's identityHash.
Sorry if this has been debated before,
Cheers, Florin
--
Clément Béra https://clementbera.github.io/ [https://clementbera.github.io/] https://clementbera.wordpress.com/ [https://clementbera.wordpress.com/]