| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| var log = []; |
| |
| var fake = |
| { |
| get source() { |
| log.push("p"); |
| return { |
| toString: function() { |
| log.push("ps"); |
| return "pattern"; |
| } |
| }; |
| }, |
| get flags() { |
| log.push("f"); |
| return { |
| toString: function() { |
| log.push("fs"); |
| return "flags"; |
| } |
| }; |
| } |
| } |
| |
| function testThrows(x) { |
| try { |
| RegExp.prototype.toString.call(x); |
| } catch (e) { |
| assertTrue(/incompatible receiver/.test(e.message)); |
| return; |
| } |
| assertUnreachable(); |
| } |
| |
| testThrows(1); |
| testThrows(null); |
| Number.prototype.source = "a"; |
| Number.prototype.flags = "b"; |
| testThrows(1); |
| |
| assertEquals("/pattern/flags", RegExp.prototype.toString.call(fake)); |
| assertEquals(["p", "ps", "f", "fs"], log); |
| |
| // Monkey-patching is also possible on RegExp instances |
| |
| let weird = /foo/; |
| Object.defineProperty(weird, 'flags', {value: 'bar'}); |
| Object.defineProperty(weird, 'source', {value: 'baz'}); |
| assertEquals('/baz/bar', weird.toString()); |
| |
| assertEquals('/(?:)/', RegExp.prototype.toString()); |
| assertEquals('(?:)', RegExp.prototype.source); |
| assertEquals('', RegExp.prototype.flags); |