funcall-array.js (2178B)
1 var emptyArray = []; 2 var denseArray = [1, 2, 3, 4]; 3 var sparseArray = [1,,2,,3,,4]; 4 var bigArray = new Array(); 5 for (var i = 0; i < 128; i++) { 6 bigArray.push(i); 7 } 8 var nonArray = {0:1, 1:2, 2:3, 3:4, length:2}; 9 var indexedGetterArray = new Array(); 10 Object.defineProperty(indexedGetterArray, '2', {get:function () { return 51; }}); 11 12 var ARRAYS = [emptyArray, denseArray, sparseArray, bigArray, nonArray, indexedGetterArray]; 13 14 var targetFun = function (a, b, c, d) { 15 if (a === undefined) 16 a = 0; 17 if (b === undefined) 18 b = 0; 19 if (c === undefined) 20 c = 0; 21 if (d === undefined) 22 d = 0; 23 this.count += arguments.length + a + b + c + d; 24 } 25 26 var PERMUTATIONS = ARRAYS.length * ARRAYS.length; 27 function arrayPermutation(num) { 28 var idx1 = num % ARRAYS.length; 29 var idx2 = ((num / ARRAYS.length)|0) % ARRAYS.length; 30 var resultArray = []; 31 resultArray.push(ARRAYS[idx1]); 32 resultArray.push(ARRAYS[idx2]); 33 return resultArray; 34 } 35 var EXPECTED_RESULTS = { 36 0:0, 1:280, 2:200, 3:2680, 4:100, 5:1080, 6:280, 7:560, 8:480, 9:2960, 37 10:380, 11:1360, 12:200, 13:480, 14:400, 15:2880, 16:300, 17:1280, 18:2680, 38 19:2960, 20:2880, 21:5360, 22:2780, 23:3760, 24:100, 25:380, 26:300, 27:2780, 39 28:200, 29:1180, 30:1080, 31:1360, 32:1280, 33:3760, 34:1180, 35:2160 40 }; 41 42 var callerNo = 0; 43 function generateCaller() { 44 var fn; 45 46 // Salt eval-string with callerNo to make sure eval caching doesn't take effect. 47 var s = "function caller" + callerNo + "(fn, thisObj, arrays) {" + 48 " for (var i = 0; i < arrays.length; i++) {" + 49 " fn.apply(thisObj, arrays[i]);" + 50 " }" + 51 "}" + 52 "fn = caller" + callerNo + ";"; 53 eval(s); 54 return fn; 55 }; 56 57 function main() { 58 for (var i = 0; i < PERMUTATIONS; i++) { 59 var obj = {count:0}; 60 var arrs = arrayPermutation(i); 61 var fn = generateCaller(arrs.length); 62 // Loop 20 times so baseline compiler has chance to kick in and compile the scripts. 63 for (var j = 0; j < 20; j++) 64 fn(targetFun, obj, arrs); 65 assertEq(obj.count, EXPECTED_RESULTS[i]); 66 } 67 } 68 69 main();