Index: test/mjsunit/regress/regress-3641.js |
diff --git a/test/mjsunit/regress/regress-3641.js b/test/mjsunit/regress/regress-3641.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9aff8c8f7de599961399559bfd5dcc676aa561ce |
--- /dev/null |
+++ b/test/mjsunit/regress/regress-3641.js |
@@ -0,0 +1,56 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --allow-natives-syntax |
+ |
+// If a Promise's then method is overridden, that should be respected |
+// even if the promise is already resolved. x's resolution function is |
+// only called by Promise.resolve(); there shouldn't be a resolution |
+// check before when calling x.then. |
+ |
+ |
+// Async assert framework copied from mjsunit/es6/promises.js |
+ |
+var asyncAssertsExpected = 0; |
+ |
+function assertAsyncRan() { ++asyncAssertsExpected } |
+ |
+function assertLater(f, name) { |
+ assertFalse(f()); // should not be true synchronously |
+ ++asyncAssertsExpected; |
+ var iterations = 0; |
+ function runAssertion() { |
+ if (f()) { |
+ print(name, "succeeded"); |
+ --asyncAssertsExpected; |
+ } else if (iterations++ < 10) { |
+ %EnqueueMicrotask(runAssertion); |
+ } else { |
+ %AbortJS(name + " FAILED!"); |
+ } |
+ } |
+ %EnqueueMicrotask(runAssertion); |
+} |
+ |
+function assertAsyncDone(iteration) { |
+ var iteration = iteration || 0; |
+ %EnqueueMicrotask(function() { |
+ if (asyncAssertsExpected === 0) |
+ assertAsync(true, "all") |
+ else if (iteration > 10) // Shouldn't take more. |
+ assertAsync(false, "all... " + asyncAssertsExpected) |
+ else |
+ assertAsyncDone(iteration + 1) |
+ }); |
+} |
+ |
+// End async assert framework |
+ |
+var y; |
+var x = Promise.resolve(); |
+x.then = () => { y = true; } |
+Promise.resolve().then(() => x); |
+assertLater(() => y === true, "y === true"); |
+ |
+assertAsyncDone(); |