// |reftest| skip-if(!this.hasOwnProperty("TypedObject")||!this.hasOwnProperty("hasChild")) var BUGNUMBER = 898359; var summary = 'TypedObjects reference type trace'; var actual = ''; var expect = ''; /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ var ArrayType = TypedObject.ArrayType; var StructType = TypedObject.StructType; var Any = TypedObject.Any; var Object = TypedObject.Object; var string = TypedObject.string; function TestStructFields(RefType) { var rabbit = {}; var S1 = new StructType({f: RefType}); var s1 = new S1({f: rabbit}); assertEq(hasChild(s1, rabbit), true); s1.f = null; assertEq(hasChild(s1, rabbit), false); } function TestArrayElements(RefType) { var rabbit = {}; var S1 = new ArrayType(RefType, 1); var s1 = new S1([rabbit]); assertEq(hasChild(s1, rabbit), true); s1[0] = null; assertEq(hasChild(s1, rabbit), false); } function TestStructInArray(RefType) { var rabbit = {}; var S2 = new StructType({f: RefType, g: RefType}); var S1 = new ArrayType(S2, 1); var s1 = new S1([{f: rabbit, g: {}}]); assertEq(hasChild(s1, rabbit), true); s1[0].f = null; assertEq(hasChild(s1, rabbit), false); } function TestStringInStruct() { // Rather subtle hair-pullingly maddening testing phenomena: If you // just use a constant string here, it's always reachable via the // atoms table. Same is true of "Hello" + "1" (an earlier // attempt) due to parser constant folding. So we have to make a // rabbit that's not constant foldable. But don't just use // Math.random(), since small integers are atoms already. var rabbit = "Hello" + Math.random(); var S1 = new StructType({f: string}); var s1 = new S1({f: rabbit}); assertEq(hasChild(s1, rabbit), true); s1.f = "World"; assertEq(hasChild(s1, rabbit), false); } function runTests() { printBugNumber(BUGNUMBER); printStatus(summary); TestStructFields(Object); TestStructFields(Any); TestArrayElements(Object); TestArrayElements(Any); TestStructInArray(Object); TestStructInArray(Any); TestStringInStruct(); reportCompare(true, true, "TypedObjects trace tests"); } runTests();