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// Flags: --harmony-regexp-subclass 6 7"use strict"; 8 9function should_not_be_called() { 10 throw new Error("should not be called"); 11} 12 13(function() { 14 var r = new RegExp("biep"); 15 assertTrue(r === RegExp(r)); 16 assertFalse(r === new RegExp(r)); 17 r[Symbol.match] = false; 18 Object.defineProperty(r, "source", {get: should_not_be_called}); 19 Object.defineProperty(r, "flags", {get: should_not_be_called}); 20 assertFalse(r === RegExp(r)); 21})(); 22 23(function() { 24 class A extends RegExp { 25 get source() { throw new Error("should not be called") } 26 get flags() { throw new Error("should not be called") } 27 } 28 29 var r = new A("biep"); 30 var r2 = RegExp(r); 31 32 assertFalse(r === r2); 33 assertEquals(r, r2); 34 assertTrue(A.prototype === r.__proto__); 35 assertTrue(RegExp.prototype === r2.__proto__); 36 37 var r3 = RegExp(r); 38 assertFalse(r3 === r); 39 assertEquals(r3, r); 40 41 var r4 = new A(r2); 42 assertFalse(r4 === r2); 43 assertEquals(r4, r2); 44 assertTrue(A.prototype === r4.__proto__); 45 46 r[Symbol.match] = false; 47 var r5 = new A(r); 48 assertFalse(r5 === r); 49 assertEquals(r5, r); 50 assertTrue(A.prototype === r5.__proto__); 51})(); 52 53(function() { 54 var log = []; 55 var match = { 56 get source() { log.push("source"); return "biep"; }, 57 get flags() { log.push("flags"); return "i"; } 58 }; 59 Object.defineProperty(match, Symbol.match, 60 {get() { log.push("match"); return true; }}); 61 var r = RegExp(match); 62 assertEquals(["match", "source", "flags"], log); 63 assertFalse(r === match); 64 assertEquals(/biep/i, r); 65})(); 66 67(function() { 68 var log = []; 69 var match = { 70 get source() { log.push("source"); return "biep"; }, 71 get flags() { log.push("flags"); return "i"; } 72 }; 73 Object.defineProperty(match, Symbol.match, 74 {get() { log.push("match"); return true; }}); 75 match.constructor = RegExp; 76 var r = RegExp(match); 77 assertEquals(["match"], log); 78 assertTrue(r === match); 79})(); 80 81(function() { 82 var r = RegExp("biep", "i"); 83 r[Symbol.match] = false; 84 var r2 = RegExp(r, "g"); 85 assertFalse(r === r2); 86 assertEquals(/biep/i, r); 87 assertEquals(/biep/g, r2); 88})(); 89 90(function() { 91 class A extends RegExp { 92 get ["constructor"]() { log.push("constructor"); return RegExp; } 93 } 94 var r = new A("biep"); 95 var log = []; 96 var r2 = RegExp(r); 97 assertEquals(["constructor"], log); 98 assertTrue(r === r2); 99})(); 100