(function() { | |
// Remove a yet-to-be-visited indexed property during iteration. | |
var foo = function() { | |
var a = [1, 2, 3, 4, 5]; | |
var result = ""; | |
for (var p in a) { | |
if (p == 2) | |
delete a[3]; | |
result += a[p]; | |
} | |
return result; | |
}; | |
noInline(foo); | |
for (var i = 0; i < 10000; ++i) { | |
var result = foo(); | |
if (result !== "1235") | |
throw new Error("bad result got: " + result); | |
} | |
foo(null); | |
})(); | |
(function() { | |
// Remove a yet-to-be-visited non-indexed property during iteration. | |
var foo = function() { | |
var o = {}; | |
o.x = "x"; | |
o.y = "y"; | |
o.z = "z"; | |
var result = ""; | |
for (var p in o) { | |
if (p == "x") { | |
delete o.y; | |
o.a = "a"; | |
} | |
result += o[p]; | |
} | |
return result; | |
}; | |
noInline(foo); | |
for (var i = 0; i < 10000; ++i) { | |
var result = foo(); | |
if (result !== "xz") | |
throw new Error("bad result: " + result); | |
} | |
})(); | |
(function() { | |
// Remove then re-add a property during iteration. | |
var foo = function() { | |
var A = function() {}; | |
A.prototype.x = "A.x"; | |
A.prototype.y = "A.y"; | |
var o = new A(); | |
o.z = "o.z"; | |
o.y = "o.y"; | |
o.x = "o.x"; | |
var result = ""; | |
for (var p in o) { | |
if (p == "z") | |
delete o.x; | |
if (p == "y") | |
o.x = "o.x"; | |
result += o[p]; | |
} | |
return result; | |
}; | |
noInline(foo); | |
for (var i = 0; i < 10000; ++i) { | |
if (foo() !== "o.zo.yo.x") | |
throw new Error("bad result"); | |
} | |
foo(null); | |
})(); |