-
Notifications
You must be signed in to change notification settings - Fork 16
Description
fromAsync
makes use of an Abstract Closure passed to AsyncFunctionStart
. What is the return type of this closure? The use of ?
implies it must be a Completion Record, but there's also a bare Return A.
which returns a value not wrapped in a completion record. In normal built-in functions this would be implicitly wrapped in NormalCompletion
by the rules in this clause, but a.) that doesn't apply within the Abstract Closure (rather, it's the thing which allows the final Return promiseCapability.[[Promise]]
line to work and b.) that wouldn't do the right thing anyway, because the logic in AsyncBlockStart
treats an invocation returning a normal completion as if it had explicitly returned undefined
(which is how normal functions work) - an actual return would be a return completion.
I see three possible ways forward:
- in the closure within
fromAsync
, explicitly wrap eachReturn _value_.
asReturn Completion Record { [[Type]]: ~return~, [[Value]]: _value_, [[Target]]: empty }
- in
AsyncFunctionStart
, have a different path for Abstract Closures vs built-in functions - define "built-in async function" rigorously in a way which would allow you to write the steps of a built-in function, but using
Await
Of these I think the third option is cleanest, especially if we add more built-in async stuff (as the iterator helpers proposal will do).