mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-28 10:13:55 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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());
 | |
| })();
 |