| <p>This page tests whether a cached [[put]] consults setters in the prototype chain. |
| If the test passes, you'll see two PASS messages below.</p> |
| |
| <pre id="console"></pre> |
| |
| <script> |
| if (window.testRunner) |
| testRunner.dumpAsText(); |
| |
| function log(s) |
| { |
| document.getElementById("console").appendChild(document.createTextNode(s)); |
| } |
| |
| (function() { |
| function callToString(arg) |
| { |
| return arg.toString(); |
| } |
| |
| // toString() will hit the direct prototype of this object. |
| var victim = {}; |
| |
| callToString(victim); |
| callToString(victim); |
| callToString(victim); |
| callToString(1); |
| |
| log("PASS: I didn't segfault.\n"); |
| })(); |
| |
| (function() { |
| function callToString(arg) |
| { |
| return arg.toString(); |
| } |
| |
| // toString() will have to walk a prototype chain for this object. |
| function MyObject() {} |
| MyObject.prototype = { someStuff: {} }; |
| var victim = new MyObject(); |
| |
| var xSetterCalled = false; |
| |
| callToString(victim); |
| callToString(victim); |
| callToString(victim); |
| callToString(1); |
| |
| log("PASS: I didn't segfault.\n"); |
| })(); |
| </script> |