blob: 559ac00cd08c8a4f45210519fc9a1160960e99bb [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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() {
Ben Murdochda12d292016-06-02 14:46:10 +010024 let allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025 class A extends RegExp {
Ben Murdochda12d292016-06-02 14:46:10 +010026 get source() {
27 if (!allow) throw new Error("should not be called");
28 return super.source;
29 }
30 get flags() {
31 if (!allow) throw new Error("should not be called");
32 return super.flags
33 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000034 }
35
36 var r = new A("biep");
37 var r2 = RegExp(r);
38
39 assertFalse(r === r2);
Ben Murdochda12d292016-06-02 14:46:10 +010040 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000041 assertEquals(r, r2);
Ben Murdochda12d292016-06-02 14:46:10 +010042 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043 assertTrue(A.prototype === r.__proto__);
44 assertTrue(RegExp.prototype === r2.__proto__);
45
46 var r3 = RegExp(r);
47 assertFalse(r3 === r);
Ben Murdochda12d292016-06-02 14:46:10 +010048 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000049 assertEquals(r3, r);
Ben Murdochda12d292016-06-02 14:46:10 +010050 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000051
52 var r4 = new A(r2);
53 assertFalse(r4 === r2);
Ben Murdochda12d292016-06-02 14:46:10 +010054 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055 assertEquals(r4, r2);
Ben Murdochda12d292016-06-02 14:46:10 +010056 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000057 assertTrue(A.prototype === r4.__proto__);
58
59 r[Symbol.match] = false;
60 var r5 = new A(r);
61 assertFalse(r5 === r);
Ben Murdochda12d292016-06-02 14:46:10 +010062 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000063 assertEquals(r5, r);
Ben Murdochda12d292016-06-02 14:46:10 +010064 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000065 assertTrue(A.prototype === r5.__proto__);
66})();
67
68(function() {
69 var log = [];
70 var match = {
71 get source() { log.push("source"); return "biep"; },
72 get flags() { log.push("flags"); return "i"; }
73 };
74 Object.defineProperty(match, Symbol.match,
75 {get() { log.push("match"); return true; }});
76 var r = RegExp(match);
77 assertEquals(["match", "source", "flags"], log);
78 assertFalse(r === match);
79 assertEquals(/biep/i, r);
80})();
81
82(function() {
83 var log = [];
84 var match = {
85 get source() { log.push("source"); return "biep"; },
86 get flags() { log.push("flags"); return "i"; }
87 };
88 Object.defineProperty(match, Symbol.match,
89 {get() { log.push("match"); return true; }});
90 match.constructor = RegExp;
91 var r = RegExp(match);
92 assertEquals(["match"], log);
93 assertTrue(r === match);
94})();
95
96(function() {
97 var r = RegExp("biep", "i");
98 r[Symbol.match] = false;
99 var r2 = RegExp(r, "g");
100 assertFalse(r === r2);
101 assertEquals(/biep/i, r);
102 assertEquals(/biep/g, r2);
103})();
104
105(function() {
106 class A extends RegExp {
107 get ["constructor"]() { log.push("constructor"); return RegExp; }
108 }
109 var r = new A("biep");
110 var log = [];
111 var r2 = RegExp(r);
112 assertEquals(["constructor"], log);
113 assertTrue(r === r2);
114})();