diff options
Diffstat (limited to 'deps/v8/test/mjsunit/es6/instanceof-proxies.js')
-rw-r--r-- | deps/v8/test/mjsunit/es6/instanceof-proxies.js | 62 |
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); +})(); |