tor-browser

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

dedupe-03.js (2600B)


      1 // |jit-test| skip-if: !hasFunction.stringRepresentation
      2 
      3 // Test handling of tenured dependent strings pointing to nursery base strings.
      4 
      5 gczeal(0);
      6 
      7 function makeExtensibleStrFrom(str) {
      8  var left = str.substr(0, str.length/2);
      9  var right = str.substr(str.length/2, str.length);
     10  var ropeStr = left + right;
     11  return ensureLinearString(ropeStr);
     12 }
     13 
     14 function repr(s) {
     15  return JSON.parse(stringRepresentation(s));
     16 }
     17 
     18 function dependsOn(s1, s2) {
     19  const rep1 = JSON.parse(stringRepresentation(s1));
     20  const rep2 = JSON.parse(stringRepresentation(s2));
     21  return rep1.base && rep1.base.address == rep2.address;
     22 }
     23 
     24 // Make a string to deduplicate to.
     25 var original = makeExtensibleStrFrom('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm');
     26 
     27 // Construct T1 -> Nbase.
     28 var Nbase = makeExtensibleStrFrom('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm');
     29 var T1 = newDependentString(Nbase, 0, 60, { tenured: true });
     30 
     31 // Get prevented from creating T2 -> T1 -> Nbase
     32 // (will be T2 -> Nbase instead to avoid dependency chains).
     33 var T2 = newDependentString(T1, 30, { tenured: true });
     34 
     35 assertEq(dependsOn(T2, Nbase), "expect: T2 -> base");
     36 
     37 // Construct T1 -> Ndep1 (was Nbase) -> Nbase2.
     38 var Nbase2 = newRope(Nbase, "ABC");
     39 ensureLinearString(Nbase2);
     40 var Ndep1 = Nbase;
     41 
     42 assertEq(dependsOn(T1, Ndep1), "expect: T1 -> Ndep1");
     43 assertEq(dependsOn(Ndep1, Nbase2), "expect: Ndep1 -> Nbase2");
     44 
     45 // Fail to construct T3 -> Tbase3 -> Nbase4. It will refuse because T3 would be using
     46 // chars from Nbase4 that can't be updated since T3 is not in the store buffer. Instead,
     47 // it will allocate a new buffer for the rope root, leaving Tbase3 alone and keeping
     48 // T3 -> Tbase3.
     49 var Tbase3 = makeExtensibleStrFrom('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm');
     50 minorgc();
     51 var T3 = newDependentString(Tbase3, 0, 30, { tenured: true });
     52 var Nbase4 = newRope(Tbase3, "DEF");
     53 ensureLinearString(Nbase4);
     54 assertEq(repr(Tbase3).isTenured, true, "Tbase3 is tenured");
     55 assertEq(repr(Tbase3).flags.includes("EXTENSIBLE"), true, "Tbase3 is extensible");
     56 assertEq(repr(Nbase4).flags.includes("DEPENDENT_BIT"), false, "expect: Nbase4 is not a dependent string")
     57 assertEq(repr(T3).flags.includes("DEPENDENT_BIT"), true, "expect: T3 is a dependent string")
     58 assertEq(dependsOn(T3, Tbase3), "expect: T3 -> Tbase3");
     59 
     60 function bug1879918() {
     61  const s = JSON.parse('["abcdefabcdefabcdefabcdefabcdefabcdefabcdef"]')[0];
     62  const dep = newDependentString(s, 1, { tenured: true });
     63  minorgc();
     64  assertEq(dep, "bcdefabcdefabcdefabcdefabcdefabcdefabcdef");
     65 }
     66 bug1879918();