Home | History | Annotate | Download | only in es6
      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