| var BUGNUMBER = 1147817; |
| var summary = "RegExp constructor should check pattern.constructor."; |
| |
| print(BUGNUMBER + ": " + summary); |
| |
| var g = newGlobal(); |
| |
| var re = /foo/; |
| assertEq(RegExp(re), re); |
| re.constructor = 10; |
| assertEq(RegExp(re) === re, false); |
| assertEq(RegExp(re).toString(), re.toString()); |
| |
| // If pattern comes from different global, RegExp shouldn't return it. |
| re = g.eval(`var re = /foo/; re;`); |
| assertEq(RegExp(re) === re, false); |
| assertEq(RegExp(re).toString(), re.toString()); |
| g.eval(`re.constructor = 10;`); |
| assertEq(RegExp(re) === re, false); |
| assertEq(RegExp(re).toString(), re.toString()); |
| |
| |
| re = new Proxy(/a/, { |
| get(that, name) { |
| return that[name]; |
| } |
| }); |
| assertEq(RegExp(re) === re, false); |
| |
| re = new Proxy(g.eval(`/a/`), { |
| get(that, name) { |
| return that[name]; |
| } |
| }); |
| assertEq(RegExp(re) === re, false); |
| |
| re = g.eval(`new Proxy(/a/, { |
| get(that, name) { |
| return that[name]; |
| } |
| });`); |
| assertEq(RegExp(re) === re, false); |
| |
| |
| var obj = { [Symbol.match]: true, source: "foo", flags: "gi" }; |
| assertEq(RegExp(obj) === obj, false); |
| assertEq(RegExp(obj).toString(), "/foo/gi"); |
| obj.constructor = RegExp; |
| assertEq(RegExp(obj), obj); |
| |
| obj = g.eval(`var obj = { [Symbol.match]: true, source: "foo", flags: "gi" }; obj;`); |
| assertEq(RegExp(obj) === obj, false); |
| assertEq(RegExp(obj).toString(), "/foo/gi"); |
| g.eval(`obj.constructor = RegExp`); |
| assertEq(RegExp(obj) === obj, false); |
| obj.constructor = RegExp; |
| assertEq(RegExp(obj), obj); |
| |
| if (typeof reportCompare === "function") |
| reportCompare(true, true); |