Le 15/06/2013 11:18, Bruno Jouhier a écrit :
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).
As an aside, note that we already have this sort of problem today with event loop turns.

    function schedule(){
        if(Math.random() < 0.5)
            throw new Error('whatever');
        else
            setTimeout(schedule, Math.random()*100);
    }

    setTimeout(schedule, (Math.random()*100) |0)
    setTimeout(schedule, (Math.random()*100) |0)

There is no way to know how many scheduling happened before the first thrown error, nor whether the error comes from the first or second scheduling originally. And that's a dummy 5-line example. It gets worse when you have a sequence of different events (or promise resolutions) called at different times, adding other listeners, etc. Q solves that with long stack traces [1] (only for promises I believe). It might be worth looking into it.


Back to your problem, I worry that this kind of information (a call to get the stack trace of where the generator last yielding with line number) may partially break encapsulation which wouldn't be good for security.
I'm thinking of something like:

    (exports => {
        var someCrucialInfo = // boolean

        exports.bla = function*(){
            if(someCrucialInfo){
                doX();
                yield 27;
            }
            else{
                doY();
                yield 27;
            }
        }
    })(this);

    var v = this.bla();
    var l = getLastBlaYieldLine(bla);
    // given l, the encapsulated value of someCrucialInfo can be inferred

cc'ing MarkM to get his eyes on it as I don't feel qualified to assess the gravity. oh... and we have the source code of functions by default with Function#toString. This sort of inference can happen in regular error stack traces too, but requires for a function to throw which happens only if it's supposed to, not at the caller's will. Though I realize now that anyone holding a reference to a generator can force an error being thrown and, if uncaught, it generates a stack trace leaking the line number even without the API you're asking for (but that would work only once)

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.
I believe the state of TC39 on Error#stack can be found at
http://wiki.ecmascript.org/doku.php?id=strawman:error_stack

David

[1] https://github.com/kriskowal/q#long-stack-traces
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to