| <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> |