|  | // 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 | 
|  |  | 
|  | // 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); | 
|  | })(); |