<p>
This page tests for a caching error when transitioning prototypes away from being dictionaries.
If the test passes, you'll see a series of PASS messages below.
</p>
<pre id="console"></pre>
<script>
if (window.testRunner)
testRunner.dumpAsText();
function log(s)
{
if (this.document)
document.getElementById("console").appendChild(document.createTextNode(s + "\n"));
else
print(s + "\n");
}
function shouldBe(aDescription, a, b)
{
if (a === b) {
log("PASS: " + aDescription + " should be " + b + " and is.");
} else {
log("FAIL: " + aDescription + " should be " + b + " but instead is " + a + ".");
}
}
// Prototype tests
(function () {
function getB(o)
{
return o.b;
}
var o = {
__proto__ : {
a: "a",
b: "b"
}
};
delete o.__proto__.a;
o.__proto__.c = "c"; // if o.__proto__ un-dictionaries itself, .c will overwrite the deleted .b slot.
for (var i = 0; i < 3; ++i)
shouldBe("getB(o)", getB(o), "b");
var o2 = {
__proto__ : {
a2: "a2",
b: "b"
}
};
delete o2.__proto__.a2;
o2.__proto__.c2 = "c2"; // if o2.__proto__ un-dictionaries itself, .c2 will overwrite the deleted .b slot.
for (var i = 0; i < 3; ++i)
shouldBe("getB(o2)", getB(o2), "b");
})();
// Prototype chain tests
(function () {
function getB(o)
{
return o.b;
}
var o = {
__proto__ : {
__proto__ : {
a: "a",
b: "b"
}
}
};
delete o.__proto__.__proto__.a;
o.__proto__.__proto__.c = "c"; // if o.__proto__.__proto__ un-dictionaries itself, .c will overwrite the deleted .b slot.
for (var i = 0; i < 3; ++i)
shouldBe("getB(o)", getB(o), "b");
var o2 = {
__proto__ : {
__proto__ : {
a2: "a",
b: "b"
}
}
};
delete o2.__proto__.__proto__.a2;
o2.__proto__.__proto__.c = "c"; // if o2.__proto__.__proto__ un-dictionaries itself, .c will overwrite the deleted .b slot.
for (var i = 0; i < 3; ++i)
shouldBe("getB(o2)", getB(o2), "b");
})();
</script>