Index: test/mjsunit/es6/promises.js |
diff --git a/test/mjsunit/es6/promises.js b/test/mjsunit/es6/promises.js |
index 6dfe9261a858a3d658df84475feccce63d5a8aaa..faf154ee0a5f7c421bfd8e126f972ab2e31d37a7 100644 |
--- a/test/mjsunit/es6/promises.js |
+++ b/test/mjsunit/es6/promises.js |
@@ -27,6 +27,42 @@ |
// Flags: --allow-natives-syntax |
+// Make sure we don't rely on functions patchable by monkeys. |
+var call = Function.prototype.call.call.bind(Function.prototype.call) |
+var observe = Object.observe; |
+var getOwnPropertyNames = Object.getOwnPropertyNames |
+var defineProperty = Object.defineProperty |
+ |
+function clear(o) { |
+ if (o === null || (typeof o !== 'object' && typeof o !== 'function')) return |
+ clear(o.__proto__) |
+ var properties = getOwnPropertyNames(o) |
+ for (var i in properties) { |
+ clearProp(o, properties[i]) |
+ } |
+} |
+ |
+function clearProp(o, name) { |
+ var poisoned = {caller: 0, callee: 0, arguments: 0} |
+ try { |
+ var x = o[name] |
+ o[name] = undefined |
+ clear(x) |
+ } catch(e) {} // assertTrue(name in poisoned) } |
+} |
+ |
+// Find intrinsics and null them out. |
+var globals = Object.getOwnPropertyNames(this) |
+var whitelist = {Promise: true, TypeError: true} |
+for (var i in globals) { |
+ var name = globals[i] |
+ if (name in whitelist || name[0] === name[0].toLowerCase()) delete globals[i] |
+} |
+for (var i in globals) { |
+ if (globals[i]) clearProp(this, globals[i]) |
+} |
+ |
+ |
var asyncAssertsExpected = 0; |
function assertAsyncRan() { ++asyncAssertsExpected } |
@@ -43,7 +79,7 @@ function assertAsync(b, s) { |
function assertAsyncDone(iteration) { |
var iteration = iteration || 0 |
var dummy = {} |
- Object.observe(dummy, |
+ observe(dummy, |
function() { |
if (asyncAssertsExpected === 0) |
assertAsync(true, "all") |
@@ -777,13 +813,13 @@ function assertAsyncDone(iteration) { |
MyPromise.__proto__ = Promise |
MyPromise.defer = function() { |
log += "d" |
- return this.__proto__.defer.call(this) |
+ return call(this.__proto__.defer, this) |
} |
MyPromise.prototype.__proto__ = Promise.prototype |
MyPromise.prototype.chain = function(resolve, reject) { |
log += "c" |
- return this.__proto__.__proto__.chain.call(this, resolve, reject) |
+ return call(this.__proto__.__proto__.chain, this, resolve, reject) |
} |
log = "" |