summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_6/RegExp/constructor-regexp.js
blob: 419b0271389e286dfccc9fa2604aeee95f6b936b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var BUGNUMBER = 1130860;
var summary = "RegExp constructor shouldn't invoke source/flags getters on argument RegExp instance.";

print(BUGNUMBER + ": " + summary);

// same-compartment
var a = /foo/;
var flagsCalled = false;
var sourceCalled = false;
Object.defineProperty(a, "source", { get: () => {
  sourceCalled = true;
  return "bar";
}});
Object.defineProperty(a, "flags", { get: () => {
  flagsCalled = true;
  return "i";
}});

assertEq(a.source, "bar");
assertEq(a.flags, "i");
assertEq(sourceCalled, true);
assertEq(flagsCalled, true);

sourceCalled = false;
flagsCalled = false;
assertEq(new RegExp(a).source, "foo");
assertEq(sourceCalled, false);
assertEq(flagsCalled, false);

// cross-compartment
var g = newGlobal();
var b = g.eval(`
var b = /foo2/;
var flagsCalled = false;
var sourceCalled = false;
Object.defineProperty(b, "source", { get: () => {
  sourceCalled = true;
  return "bar2";
}});
Object.defineProperty(b, "flags", { get: () => {
  flagsCalled = true;
  return "i";
}});
b;
`);

assertEq(b.source, "bar2");
assertEq(b.flags, "i");
assertEq(g.eval("sourceCalled;"), true);
assertEq(g.eval("flagsCalled;"), true);

g.eval(`
sourceCalled = false;
flagsCalled = false;
`);
assertEq(new RegExp(b).source, "foo2");
assertEq(g.eval("sourceCalled;"), false);
assertEq(g.eval("flagsCalled;"), false);

if (typeof reportCompare === "function")
    reportCompare(true, true);