Exceptional exits from generators

Allen Wirfs-Brock allen at wirfs-brock.com
Tue Apr 15 13:18:56 PDT 2014


It woulds also be good to create a bugs.ecmascript.org ticket for this.  That will ensure it doesn't get lost

Allen

On Apr 15, 2014, at 8:25 AM, Allen Wirfs-Brock wrote:

> yes, It's on my "get back to soon" list...
> 
> Allen
> 
> On Apr 14, 2014, at 12:36 AM, Andy Wingo wrote:
> 
>> Hi,
>> 
>> A re-ping on this issue.  Probably the relevant people were distracted
>> by TC39 last week.
>> 
>> On Tue 08 Apr 2014 14:47, Andy Wingo <wingo at igalia.com> writes:
>> 
>>> Hello,
>>> 
>>> The current ES6 draft seems to specify that if a running generator
>>> throws an exception, that its state moves to "completed".  It seems to
>>> specify this in §25.3.3.1, `GeneratorStart'.  (Oddly, the procedure
>>> described in `GeneratorResume' can return to `GeneratorStart'; spec
>>> strangeness).  Anyway, that means that:
>>> 
>>> function *foo() { yield 1; yield 2 }
>>> var iter = foo()
>>> iter.next() // => { value: 1, done: false }
>>> iter.throw(42) // uncaught exception: 42
>>> 
>>> Up to here all good.  And then we have, according to the spec:
>>> 
>>> iter.next() // => { value: undefined, done: true }
>>> 
>>> I find this very strange.  I would have expected an exception of the
>>> kind "generator is already running", as indeed we entered the running
>>> state but never moved out of that state.
>>> 
>>> I think that nonlocal exits from within generators should not move the
>>> state to "completed", and should leave them as "suspendedStart".  Beyond
>>> a subjective impression of strangeness, which not all may share, this
>>> part of the specification requires that the continuation of all
>>> GeneratorResume() invocations include a try/catch to set the generator
>>> state to "completed" if the activation resumes and then exits
>>> nonlocally.  
>>> 
>>> Of course using "iter.throw" is the easy way to cause an exception, but
>>> it could happen within some function called by the generator.  But if we
>>> decide to remove the try/catch from around the GeneratorResume, it might
>>> make sense to also remove the suspendedStart -> completed transition
>>> that is special-cased in Generator.prototype.throw.
>>> 
>>> In summary: the completed-on-exception state change is of little utility
>>> but causes overhead in generator implementations in the form of the
>>> mandatory try/catch around GeneratorResume and so it should be removed
>>> IMO.
>>> 
>>> If it is removed we could also consider removing the
>>> suspendedStart->completed state change on Generator.prototype.throw.  If
>>> that were done we could remove the suspendedStart state entirely; dead
>>> spec elimination ;)
>>> 
>>> WDYT?
>>> 
>>> Regards,
>>> 
>>> Andy
>>> _______________________________________________
>>> es-discuss mailing list
>>> es-discuss at mozilla.org
>>> https://mail.mozilla.org/listinfo/es-discuss
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>> 
> 
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140415/267d0cb4/attachment.html>


More information about the es-discuss mailing list