tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

stringbuffer-1.js (1858B)


      1 // |jit-test| skip-if: !getBuildConfiguration("debug")
      2 // stringRepresentation and the bufferRefCount field aren't available in
      3 // all builds.
      4 
      5 gczeal(0);
      6 
      7 function representation(s) {
      8    return JSON.parse(stringRepresentation(s));
      9 }
     10 
     11 function testBasic(tenured) {
     12    var s = newString("abcdefghijklmnopqrstuvwxyz", {newStringBuffer: true, tenured});
     13    assertEq(representation(s).bufferRefCount, 1);
     14    assertEq(s, "abcdefghijklmnopqrstuvwxyz");
     15    assertEq(s.substring(1), "bcdefghijklmnopqrstuvwxyz");
     16    assertEq(s + s + s, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
     17 }
     18 testBasic(false);
     19 testBasic(true);
     20 
     21 function testAtomRef(tenured) {
     22    var s = newString("abcdefghijklmnopqrstuvwxyz", {newStringBuffer: true, tenured});
     23    var s2 = newString(s, {shareStringBuffer: true});
     24    assertEq(representation(s).bufferRefCount, 2);
     25    var o = {[s2]: 1};
     26    for (var i = 0; i < 10; i++) {
     27        o[s2]++;
     28    }
     29    minorgc();
     30    minorgc();
     31    finishBackgroundFree();
     32    // If s2 is now an AtomRef string, then only s holds a reference to
     33    // the buffer.
     34    if (representation(s2).flags.includes("ATOM_REF_BIT")) {
     35        assertEq(representation(s).bufferRefCount, 1);
     36    } else {
     37        assertEq(representation(s).bufferRefCount, 2);
     38    }
     39    return o;
     40 }
     41 testAtomRef(false);
     42 testAtomRef(true);
     43 
     44 function testDeduplication(tenured) {
     45    var arr = [];
     46    var s = newString("abcdefghijklmnopqrstuvwxyz" + "012345".substring(1), {newStringBuffer: true, tenured});
     47    for (var i = 0; i < 100; i++) {
     48        arr.push(newString(s, {shareStringBuffer: true, tenured}));
     49    }
     50    assertEq(representation(s).bufferRefCount, 101);
     51    gc()
     52    finishBackgroundFree();
     53    assertEq(representation(s).bufferRefCount, tenured ? 101 : 1);
     54    return arr;
     55 }
     56 testDeduplication(false);
     57 testDeduplication(true);