|  | // 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. | 
|  |  | 
|  | "use strict"; | 
|  |  | 
|  | function should_not_be_called() { | 
|  | throw new Error("should not be called"); | 
|  | } | 
|  |  | 
|  | (function() { | 
|  | var r = new RegExp("biep"); | 
|  | assertTrue(r === RegExp(r)); | 
|  | assertFalse(r === new RegExp(r)); | 
|  | r[Symbol.match] = false; | 
|  | Object.defineProperty(r, "source", {get: should_not_be_called}); | 
|  | Object.defineProperty(r, "flags", {get: should_not_be_called}); | 
|  | assertFalse(r === RegExp(r)); | 
|  | })(); | 
|  |  | 
|  | (function() { | 
|  | let allow = false; | 
|  | class A extends RegExp { | 
|  | get source() { | 
|  | if (!allow) throw new Error("should not be called"); | 
|  | return super.source; | 
|  | } | 
|  | get flags() { | 
|  | if (!allow) throw new Error("should not be called"); | 
|  | return super.flags | 
|  | } | 
|  | } | 
|  |  | 
|  | var r = new A("biep"); | 
|  | var r2 = RegExp(r); | 
|  |  | 
|  | assertFalse(r === r2); | 
|  | allow = true; | 
|  | assertEquals(r, r2); | 
|  | allow = false; | 
|  | assertTrue(A.prototype === r.__proto__); | 
|  | assertTrue(RegExp.prototype === r2.__proto__); | 
|  |  | 
|  | var r3 = RegExp(r); | 
|  | assertFalse(r3 === r); | 
|  | allow = true; | 
|  | assertEquals(r3, r); | 
|  | allow = false; | 
|  |  | 
|  | var r4 = new A(r2); | 
|  | assertFalse(r4 === r2); | 
|  | allow = true; | 
|  | assertEquals(r4, r2); | 
|  | allow = false; | 
|  | assertTrue(A.prototype === r4.__proto__); | 
|  |  | 
|  | r[Symbol.match] = false; | 
|  | var r5 = new A(r); | 
|  | assertFalse(r5 === r); | 
|  | allow = true; | 
|  | assertEquals(r5, r); | 
|  | allow = false; | 
|  | assertTrue(A.prototype === r5.__proto__); | 
|  | })(); | 
|  |  | 
|  | (function() { | 
|  | var log = []; | 
|  | var match = { | 
|  | get source() { log.push("source"); return "biep"; }, | 
|  | get flags() { log.push("flags"); return "i"; } | 
|  | }; | 
|  | Object.defineProperty(match, Symbol.match, | 
|  | {get() { log.push("match"); return true; }}); | 
|  | var r = RegExp(match); | 
|  | assertEquals(["match", "source", "flags"], log); | 
|  | assertFalse(r === match); | 
|  | assertEquals(/biep/i, r); | 
|  | })(); | 
|  |  | 
|  | (function() { | 
|  | var log = []; | 
|  | var match = { | 
|  | get source() { log.push("source"); return "biep"; }, | 
|  | get flags() { log.push("flags"); return "i"; } | 
|  | }; | 
|  | Object.defineProperty(match, Symbol.match, | 
|  | {get() { log.push("match"); return true; }}); | 
|  | match.constructor = RegExp; | 
|  | var r = RegExp(match); | 
|  | assertEquals(["match"], log); | 
|  | assertTrue(r === match); | 
|  | })(); | 
|  |  | 
|  | (function() { | 
|  | var r = RegExp("biep", "i"); | 
|  | r[Symbol.match] = false; | 
|  | var r2 = RegExp(r, "g"); | 
|  | assertFalse(r === r2); | 
|  | assertEquals(/biep/i, r); | 
|  | assertEquals(/biep/g, r2); | 
|  | })(); | 
|  |  | 
|  | (function() { | 
|  | class A extends RegExp { | 
|  | get ["constructor"]() { log.push("constructor"); return RegExp; } | 
|  | } | 
|  | var r = new A("biep"); | 
|  | var log = []; | 
|  | var r2 = RegExp(r); | 
|  | assertEquals(["constructor"], log); | 
|  | assertTrue(r === r2); | 
|  | })(); |