1 // Copyright 2016 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 var log = []; 6 7 var fake = 8 { 9 get source() { 10 log.push("p"); 11 return { 12 toString: function() { 13 log.push("ps"); 14 return "pattern"; 15 } 16 }; 17 }, 18 get flags() { 19 log.push("f"); 20 return { 21 toString: function() { 22 log.push("fs"); 23 return "flags"; 24 } 25 }; 26 } 27 } 28 29 function testThrows(x) { 30 try { 31 RegExp.prototype.toString.call(x); 32 } catch (e) { 33 assertTrue(/incompatible receiver/.test(e.message)); 34 return; 35 } 36 assertUnreachable(); 37 } 38 39 testThrows(1); 40 testThrows(null); 41 Number.prototype.source = "a"; 42 Number.prototype.flags = "b"; 43 testThrows(1); 44 45 assertEquals("/pattern/flags", RegExp.prototype.toString.call(fake)); 46 assertEquals(["p", "ps", "f", "fs"], log); 47 48 // Monkey-patching is also possible on RegExp instances 49 50 let weird = /foo/; 51 Object.defineProperty(weird, 'flags', {value: 'bar'}); 52 Object.defineProperty(weird, 'source', {value: 'baz'}); 53 assertEquals('/baz/bar', weird.toString()); 54 55 assertEquals('/(?:)/', RegExp.prototype.toString()); 56 assertEquals('(?:)', RegExp.prototype.source); 57 assertEquals('', RegExp.prototype.flags); 58