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();