Home | History | Annotate | Download | only in es6
      1 // Copyright 2015 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 "use strict";
      6 
      7 function should_not_be_called() {
      8   throw new Error("should not be called");
      9 }
     10 
     11 (function() {
     12   var r = new RegExp("biep");
     13   assertTrue(r === RegExp(r));
     14   assertFalse(r === new RegExp(r));
     15   r[Symbol.match] = false;
     16   Object.defineProperty(r, "source", {get: should_not_be_called});
     17   Object.defineProperty(r, "flags", {get: should_not_be_called});
     18   assertFalse(r === RegExp(r));
     19 })();
     20 
     21 (function() {
     22   let allow = false;
     23   class A extends RegExp {
     24     get source() {
     25       if (!allow) throw new Error("should not be called");
     26       return super.source;
     27     }
     28     get flags() {
     29       if (!allow) throw new Error("should not be called");
     30       return super.flags
     31     }
     32   }
     33 
     34   var r = new A("biep");
     35   var r2 = RegExp(r);
     36 
     37   assertFalse(r === r2);
     38   allow = true;
     39   assertEquals(r, r2);
     40   allow = false;
     41   assertTrue(A.prototype === r.__proto__);
     42   assertTrue(RegExp.prototype === r2.__proto__);
     43 
     44   var r3 = RegExp(r);
     45   assertFalse(r3 === r);
     46   allow = true;
     47   assertEquals(r3, r);
     48   allow = false;
     49 
     50   var r4 = new A(r2);
     51   assertFalse(r4 === r2);
     52   allow = true;
     53   assertEquals(r4, r2);
     54   allow = false;
     55   assertTrue(A.prototype === r4.__proto__);
     56 
     57   r[Symbol.match] = false;
     58   var r5 = new A(r);
     59   assertFalse(r5 === r);
     60   allow = true;
     61   assertEquals(r5, r);
     62   allow = false;
     63   assertTrue(A.prototype === r5.__proto__);
     64 })();
     65 
     66 (function() {
     67   var log = [];
     68   var match = {
     69     get source() { log.push("source"); return "biep"; },
     70     get flags() { log.push("flags"); return "i"; }
     71   };
     72   Object.defineProperty(match, Symbol.match,
     73       {get() { log.push("match"); return true; }});
     74   var r = RegExp(match);
     75   assertEquals(["match", "source", "flags"], log);
     76   assertFalse(r === match);
     77   assertEquals(/biep/i, r);
     78 })();
     79 
     80 (function() {
     81   var log = [];
     82   var match = {
     83     get source() { log.push("source"); return "biep"; },
     84     get flags() { log.push("flags"); return "i"; }
     85   };
     86   Object.defineProperty(match, Symbol.match,
     87       {get() { log.push("match"); return true; }});
     88   match.constructor = RegExp;
     89   var r = RegExp(match);
     90   assertEquals(["match"], log);
     91   assertTrue(r === match);
     92 })();
     93 
     94 (function() {
     95   var r = RegExp("biep", "i");
     96   r[Symbol.match] = false;
     97   var r2 = RegExp(r, "g");
     98   assertFalse(r === r2);
     99   assertEquals(/biep/i, r);
    100   assertEquals(/biep/g, r2);
    101 })();
    102 
    103 (function() {
    104   class A extends RegExp {
    105     get ["constructor"]() { log.push("constructor"); return RegExp; }
    106   }
    107   var r = new A("biep");
    108   var log = [];
    109   var r2 = RegExp(r);
    110   assertEquals(["constructor"], log);
    111   assertTrue(r === r2);
    112 })();
    113