blob: f3fe9144535826e4b594c00fd6dba6bb640bde4d [file] [log] [blame]
<p>
This page tests for a crash due to insufficient marking of ExecStates. If
the test passes, you'll see a series of PASS messages below.
</p>
<pre id="console">
PASS: You didn't crash.
</pre>
<a id="a"></a>
<script>
function log(s)
{
document.getElementById("console").appendChild(document.createTextNode(s + "\n"));
}
function shouldBe(a, aDescription, b)
{
if (a == b) {
log("PASS: " + aDescription + " should be " + b + " and is.");
} else {
log("FAIL: " + aDescription + " should be " + b + " but instead is " + a + ".");
}
}
function FailureObject()
{
}
FailureObject.prototype.toString = function()
{
return "FAIL"; // A marker to indicate that an object was collected and then overwritten by a FailureObject.
}
function gc()
{
if (window.GCController)
GCController.collect();
else
for (var i = 0; i < 10000; ++i) // Allocate a sufficient number of objects to force a GC.
new FailureObject;
}
function gc1()
{
var script = document.createElement("script");
script.appendChild(document.createTextNode("gc()"));
document.body.appendChild(script);
}
function gc2()
{
var a = document.getElementById("a");
a.href = "javascript:gc()";
var event = document.createEvent("MouseEvent");
event.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, document);
a.dispatchEvent(event);
}
function gc3()
{
document.write("<" + "script" + "/>" + "gc()" + "</" + "script" + ">");
}
function f()
{
// Allocate some activation data.
var v1 = "1";
var v2 = "2";
var v3 = "3";
var v4 = "4";
var v5 = "5";
// Globally evaluate a script that forces GC, using a few different mechanisms.
gc1();
gc2();
gc3();
/*
* Some other ways to globally evaluate a script, which aren't tested here:
* NPN_Evaluate
* -[WebScriptObject evaluateWebScript:]
* JSEvaluateScript
* JavaJSObject::eval
* javascript: URLs for elements other than <a>
*/
// Now verify that our activation data wasn't collected, by using it in an interesting way.
return v1 + v2 + v3 + v4 + v5;
}
if (window.testRunner)
testRunner.dumpAsText();
shouldBe(f(), "f()", "12345");
</script>