mega-morphic-load-and-has-prop.js (2562B)
1 function testMegamorphicLoadSlot(i) { 2 var xs = [ 3 {p: 0}, 4 {a: 0, p: 1}, 5 {a: 0, b: 0, p: 2}, 6 {a: 0, b: 0, c: 0, p: 3}, 7 {a: 0, b: 0, c: 0, d: 0, p: 4}, 8 {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5}, 9 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6}, 10 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7}, 11 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8}, 12 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9}, 13 ]; 14 var called = 0; 15 var obj = { 16 get p() { 17 called++; 18 } 19 }; 20 21 for (var j = 0; j <= 100; ++j) { 22 // Don't use if-statements to avoid cold code bailouts. 23 var x = xs[j % 10]; 24 var y = [x, obj][(i === 1 && j === 100)|0]; 25 26 // Can't DCE this instruction. 27 y.p; 28 } 29 30 assertEq(i === 0 || called === 1, true); 31 } 32 for (var i = 0; i < 2; ++i) testMegamorphicLoadSlot(i); 33 34 function testMegamorphicLoadSlotByValue(i) { 35 var xs = [ 36 {p: 0}, 37 {a: 0, p: 1}, 38 {a: 0, b: 0, p: 2}, 39 {a: 0, b: 0, c: 0, p: 3}, 40 {a: 0, b: 0, c: 0, d: 0, p: 4}, 41 {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5}, 42 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6}, 43 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7}, 44 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8}, 45 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9}, 46 ]; 47 var called = 0; 48 var obj = { 49 get p() { 50 called++; 51 } 52 }; 53 54 var p = "p"; 55 for (var j = 0; j <= 100; ++j) { 56 // Don't use if-statements to avoid cold code bailouts. 57 var x = xs[j % 10]; 58 var y = [x, obj][(i === 1 && j === 100)|0]; 59 60 // Can't DCE this instruction. 61 y[p]; 62 } 63 64 assertEq(i === 0 || called === 1, true); 65 } 66 for (var i = 0; i < 2; ++i) testMegamorphicLoadSlotByValue(i); 67 68 function testMegamorphicHasProp(i) { 69 var xs = [ 70 {p: 0}, 71 {a: 0, p: 1}, 72 {a: 0, b: 0, p: 2}, 73 {a: 0, b: 0, c: 0, p: 3}, 74 {a: 0, b: 0, c: 0, d: 0, p: 4}, 75 {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5}, 76 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6}, 77 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7}, 78 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8}, 79 {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9}, 80 ]; 81 var called = 0; 82 var obj = new Proxy({}, { 83 has() { 84 called++; 85 } 86 }); 87 88 for (var j = 0; j <= 100; ++j) { 89 // Don't use if-statements to avoid cold code bailouts. 90 var x = xs[j % 10]; 91 var y = [x, obj][(i === 1 && j === 100)|0]; 92 93 // Can't DCE this instruction. 94 "p" in y; 95 } 96 97 assertEq(i === 0 || called === 1, true); 98 } 99 for (var i = 0; i < 2; ++i) testMegamorphicHasProp(i);