description( | |
"Tests that ArrayPop is known to the DFG to be a side effect." | |
); | |
function foo(a, b) { | |
var result = a.f; | |
result += b.pop(); | |
result += a.g; | |
return result; | |
} | |
noInline(foo); | |
silentTestPass = true; | |
var ouches = 0; | |
for (var i = 0; i < 200; i = dfgIncrement({f:foo, i:i + 1, n:100})) { | |
var a = {f:1, g:2}; | |
var b = []; | |
var expected; | |
if (i < 150) { | |
// Ensure that we always transition the array's structure to one that indicates | |
// that we have array storage. | |
b.__defineGetter__("0", function() { | |
testFailed("Should never get here"); | |
}); | |
b.length = 0; | |
b[0] = 42; | |
expected = "45"; | |
} else { | |
b.__defineGetter__("0", function() { | |
debug("Ouch!"); | |
ouches++; | |
delete a.g; | |
a.h = 43; | |
return 5; | |
}); | |
expected = "0/0"; | |
} | |
shouldBe("foo(a, b)", expected); | |
} | |
shouldBe("ouches", "50"); |