// 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; } 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); } 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); } 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; } 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; } assertFalse(f()); assertFalse(f()); %OptimizeFunctionOnNextCall(f); assertFalse(f()); B[Symbol.hasInstance] = () => { return true; }; assertTrue(f()); })();