<div dir="ltr"><div class="gmail_default" style="font-size:small">Hi All, Hi Levente, Jaromir, and Context hackers,</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    find attached a change set which supports re-raising a fatal exception, caught inside a critical section, outside the critical section.  This is a key facility for debugging systems such as Croquet.  I expect it'll also be useful in delimited continuation contexts such as Seaside.  The facility is closely related to Context>>copyTo: and Context>>copyTo:bottomContextDo:.  The main method is Exception>>copyForReraiseTo: aContext.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">This implementation is higher quality than Context>>copyTo:[bottomContextDo:].  It copies the stack and it also copies blocks that are created on the copied stack.  So the copied stack correctly copies blocks, and hence exception handlers.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">I'm thinking of adding this to trunk.  I would like it to be reviewed carefully before I do so.  Both implementation and selector names need reviewing, and tests and more use cases would be nice (I have a use case in Virtend/Croquet).</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Here's an example usage:</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    | sender error |<br>    sender := thisContext sender.<br>    Mutex new critical:<br>        [[nil new]<br>            on: Error<br>            do: [:ex| error := ex copyForReraiseTo: sender]].<br>    error reraiseFrom: thisContext<br></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">A simpler usage would be</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    | home error |<br>    home := thisContext.<br>    Mutex new critical:<br>        [[nil new]<br>            on: Error<br>            do: [:ex| error := ex copyForReraiseTo: home]].<br>    error outer<br></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">This doesn't work because ProcessorScheduler>>#debugContext:title:full:contents: (et al) contains</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    self assert: [thisContext hasSender: aContext]</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">and hence we have to stitch the copied stack into the current stack via</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">    aContext privSender: signalContext.</div>     <span class="gmail_default" style="font-size:small">    </span>thisContext privSender: aContext.<br>    <span class="gmail_default" style="font-size:small">    </span>self outer<div><br></div><div><div class="gmail_default" style="font-size:small">inside Exception>>reraiseFrom: aContext</div><div><br></div><div class="gmail_default" style="font-size:small">Maybe adding a flag to Exception and avoiding that assert when the exception is "in reraise mode" is better.  I don't know.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Given that the main worker method, Context>>#copyTo:atEachStep:, is better than Context>>copyTo:[bottomContextDo:]., these two could be reimplemented in terms of it, e.g.:</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Context>>copyTo: aContext<br></div><div class="gmail_default" style="font-size:small">    ^self copyTo: aContext</div><div class="gmail_default" style="font-size:small">            atEachStep:</div><div class="gmail_default" style="font-size:small">                [:originalContext :copiedContext|</div><div class="gmail_default" style="font-size:small">                originalContext sender == aContext ifTrue:</div><div class="gmail_default" style="font-size:small">                    [copiedContext privSender: nil]]</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small"><div class="gmail_default">Context>>copyTo: aContext bottomContextDo: aBlock<br></div><div class="gmail_default">    ^self copyTo: aContext</div><div class="gmail_default">            atEachStep:</div><div class="gmail_default">                [:originalContext :copiedContext|</div><div class="gmail_default">                originalContext sender == aContext ifTrue:</div><div class="gmail_default">                    [copiedContext privSender: nil.</div><div class="gmail_default">                    aBlock value: copiedContext]]</div><div class="gmail_default"><br></div><br class="gmail-Apple-interchange-newline"></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div></div></div></div>