megamorphic-get-has-dense.js (1638B)
1 setJitCompilerOption("ic.force-megamorphic", 1); 2 3 function testBasic() { 4 // Create various native objects with dense elements. 5 var objs = [[1, 2, 3], {0: 1, 1: 2, 2: 3}]; 6 var fun = x => x; 7 fun[0] = 1; 8 fun[1] = 2; 9 fun[2] = 3; 10 objs.push(fun); 11 for (var i = 0; i < 20; i++) { 12 var o = {}; 13 o["x" + i] = i; 14 o[0] = 1; 15 o[1] = 2; 16 if (i < 10) { 17 o[2] = 3; 18 } else { 19 // o[2] will be a hole. 20 o[3] = 4; 21 } 22 objs.push(o); 23 } 24 25 // Access their dense elements. 26 for (var i = 0; i < 10; i++) { 27 for (var j = 0; j < objs.length; j++) { 28 var obj = objs[j]; 29 assertEq(obj[0], 1); 30 assertEq(obj[1], 2); 31 assertEq(obj[2], j < 13 ? 3 : undefined); 32 assertEq(obj[3], j >= 13 ? 4 : undefined); 33 assertEq(0 in obj, true); 34 assertEq(1 in obj, true); 35 assertEq(2 in obj, j < 13); 36 assertEq(3 in obj, j >= 13); 37 assertEq(Object.hasOwn(obj, 0), true); 38 assertEq(Object.hasOwn(obj, 1), true); 39 assertEq(Object.hasOwn(obj, 2), j < 13); 40 assertEq(Object.hasOwn(obj, 3), j >= 13); 41 } 42 } 43 } 44 testBasic(); 45 46 function testNonNative() { 47 var arr = [1, 2, 3]; 48 var proxy = new Proxy({}, { 49 get(target, prop) { return 456; }, 50 has(target, prop) { return prop === "0"; }, 51 }); 52 for (var i = 0; i < 100; i++) { 53 var obj = i < 95 ? arr : proxy; 54 assertEq(obj[0], i < 95 ? 1 : 456); 55 assertEq(0 in obj, true); 56 assertEq(1 in obj, i < 95); 57 assertEq(4 in obj, false); 58 assertEq(Object.hasOwn(obj, 0), i < 95); 59 assertEq(Object.hasOwn(obj, 1), i < 95); 60 assertEq(Object.hasOwn(obj, 4), false); 61 } 62 } 63 testNonNative();