| // 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); |
| })(); |