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