Squeak SmalltalkJoker Squeak Smalltalk : System : prevnext Trigger Event Garbage Collect

On Tuesday 08 July 2003 03:25 pm, Ingo Hohmann wrote:
> I have an app set up with some when:send:to: messages, now after
> some working on the code one of the messages is not sent any more,
> the method setting up the when:send:to: is, though.
>
> What do I do to debug this? I've set some halt's in, so I know that
> my method isn't called, I've stepped through triggerEvent, and have
> seen that my method isn't called, I've double checked message names
> (had some fun with a missing colon before ;-)
>
> So, any more ideas?
Yes:
If the argument or recipient of one of those messages got garbage
collected, the message won't get sent.
You can test for this.
So you can do this:
-------------
Assume you have this pattern:
recipient when: #someEvent send: #someSelector to: performer with:
arguments.
Now you can do this (I did the following lines in a Workspace):
recipient actionMap
recipient _ Object new.
performer _ Object new.
recipient when: #someEvent send: #inspect to: performer.
recipient triggerEvent: #someEvent. "works OK"
recipient actionSequenceForEvent: #someEvent  "
#(WeakMessageSend(#inspect -> an Object))" (recipient
actionSequenceForEvent: #someEvent) isReceiverOrAnyArgumentGarbage
"false"
recipient updateableActionMap " an IdentityDictionary(#someEvent-
>WeakMessageSend(#inspect -> an Object) )"
performer _ nil.
Smalltalk garbageCollect.
recipient updateableActionMap " an IdentityDictionary(#someEvent-
>WeakMessageSend(#inspect -> nil) )"
(recipient actionSequenceForEvent: #someEvent)
isReceiverOrAnyArgumentGarbage " true"
-------------
This also happens when any arguments get garbage collected.
To avoid this happening, you can be explicit with your registrations:
recipient when: #someEvent evaluate: (MessageSend
            receiver: performer
            selector: #someAction)
--
Ned Konz