Assertion used to determine if something is an async generator is wrong
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Dec 2017 18:13:15 +0000 (18:13 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 28 Dec 2017 18:13:15 +0000 (18:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=181168
<rdar://problem/35640560>

Reviewed by Yusuke Suzuki.

JSTests:

* stress/async-generator-assertion.js: Added.

Source/JavaScriptCore:

Previous assertions were doing a get on the base value for @@asyncIterator.
This symbol is defined on AsyncGeneratorPrototype. The base value may change
its prototype, but it's still an async generator as far as our system is
concerned. This patch updates the assertion to check for a private property
on the base value.

* builtins/AsyncGeneratorPrototype.js:
(globalPrivate.asyncGeneratorReject):
(globalPrivate.asyncGeneratorResolve):
(globalPrivate.asyncGeneratorResumeNext):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@226305 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/stress/async-generator-assertion.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/builtins/AsyncGeneratorPrototype.js

index 19d572a27b6ac98d9b6bd0cfbe43a2de039ab53e..a1dd991817ad51f74e9fe329e8de5f44f4f48dcb 100644 (file)
@@ -1,3 +1,13 @@
+2017-12-28  Saam Barati  <sbarati@apple.com>
+
+        Assertion used to determine if something is an async generator is wrong
+        https://bugs.webkit.org/show_bug.cgi?id=181168
+        <rdar://problem/35640560>
+
+        Reviewed by Yusuke Suzuki.
+
+        * stress/async-generator-assertion.js: Added.
+
 2017-12-21  Guillaume Emont  <guijemont@igalia.com>
 
         Skip stress/splay-flash-access tests on memory limited platforms
diff --git a/JSTests/stress/async-generator-assertion.js b/JSTests/stress/async-generator-assertion.js
new file mode 100644 (file)
index 0000000..26b71c7
--- /dev/null
@@ -0,0 +1,36 @@
+function assert(b) {
+    if (!b)
+        throw new Error("Bad");
+}
+
+async function* asyncIterator() {
+    yield 42;
+}
+
+function test1() {
+    let p = asyncIterator();
+    p.next().then((x) => {
+        assert(x.value === 42);
+        assert(x.done === false);
+    });
+    p.__proto__ = {};
+    assert(p.next === undefined);
+}
+test1();
+
+let error = null;
+async function test2() {
+    let p2 = asyncIterator();
+    p2.__proto__ = {};
+    try {
+        for await (let x of p2) {
+            throw new Error("Bad!");
+        }
+    } 
+    catch(e) {
+        error = e;
+    }
+}
+test2();
+assert(error instanceof TypeError);
+assert(error.message === "undefined is not a function (near '...x of p2...')");
index ada68775615ca216ed99e14c48e84ba47a1f9e50..b2e3d944a59c7cc52f48807479709d68209b4a47 100644 (file)
@@ -1,3 +1,22 @@
+2017-12-28  Saam Barati  <sbarati@apple.com>
+
+        Assertion used to determine if something is an async generator is wrong
+        https://bugs.webkit.org/show_bug.cgi?id=181168
+        <rdar://problem/35640560>
+
+        Reviewed by Yusuke Suzuki.
+
+        Previous assertions were doing a get on the base value for @@asyncIterator.
+        This symbol is defined on AsyncGeneratorPrototype. The base value may change
+        its prototype, but it's still an async generator as far as our system is
+        concerned. This patch updates the assertion to check for a private property
+        on the base value.
+
+        * builtins/AsyncGeneratorPrototype.js:
+        (globalPrivate.asyncGeneratorReject):
+        (globalPrivate.asyncGeneratorResolve):
+        (globalPrivate.asyncGeneratorResumeNext):
+
 2017-12-27  Carlos Alberto Lopez Perez  <clopez@igalia.com>
 
         Build fix after r226299 (3)
index 1459747884c3de328cfcfc8cd3443724b7935d33..b4b2f8f757a1f3e51b8dc69948185652b834b036 100644 (file)
@@ -103,7 +103,7 @@ function asyncGeneratorReject(generator, exception)
 {
     "use strict";
 
-    @assert(generator.@asyncIteratorSymbol !== @undefined, "Generator is not an AsyncGenerator instance.");
+    @assert(typeof generator.@asyncGeneratorSuspendReason === "number", "Generator is not an AsyncGenerator instance.");
 
     const { promiseCapability } = @asyncGeneratorDequeue(generator);
     promiseCapability.@reject.@call(@undefined, exception);
@@ -116,7 +116,7 @@ function asyncGeneratorResolve(generator, value, done)
 {
     "use strict";
 
-    @assert(generator.@asyncIteratorSymbol !== @undefined, "Generator is not an AsyncGenerator instance.");
+    @assert(typeof generator.@asyncGeneratorSuspendReason === "number", "Generator is not an AsyncGenerator instance.");
 
     const { promiseCapability } = @asyncGeneratorDequeue(generator);
     promiseCapability.@resolve.@call(@undefined, { done, value: value });
@@ -203,7 +203,7 @@ function asyncGeneratorResumeNext(generator)
 {
     "use strict";
 
-    @assert(generator.@asyncIteratorSymbol !== @undefined, "Generator is not an AsyncGenerator instance");
+    @assert(typeof generator.@asyncGeneratorSuspendReason === "number", "Generator is not an AsyncGenerator instance.");
 
     let state = generator.@generatorState;