blob: b685ff2991b428ca6e1b5f1309d39dea8873ae23 [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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005"use strict";
6
7function 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() {
Ben Murdochda12d292016-06-02 14:46:10 +010022 let allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000023 class A extends RegExp {
Ben Murdochda12d292016-06-02 14:46:10 +010024 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 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000032 }
33
34 var r = new A("biep");
35 var r2 = RegExp(r);
36
37 assertFalse(r === r2);
Ben Murdochda12d292016-06-02 14:46:10 +010038 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039 assertEquals(r, r2);
Ben Murdochda12d292016-06-02 14:46:10 +010040 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000041 assertTrue(A.prototype === r.__proto__);
42 assertTrue(RegExp.prototype === r2.__proto__);
43
44 var r3 = RegExp(r);
45 assertFalse(r3 === r);
Ben Murdochda12d292016-06-02 14:46:10 +010046 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047 assertEquals(r3, r);
Ben Murdochda12d292016-06-02 14:46:10 +010048 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000049
50 var r4 = new A(r2);
51 assertFalse(r4 === r2);
Ben Murdochda12d292016-06-02 14:46:10 +010052 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000053 assertEquals(r4, r2);
Ben Murdochda12d292016-06-02 14:46:10 +010054 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055 assertTrue(A.prototype === r4.__proto__);
56
57 r[Symbol.match] = false;
58 var r5 = new A(r);
59 assertFalse(r5 === r);
Ben Murdochda12d292016-06-02 14:46:10 +010060 allow = true;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061 assertEquals(r5, r);
Ben Murdochda12d292016-06-02 14:46:10 +010062 allow = false;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000063 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})();