[es6] Make sure we do not invoke setter when calling Promise.all
authorarv <arv@chromium.org>
Mon, 29 Jun 2015 18:14:29 +0000 (11:14 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 29 Jun 2015 18:14:37 +0000 (18:14 +0000)
We were calling the setter for Object.prototype.promise if it existed
when calling PromiseAll.

BUG=v9:4232
LOG=N
R=rossberg@chromium.org, adamk@chromium.org

Review URL: https://codereview.chromium.org/1219623005

Cr-Commit-Position: refs/heads/master@{#29357}

src/promise.js
test/mjsunit/es6/promise-internal-setter.js [new file with mode: 0644]

index 2634fde0bb8e8c9b5f0e5eb52be5dd7fde566125..0fd4b89c5173821f972a37d18f78ab789fe1159f 100644 (file)
@@ -189,11 +189,11 @@ function PromiseDeferred() {
       reject: function(r) { PromiseReject(promise, r) }
     };
   } else {
-    var result = {};
+    var result = {promise: UNDEFINED, reject: UNDEFINED, resolve: UNDEFINED};
     result.promise = new this(function(resolve, reject) {
       result.resolve = resolve;
       result.reject = reject;
-    })
+    });
     return result;
   }
 }
diff --git a/test/mjsunit/es6/promise-internal-setter.js b/test/mjsunit/es6/promise-internal-setter.js
new file mode 100644 (file)
index 0000000..83e4738
--- /dev/null
@@ -0,0 +1,17 @@
+// 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.
+
+'use strict';
+
+Object.defineProperties(Object.prototype, {
+  promise: {set: assertUnreachable},
+  reject: {set: assertUnreachable},
+  resolve: {set: assertUnreachable},
+});
+
+class P extends Promise {}
+
+P.all([Promise.resolve('ok')]);
+P.race([Promise.resolve('ok')]);
+P.defer();