summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/es6/instanceof-proxies.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/es6/instanceof-proxies.js')
-rw-r--r--deps/v8/test/mjsunit/es6/instanceof-proxies.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/es6/instanceof-proxies.js b/deps/v8/test/mjsunit/es6/instanceof-proxies.js
new file mode 100644
index 0000000000..cc720ad8fe
--- /dev/null
+++ b/deps/v8/test/mjsunit/es6/instanceof-proxies.js
@@ -0,0 +1,62 @@
+// 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: --harmony-proxies --allow-natives-syntax
+
+// Test instanceof with proxies.
+
+(function TestInstanceOfWithProxies() {
+ function foo(x) {
+ return x instanceof Array;
+ }
+ assertTrue(foo([]));
+ assertFalse(foo({}));
+ %OptimizeFunctionOnNextCall(foo);
+ assertTrue(foo([]));
+ assertFalse(foo({}));
+
+ var handler = {
+ getPrototypeOf: function(target) { return Array.prototype; }
+ };
+ var p = new Proxy({}, handler);
+ assertTrue(foo(p));
+ var o = {};
+ o.__proto__ = p;
+ assertTrue(foo(o));
+
+ // Make sure we are also correct if the handler throws.
+ handler.getPrototypeOf = function(target) {
+ throw "uncooperative";
+ }
+ assertThrows("foo(o)");
+
+ // Including if the optimized function has a catch handler.
+ function foo_catch(x) {
+ try {
+ x instanceof Array;
+ } catch(e) {
+ assertEquals("uncooperative", e);
+ return true;
+ }
+ return false;
+ }
+ assertTrue(foo_catch(o));
+ %OptimizeFunctionOnNextCall(foo_catch);
+ assertTrue(foo_catch(o));
+ handler.getPrototypeOf = function(target) { return Array.prototype; }
+ assertFalse(foo_catch(o));
+})();
+
+
+(function testInstanceOfWithRecursiveProxy() {
+ // Make sure we gracefully deal with recursive proxies.
+ var proxy = new Proxy({},{});
+ proxy.__proto__ = proxy;
+ // instanceof will cause an inifinite prototype walk.
+ assertThrows(() => { proxy instanceof Object }, RangeError);
+
+ var proxy2 = new Proxy({}, {getPrototypeOf() { return proxy2 }});
+ assertThrows(() => { proxy instanceof Object }, RangeError);
+})();