1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 "use strict"; 6 7 function should_not_be_called() { 8 throw new Error("should not be called"); 9 } 10 11 (function() { 12 var r = new RegExp("biep"); 13 assertTrue(r === RegExp(r)); 14 assertFalse(r === new RegExp(r)); 15 r[Symbol.match] = false; 16 Object.defineProperty(r, "source", {get: should_not_be_called}); 17 Object.defineProperty(r, "flags", {get: should_not_be_called}); 18 assertFalse(r === RegExp(r)); 19 })(); 20 21 (function() { 22 let allow = false; 23 class A extends RegExp { 24 get source() { 25 if (!allow) throw new Error("should not be called"); 26 return super.source; 27 } 28 get flags() { 29 if (!allow) throw new Error("should not be called"); 30 return super.flags 31 } 32 } 33 34 var r = new A("biep"); 35 var r2 = RegExp(r); 36 37 assertFalse(r === r2); 38 allow = true; 39 assertEquals(r, r2); 40 allow = false; 41 assertTrue(A.prototype === r.__proto__); 42 assertTrue(RegExp.prototype === r2.__proto__); 43 44 var r3 = RegExp(r); 45 assertFalse(r3 === r); 46 allow = true; 47 assertEquals(r3, r); 48 allow = false; 49 50 var r4 = new A(r2); 51 assertFalse(r4 === r2); 52 allow = true; 53 assertEquals(r4, r2); 54 allow = false; 55 assertTrue(A.prototype === r4.__proto__); 56 57 r[Symbol.match] = false; 58 var r5 = new A(r); 59 assertFalse(r5 === r); 60 allow = true; 61 assertEquals(r5, r); 62 allow = false; 63 assertTrue(A.prototype === r5.__proto__); 64 })(); 65 66 (function() { 67 var log = []; 68 var match = { 69 get source() { log.push("source"); return "biep"; }, 70 get flags() { log.push("flags"); return "i"; } 71 }; 72 Object.defineProperty(match, Symbol.match, 73 {get() { log.push("match"); return true; }}); 74 var r = RegExp(match); 75 assertEquals(["match", "source", "flags"], log); 76 assertFalse(r === match); 77 assertEquals(/biep/i, r); 78 })(); 79 80 (function() { 81 var log = []; 82 var match = { 83 get source() { log.push("source"); return "biep"; }, 84 get flags() { log.push("flags"); return "i"; } 85 }; 86 Object.defineProperty(match, Symbol.match, 87 {get() { log.push("match"); return true; }}); 88 match.constructor = RegExp; 89 var r = RegExp(match); 90 assertEquals(["match"], log); 91 assertTrue(r === match); 92 })(); 93 94 (function() { 95 var r = RegExp("biep", "i"); 96 r[Symbol.match] = false; 97 var r2 = RegExp(r, "g"); 98 assertFalse(r === r2); 99 assertEquals(/biep/i, r); 100 assertEquals(/biep/g, r2); 101 })(); 102 103 (function() { 104 class A extends RegExp { 105 get ["constructor"]() { log.push("constructor"); return RegExp; } 106 } 107 var r = new A("biep"); 108 var log = []; 109 var r2 = RegExp(r); 110 assertEquals(["constructor"], log); 111 assertTrue(r === r2); 112 })(); 113