<div dir="ltr">On Sat, Apr 6, 2013 at 5:13 AM, Kristján Valur Jónsson <span dir="ltr"><<a href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">





<div bgcolor="white" lang="EN-GB" link="blue" vlink="purple">
<div>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Ok, I have committed a change to the 2.7 branch (didn’t want to do the full merging yet, until we stabilize):<u></u><u></u></span></p>

<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Here’s the comment:<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="" style="margin-left:36pt"><span style="font-size:10pt;font-family:'Courier New';color:windowtext">modifying edge case semantics of tasklet.throw()<u></u><u></u></span></p>
<p class="" style="margin-left:36pt"><span style="font-size:10pt;font-family:'Courier New';color:windowtext">1) sending to a new tasklet works like a running tasklet.  It is scheduled,<u></u><u></u></span></p>
<p class="" style="margin-left:36pt"><span style="font-size:10pt;font-family:'Courier New';color:windowtext">gets an unhandled exception, and things proceed as per usual in that case.<u></u><u></u></span></p>
<p class="" style="margin-left:36pt"><span style="font-size:10pt;font-family:'Courier New';color:windowtext">2) Sending to a dead tasklet causes a RuntimeError, unless one is sending<u></u><u></u></span></p>
<p class="" style="margin-left:36pt"><span style="color:windowtext">a TaskletExit, in which case it is just ignored.</span><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></p>

<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">This is now pretty much the same as tasklet.raise_exception().<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">The thing is though, that tasklet.raise_exception() and kill() behave in a strange way when the target is already dead.  The dead tasklet is actually scheduled
 and the scheduling mechanism is put in motion, even though its “frame” is null.  It is by pure chance that things don’t break.  So, the case is handled like a regular uncaught exception.  But this is strange, since a tasklet can by definition have only one
 such.<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Another reason I couldn’t emulate that behaviour with tasklet.throw(), is because it is not possible, or nice, to do so with non-immediate effect.  we shouldn’t
 have a dead tasklet in the runnable queue.<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Hence the change.  If the tasklet is dead, then senditng it an exception is clearly an error, much as trying to rebind a dead tasklet is.  Except for the kill,
 which I think ought to be a harmless special case to allow.  <u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">What do you think?</span></p></div></div></blockquote><div><br></div><div style>I think I'm confused :-)</div><div> <span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:11pt"> </span></div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="white" lang="EN-GB" link="blue" vlink="purple">

<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Btw,
<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">This does not preclude thinking more about how to deal with unhandled exceptions.  The current built-in behaviour is to invoke them on the mani tasklet.  But
 here is an idea:  How about defining a class method on the tasklet class, default_handler(exc, val, tb), which does this?  Then, frameworks and others can redefine this in a subclass.<u></u><u></u></span></p>
<p class=""><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">The benefit of doing this, rather than having people wrap their main functions in try:except, is that this will work even when the tasklet hasn’t started yet,
 when the tasklet is fresh in the runnable queue.</span></p></div></blockquote><div style>Is there a need for multiple versions of this in the same Python runtime?  I'm not convinced, and would prefer that we kept it as simple as possible.  To me, it seems a better fit to do a more standard global "stackless.set_exception_handler".  But I'd prefer we don't take this approach at all.</div>
<div style><br></div><div style>When I think about this and recall different frameworks I've written and the things which got in the way, I'd prefer we made it more generic and flexible.  Why just have an exception handler?  I think it should be a globally applied callable wrapper for tasklets.  But rather than manually needing to subclass a tasklet, have it applied automatically.</div>
<div style><br></div><div style>e.g.</div><div style><br></div><div style>def tasklet_bootstrap(f, *args, **kwargs):</div><div style>    try:</div><div style>        ret = f(*args, **kwargs)</div><div style>    except:</div>
<div style>        # handle</div><div style><br></div><div style>stackless.set_callable_wrapper(tasklet_bootstrap)</div><div style><br></div><div style>Cheers,</div><div style>Richard.</div></div></div></div>