| // Copyright 2018 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 |
| |
| (function NonConstHasInstance() { |
| var C = { |
| [Symbol.hasInstance] : () => true |
| }; |
| |
| function f() { |
| return {} instanceof C; |
| } |
| |
| %PrepareFunctionForOptimization(f); |
| assertTrue(f()); |
| assertTrue(f()); |
| %OptimizeFunctionOnNextCall(f); |
| assertTrue(f()); |
| C[Symbol.hasInstance] = () => false; |
| assertFalse(f()); |
| })(); |
| |
| (function NumberHasInstance() { |
| var C = { |
| [Symbol.hasInstance] : 0.1 |
| }; |
| |
| function f(b, C) { |
| if (b) return {} instanceof C; |
| return false; |
| } |
| |
| function g(b) { |
| return f(b, C); |
| } |
| |
| %PrepareFunctionForOptimization(g); |
| assertFalse(f(true, Number)); |
| assertFalse(f(true, Number)); |
| assertFalse(g(false)); |
| assertFalse(g(false)); |
| %OptimizeFunctionOnNextCall(g); |
| assertThrows(() => g(true)); |
| })(); |
| |
| (function NonFunctionHasInstance() { |
| var C = { |
| [Symbol.hasInstance] : {} |
| }; |
| |
| function f(b, C) { |
| if (b) return {} instanceof C; |
| return false; |
| } |
| |
| function g(b) { |
| return f(b, C); |
| } |
| |
| %PrepareFunctionForOptimization(g); |
| assertFalse(f(true, Number)); |
| assertFalse(f(true, Number)); |
| assertFalse(g(false)); |
| assertFalse(g(false)); |
| %OptimizeFunctionOnNextCall(g); |
| assertThrows(() => g(true)); |
| })(); |
| |
| (function NonConstHasInstanceProto() { |
| var B = { |
| [Symbol.hasInstance]() { return true; } |
| }; |
| |
| var C = { __proto__ : B }; |
| |
| function f() { |
| return {} instanceof C; |
| } |
| |
| %PrepareFunctionForOptimization(f); |
| assertTrue(f()); |
| assertTrue(f()); |
| %OptimizeFunctionOnNextCall(f); |
| assertTrue(f()); |
| B[Symbol.hasInstance] = () => { return false; }; |
| assertFalse(f()); |
| })(); |
| |
| (function HasInstanceOverwriteOnProto() { |
| var A = { |
| [Symbol.hasInstance] : () => false |
| } |
| |
| var B = { __proto__ : A }; |
| |
| var C = { __proto__ : B }; |
| |
| function f() { |
| return {} instanceof C; |
| } |
| |
| %PrepareFunctionForOptimization(f); |
| assertFalse(f()); |
| assertFalse(f()); |
| %OptimizeFunctionOnNextCall(f); |
| assertFalse(f()); |
| B[Symbol.hasInstance] = () => { return true; }; |
| assertTrue(f()); |
| })(); |