Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !getBuildConfiguration("debug")
// stringRepresentation and the bufferRefCount field aren't available in
// all builds.
gczeal(0);
function representation(s) {
return JSON.parse(stringRepresentation(s));
}
function testBasic(tenured) {
var s = newString("abcdefghijklmnopqrstuvwxyz", {newStringBuffer: true, tenured});
assertEq(representation(s).bufferRefCount, 1);
assertEq(s, "abcdefghijklmnopqrstuvwxyz");
assertEq(s.substring(1), "bcdefghijklmnopqrstuvwxyz");
assertEq(s + s + s, "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
}
testBasic(false);
testBasic(true);
function testAtomRef(tenured) {
var s = newString("abcdefghijklmnopqrstuvwxyz", {newStringBuffer: true, tenured});
var s2 = newString(s, {shareStringBuffer: true});
assertEq(representation(s).bufferRefCount, 2);
var o = {[s2]: 1};
for (var i = 0; i < 10; i++) {
o[s2]++;
}
minorgc();
minorgc();
finishBackgroundFree();
// If s2 is now an AtomRef string, then only s holds a reference to
// the buffer.
if (representation(s2).flags.includes("ATOM_REF_BIT")) {
assertEq(representation(s).bufferRefCount, 1);
} else {
assertEq(representation(s).bufferRefCount, 2);
}
return o;
}
testAtomRef(false);
testAtomRef(true);
function testDeduplication(tenured) {
var arr = [];
var s = newString("abcdefghijklmnopqrstuvwxyz" + "012345".substring(1), {newStringBuffer: true, tenured});
for (var i = 0; i < 100; i++) {
arr.push(newString(s, {shareStringBuffer: true, tenured}));
}
assertEq(representation(s).bufferRefCount, 101);
gc()
finishBackgroundFree();
assertEq(representation(s).bufferRefCount, tenured ? 101 : 1);
return arr;
}
testDeduplication(false);
testDeduplication(true);