From 2ae439574fde34fde5b45c20ba34a04f29a6b556 Mon Sep 17 00:00:00 2001 From: Michael Ficarra Date: Mon, 26 Sep 2022 15:43:08 -0600 Subject: [PATCH 1/2] fixes #230: don't await non-objects returned from AsyncIterator HoFs --- spec.html | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/spec.html b/spec.html index b527d10..4fd4c4f 100644 --- a/spec.html +++ b/spec.html @@ -175,6 +175,20 @@

IfAbruptCloseAsyncIterator ( _value_, _iteratorRecord_ )

1. Else if _value_ is a Completion Record, set _value_ to _value_.[[Value]]. + + +

+ AwaitNonPrimitive ( + _value_: an ECMAScript language value + ): either a normal completion containing an ECMAScript language value or a throw completion +

+
+
+ + 1. If _value_ is an Object, return ? Await(_value_). + 1. Else, return _value_. + +
@@ -719,7 +733,7 @@

AsyncIterator.prototype.map ( _mapper_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _mapped_ be Completion(Call(_mapper_, *undefined*, « _value_ »)). 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_). @@ -739,7 +753,7 @@

AsyncIterator.prototype.filter ( _filterer_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _selected_ be Completion(Call(_filterer_, *undefined*, « _value_ »)). 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_)). @@ -826,7 +840,7 @@

AsyncIterator.prototype.flatMap ( _mapper_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _mapped_ be Completion(Call(_mapper_, *undefined*, « _value_ »)). 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(GetIterator(_mapped_, ~async~)). 1. IfAbruptCloseAsyncIterator(_innerIterator_, _iterated_). @@ -872,7 +886,7 @@

AsyncIterator.prototype.reduce ( _reducer_ [ , _initialValue_ ] )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _result_ be Completion(Call(_reducer_, *undefined*, « _accumulator_, _value_ »)). 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_. @@ -904,7 +918,7 @@

AsyncIterator.prototype.forEach ( _fn_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _r_ be Completion(Call(_fn_, *undefined*, « _value_ »)). 1. IfAbruptCloseAsyncIterator(_r_, _iterated_). - 1. Set _r_ to Await(r). + 1. Set _r_ to Completion(AwaitNonPrimitive(r)). 1. IfAbruptCloseAsyncIterator(_r_, _iterated_).
@@ -921,7 +935,7 @@

AsyncIterator.prototype.some ( _fn_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _result_ be Completion(Call(_fn_, *undefined*, « _value_ »)). 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*)). @@ -939,7 +953,7 @@

AsyncIterator.prototype.every ( _fn_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _result_ be Completion(Call(_fn_, *undefined*, « _value_ »)). 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*)). @@ -957,7 +971,7 @@

AsyncIterator.prototype.find ( _fn_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _result_ be Completion(Call(_fn_, *undefined*, « _value_ »)). 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_)). From 20f4e187c9df26f01187a3942205f6fc4faa275c Mon Sep 17 00:00:00 2001 From: Michael Ficarra Date: Mon, 26 Sep 2022 15:51:33 -0600 Subject: [PATCH 2/2] fix formatting --- spec.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec.html b/spec.html index 4fd4c4f..2a46a25 100644 --- a/spec.html +++ b/spec.html @@ -179,7 +179,7 @@

IfAbruptCloseAsyncIterator ( _value_, _iteratorRecord_ )

AwaitNonPrimitive ( - _value_: an ECMAScript language value + _value_: an ECMAScript language value, ): either a normal completion containing an ECMAScript language value or a throw completion