iterator-indices-3.js (1686B)
1 function test(o, deleter) { 2 var result = 0; 3 for (var s in o) { 4 if (!o.hasOwnProperty(s)) { continue; } 5 result += o[s]; 6 deleter(o); 7 } 8 return result; 9 } 10 11 function test2(o, deleter) { 12 var result = 0; 13 var keys = Object.keys(o); 14 for (var i = 0; i < keys.length; i++) { 15 var s = keys[i]; 16 if (!o.hasOwnProperty(s)) { continue; } 17 result += o[s]; 18 deleter(o); 19 } 20 return result; 21 } 22 23 with ({}) {} 24 25 // Ion-compile |test| with a megamorphic getprop and a generic call. 26 for (var i = 0; i < 2000; i++) { 27 var obj = {}; 28 obj["x" + i] = 1; 29 test(obj, () => 1); 30 test(obj, () => 2); 31 test2(obj, () => 1); 32 test2(obj, () => 2); 33 } 34 35 assertEq(test({x: 1, y: 2}, (o) => delete o.y), 1); 36 assertEq(test([1,2], (o) => delete o[1]), 1); 37 assertEq(test([1,2], (o) => {o.length = 0}), 1); 38 39 assertEq(test({x: 1, y: 2, z: 3}, (o) => delete o.y), 4); 40 assertEq(test([1,2,3], (o) => delete o[1]), 4); 41 assertEq(test([1,2,3,4], (o) => {o.length = 2}), 3); 42 assertEq(test([,2,3], (o) => o.reverse()), 2); 43 44 assertEq(test({x: 1, y: 2, z: 3}, (o) => delete o.x), 6); 45 assertEq(test([1,2,3], (o) => delete o[0]), 6); 46 assertEq(test([1], (o) => {o.length = 0}), 1); 47 48 assertEq(test2({x: 1, y: 2}, (o) => delete o.y), 1); 49 assertEq(test2([1,2], (o) => delete o[1]), 1); 50 assertEq(test2([1,2], (o) => {o.length = 0}), 1); 51 52 assertEq(test2({x: 1, y: 2, z: 3}, (o) => delete o.y), 4); 53 assertEq(test2([1,2,3], (o) => delete o[1]), 4); 54 assertEq(test2([1,2,3,4], (o) => {o.length = 2}), 3); 55 assertEq(test2([,2,3], (o) => o.reverse()), 2); 56 57 assertEq(test2({x: 1, y: 2, z: 3}, (o) => delete o.x), 6); 58 assertEq(test2([1,2,3], (o) => delete o[0]), 6); 59 assertEq(test2([1], (o) => {o.length = 0}), 1);