Hi Ben,

On Sat, Jan 24, 2015 at 7:57 AM, Ben Coman <[email protected]> wrote:

> 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 ]
>

What happens if instead you inline haltOnce to read

haltOnce
"Halt unless we have already done it once."
(Smalltalk at: #HaltOnce ifAbsent: [false]) ifTrue:
[Smalltalk at: #HaltOnce put: false.
Halt signal]

?


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
>



-- 
best,
Eliot

Reply via email to