99 lines
2.2 KiB
HTML
99 lines
2.2 KiB
HTML
<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>
|