Skip to content

Commit

Permalink
fixes #230: don't await non-objects returned from functions passed to…
Browse files Browse the repository at this point in the history
… AsyncIterator HoFs (#239)
  • Loading branch information
michaelficarra committed Oct 19, 2022
1 parent 462cd66 commit a736b9d
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions spec.html
Expand Up @@ -307,6 +307,20 @@ <h1>IfAbruptCloseAsyncIterator ( _value_, _iteratorRecord_ )</h1>
1. Else if _value_ is a Completion Record, set _value_ to _value_.[[Value]].
</emu-alg>
</emu-clause>

<emu-clause id="sec-awaitnonprimitive" type="abstract operation">
<h1>
AwaitNonPrimitive (
_value_: an ECMAScript language value,
): either a normal completion containing an ECMAScript language value or a throw completion
</h1>
<dl class="header">
</dl>
<emu-alg>
1. If _value_ is an Object, return ? Await(_value_).
1. Else, return _value_.
</emu-alg>
</emu-clause>
</emu-clause>

<emu-clause id="sec-iterator-objects">
Expand Down Expand Up @@ -848,7 +862,7 @@ <h1>AsyncIterator.prototype.map ( _mapper_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _mapped_ be Completion(Call(_mapper_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_mapped_, _iterated_).
1. Set _mapped_ to Completion(Await(_mapped_)).
1. Set _mapped_ to Completion(AwaitNonPrimitive(_mapped_)).
1. IfAbruptCloseAsyncIterator(_mapped_, _iterated_).
1. Let _completion_ be Completion(Yield(_mapped_)).
1. IfAbruptCloseAsyncIterator(_completion_, _iterated_).
Expand All @@ -871,7 +885,7 @@ <h1>AsyncIterator.prototype.filter ( _filterer_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _selected_ be Completion(Call(_filterer_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_selected_, _iterated_).
1. Set _selected_ to Completion(Await(_selected_)).
1. Set _selected_ to Completion(AwaitNonPrimitive(_selected_)).
1. IfAbruptCloseAsyncIterator(_selected_, _iterated_).
1. If ToBoolean(_selected_) is *true*, then
1. Let _completion_ be Completion(Yield(_value_)).
Expand Down Expand Up @@ -944,7 +958,7 @@ <h1>AsyncIterator.prototype.flatMap ( _mapper_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _mapped_ be Completion(Call(_mapper_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_mapped_, _iterated_).
1. Set _mapped_ to Completion(Await(_mapped_)).
1. Set _mapped_ to Completion(AwaitNonPrimitive(_mapped_)).
1. IfAbruptCloseAsyncIterator(_mapped_, _iterated_).
1. Let _innerIterator_ be Completion(GetIteratorFlattenable(_mapped_, ~async~)).
1. IfAbruptCloseAsyncIterator(_innerIterator_, _iterated_).
Expand Down Expand Up @@ -993,7 +1007,7 @@ <h1>AsyncIterator.prototype.reduce ( _reducer_ [ , _initialValue_ ] )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be Completion(Call(_reducer_, *undefined*, « _accumulator_, _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. Set _result_ to Await(_result_).
1. Set _result_ to Completion(AwaitNonPrimitive(_result_)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. Set _accumulator_ to _result_.
1. Set _counter_ to _counter_ + 1.
Expand Down Expand Up @@ -1027,7 +1041,7 @@ <h1>AsyncIterator.prototype.forEach ( _fn_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _r_ be Completion(Call(_fn_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_r_, _iterated_).
1. Set _r_ to Await(r).
1. Set _r_ to Completion(AwaitNonPrimitive(r)).
1. IfAbruptCloseAsyncIterator(_r_, _iterated_).
1. Set _counter_ to _counter_ + 1.
</emu-alg>
Expand All @@ -1046,7 +1060,7 @@ <h1>AsyncIterator.prototype.some ( _fn_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be Completion(Call(_fn_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. Set _result_ to Await(_result_).
1. Set _result_ to Completion(AwaitNonPrimitive(_result_)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. If ToBoolean(_result_) is *true*, return ? AsyncIteratorClose(_iterated_, NormalCompletion(*true*)).
1. Set _counter_ to _counter_ + 1.
Expand All @@ -1066,7 +1080,7 @@ <h1>AsyncIterator.prototype.every ( _fn_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be Completion(Call(_fn_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. Set _result_ to Await(_result_).
1. Set _result_ to Completion(AwaitNonPrimitive(_result_)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. If ToBoolean(_result_) is *false*, return ? AsyncIteratorClose(_iterated_, NormalCompletion(*false*)).
1. Set _counter_ to _counter_ + 1.
Expand All @@ -1086,7 +1100,7 @@ <h1>AsyncIterator.prototype.find ( _fn_ )</h1>
1. Let _value_ be ? IteratorValue(_next_).
1. Let _result_ be Completion(Call(_fn_, *undefined*, « _value_, 𝔽(_counter_) »)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. Set _result_ to Await(_result_).
1. Set _result_ to Completion(AwaitNonPrimitive(_result_)).
1. IfAbruptCloseAsyncIterator(_result_, _iterated_).
1. If ToBoolean(_result_) is *true*, return ? AsyncIteratorClose(_iterated_, NormalCompletion(_value_)).
1. Set _counter_ to _counter_ + 1.
Expand Down

0 comments on commit a736b9d

Please sign in to comment.