<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small">Hi Jaromir,</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 5, 2022 at 2:11 PM <<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">A new version of KernelTests was added to project The Inbox:<br>
<a href="http://source.squeak.org/inbox/KernelTests-jar.430.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/inbox/KernelTests-jar.430.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: KernelTests-jar.430<br>
Author: jar<br>
Time: 5 June 2022, 11:11:12.187824 pm<br>
UUID: 209031e0-7bc5-984a-94dd-b3c3a24216c3<br>
Ancestors: KernelTests-jar.429<br>
<br>
Oops, fix comment in previous test KernelTests-jar.429... Sorry for the noise.<br>
<br>
=============== Diff against KernelTests-jar.429 ===============<br>
<br>
Item was changed:<br>
  ----- Method: ProcessTest>>testTerminateHandlingUnwindError (in category 'tests') -----<br>
  testTerminateHandlingUnwindError<br>
        "Test an error inside an unwind block is handled correctly."<br>
<br>
        "Workspace example:<br>
                [ [[Processor activeProcess terminate] ensure: [1/0]] on: ZeroDivide do: [] ] fork<br>
<br>
        ZeroDivide error should get caught by the handler without opening the Debugger.<br>
<br>
        To model this example as a test case we have to keep in mind that an error signal <br>
        in one thread cannot be caught in a different thread: if process 'p' signals an error<br>
        it won't be searching for a handler in the thread that sent 'p terminate' message.<br>
        So we can't do something like:<br>
+               p := [ [ [Semaphore new wait] ensure: [1/0] ] on: ZeroDivide do: [] ] fork.<br>
-               p := [ [ [Semaphore new wait] ensure: unwindBlock ] on: ZeroDivide do: [] ] fork.<br>
                Processor yield.<br>
                self shouldnt: [p terminate] raise: Error<br>
        Instead, in order to catch the situation the ZeroDivide error is not caught within 'p',<br>
        we try to catch the UnhandledError raised in 'p' indicating the ZeroDivide has been<br>
        missed. "<br>
<br>
        | p error unwindBlock |<br>
        unwindBlock := [[1/0] on: UnhandledError do: [error := true]].<br>
        p := [ [ [Semaphore new wait] ensure: unwindBlock ] on: ZeroDivide do: [] ] fork.<br>
        Processor yield.<br>
        self assert: p isBlocked. <br>
        error := false.<br>
        p terminate.<br>
        self deny: error.<br>
        self assert: p isTerminated!<br>
<br></blockquote><div><br></div><div class="gmail_default" style="font-size:small">Why not something like</div><div class="gmail_default" style="font-size:small"></div></div><span style="color:rgb(0,0,0)">        | p e<span class="gmail_default" style="font-size:small">rrorUnhandled errorCaught</span><span class="gmail_default" style="font-size:small"></span> unwindBlock |</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        unwindBlock := [[1/0] on: UnhandledError do: [</span><span style="color:rgb(0,0,0)">e</span><span class="gmail_default" style="color:rgb(0,0,0)">rrorUnhandled</span><span style="color:rgb(0,0,0)"> := true]].</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        p := [ [ [Semaphore new wait] ensure: unwindBlock ]</span><div><span style="color:rgb(0,0,0)"><span class="gmail_default" style="font-size:small">                         </span>on: ZeroDivide</span></div><div><span style="color:rgb(0,0,0)"><span class="gmail_default" style="font-size:small">                         </span>do: [</span><span class="gmail_default" style="color:rgb(0,0,0)">errorCaught := true</span><span style="color:rgb(0,0,0)">] ] fork.</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        Processor yield.</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        self assert: p isBlocked.<span class="gmail-Apple-converted-space"> </span></span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(0,0,0)">e</span><span class="gmail_default" style="color:rgb(0,0,0)">rrorUnhandled := errorCaught</span><span class="gmail_default" style="color:rgb(0,0,0)"></span><span style="color:rgb(0,0,0)"> := false.</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        p terminate.</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        self deny: </span><span style="color:rgb(0,0,0)">e</span><span class="gmail_default" style="color:rgb(0,0,0)">rrorUnhandled</span><span style="color:rgb(0,0,0)">.</span><br style="color:rgb(0,0,0)"><span style="color:rgb(0,0,0)">        self<span class="gmail_default" style="font-size:small"> </span></span><span style="color:rgb(0,0,0)"><span class="gmail_default">assert</span>: </span><span style="color:rgb(0,0,0)">errorCaugh<span class="gmail_default" style="font-size:small">t</span></span><span style="color:rgb(0,0,0)">.</span><span style="color:rgb(0,0,0)"></span></div><div><span style="color:rgb(0,0,0)">        self assert: p isTerminated!</span><div class="gmail-yj6qo" style="color:rgb(0,0,0)"></div><br class="gmail-Apple-interchange-newline"><div><div class="gmail_default" style="font-size:small">?  And I see no point to the <span style="color:rgb(0,0,0)">unwindBlock temporary.  Why not just put the code inline?</span></div></div><br><div dir="ltr" class="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>