I've found a fix for something that has annoyed me for a long time - but I
can't determine what it might break.
1. In Workspace I evaluate the following
Halt enableHaltOnce.
a := 1.
self halt.
b := 2.
self haltOnce.
c := 3.
Transcript show: a + b + c.
2. In the debugger after it stops at the #halt, it takes a SINGLE <Step
Over> to move to d:=2 - no problem.
3. Now <Restart> and then <Step Over> down to c:=3 and observe:
* the #halt now takes EIGHT (used to be SIXTEEN) steps to traverse (ouch!)
* the #haltOnce takes THREE steps to traverse (good)
Tracing through for both #halt and #haltOnce it seems that the specific
conditional reference to #halt in Halt>>signalerContext is the difference!
Removing that condition results in the #halt behaving like #haltOnce,
taking only THREE <Step Over>s to traverse a restarted #halt.
Halt>>signalerContext
^ signalContext findContextSuchThat: [ :context |
(context receiver == self
or: [ (context receiver == self class)
or: [ context method selector = #halt ]]) not ]
Now #haltOnce seems to have been operating without a problem for a long
timer, so presumably its okay to make #halt behave the same way. But this
is deep stuff I don't fully understand. Anyone see a problem with removing
that last condition?
cheers -ben