<div dir="ltr"><div><div>Yes, that's the problem. My library is keeping a stack of suspended generators that corresponds to the stack of "await" calls. When an exception occurs I rethrow it into the suspended generators until it gets caught (see the run function in <a href="https://github.com/bjouhier/galaxy/blob/master/lib/galaxy.js">https://github.com/bjouhier/galaxy/blob/master/lib/galaxy.js</a>). This works fine and the exception propagates through the stack of "await" calls exactly as you would expect it to (I have a series of unit tests that check all sorts of try/catch/finally combinations and they work). So the _propagation_ of exceptions through a stack of await calls works fine.<br>
<br></div>What I am lacking is a way to reconstruct the stack trace of await calls when an exception is caught. As the exception goes through my little run function when it bubbles up I could easily collect the stack frames of the suspended generators into the exception object. The only thing that's missing is an API to get stack frame information from a suspended generator.<br>
<br></div>My objective is not too much to get this await stack trace in the debugger, it is to be able to log it when the application is run without a debugger.<br><br><div>A generator object represents a computation which has been suspended. We have an API to resume this computation (next/throw). What's missing is an API to get information about this suspended computation (which function, where in the source).<br>
</div><div><br></div><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/6/15 Kevin Gadd <span dir="ltr"><<a href="mailto:kevin.gadd@gmail.com" target="_blank">kevin.gadd@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>If I understand this right, essentially the problem is that an exception could occur when some of the involved code is not alive on the stack (because the generator(s) are suspended), and without the ability to capture this information, the end user has no actual knowledge of why the exception occurred. Yeah?<br>


<br></div>That makes it hard to leave up to debuggers, since the debugger isn't aware of your generator library and it's pretty hard to extend debuggers. This is a common problem with custom task schedulers based on generators - we had the same problem with imvu.task (debugging tasks in python) and I had the same problem personally with my task scheduler in C#. The simplest solutions (like aggressively capturing stack traces at some appropriate point), even when they work, are pretty expensive.<br>


<br>Is it possible to 'throw into' an ES6 generator? I can't remember if that made it in - in Python, at least, that allows you to basically terminate a generator wherever it is, and through doing so potentially capture a stack trace for the generator after it terminates, from the error bubbling up through the generator... that is, if I remember the semantics for when python sets/overwrites tracebacks correctly. Using such a mechanism, you could reconstruct an 'accurate' stack trace for any number of suspended generators.<br>


</div><div class="gmail_extra"><br clear="all"><div>-kg</div>
<br><br><div class="gmail_quote"><div><div class="h5">On Fri, Jun 14, 2013 at 3:32 PM, Bruno Jouhier <span dir="ltr"><<a href="mailto:bjouhier@gmail.com" target="_blank">bjouhier@gmail.com</a>></span> wrote:<br></div>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">

<div dir="ltr"><div>Thanks David. The problem is that I need it first in node.js, and 
if possible with a standardized API that works in all ES6 JS engines. <br><br></div><div>I
 see this as being similar to asking for a portable "stack" property in 
Error objects. I don't know if it is actually mandated by ES6 but it 
looks like all major JS engines support it now.<br>
<br></div>Note that caller and callee would not work for my use 
case. I need the frame info for a generator object which has been 
suspended, not from the generator function itself.</div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/6/14 David Bruant <span dir="ltr"><<a href="mailto:bruant.d@gmail.com" target="_blank">bruant.d@gmail.com</a>></span><br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Le 14/06/2013 16:56, Bruno Jouhier a écrit :<div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'm using ES6 generators to implement a little async/await library and I'm quite pleased with the result so far but I'm lacking one API: a function to get stack information from a generator object. Ideally it would return the name of the current generator function, the filename and the line number where it last yielded.<br>




<br>
If I had this API I 'd be able to provide a complete trace of the stack of await calls when an exception is caught.<br>
</blockquote></div>
ES5 strict mode poisoned .caller and .callee. The reason is that it isn't necessarily a good idea (security, maybe performance reasons as well) to give authority to the runtime to inspect stack frames. It's more of a debugger use case.<br>




<br>
The Debugger API in Firefox (only available to "Chrome-level" privileged code) has a way to know the function being called, and to navigate across the different frames like the caller frame ("older" property) [1] and some infos that help finding the function name, filename and line number.<br>




<br>
David<br>
<br>
[1] <a href="https://developer.mozilla.org/en-US/docs/SpiderMonkey/JS_Debugger_API_Reference/Debugger.Frame" target="_blank">https://developer.mozilla.org/<u></u>en-US/docs/SpiderMonkey/JS_<u></u>Debugger_API_Reference/<u></u>Debugger.Frame</a><br>




</blockquote></div><br></div>
</div></div><br></div></div>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>