| description( |
| "This tests that a structure clobber in a basic block that does not touch a live variable causes that variable's structure to be correctly clobbered." |
| ); |
| |
| var clobberedObject; |
| |
| function bar() { |
| if (!clobberedObject) |
| return; |
| delete clobberedObject.f; |
| clobberedObject.g = 42; |
| } |
| |
| function foo(p, o_) { |
| var o = o_.f; // Force this block to have a SetLocal. |
| var x = o.f; |
| if (p) |
| bar(); |
| return x + o.f; |
| } |
| |
| var expected = 2; |
| |
| for (var i = 0; i < 200; ++i) { |
| var object = {f:1}; |
| var predicate = true; |
| if (i >= 150) { |
| clobberedObject = object; |
| expected = 0/0; // "NaN" |
| } |
| shouldBe("foo(predicate, {f:object})", "" + expected); |
| } |
| |