spread-call-rest.js (1969B)
1 // bug 1235092 2 // Optimize spread call with rest parameter. 3 4 load(libdir + "asserts.js"); 5 6 function makeArray(...args) { 7 return args; 8 } 9 10 // Optimizable Case. 11 function test(...args) { 12 return makeArray(...args); 13 } 14 assertDeepEq(test(1, 2, 3), [1, 2, 3]); 15 16 // Not optimizable case 1: the array has hole. 17 function hole1(...args) { 18 args[4] = 5; 19 return makeArray(...args); 20 } 21 assertDeepEq(hole1(1, 2, 3), [1, 2, 3, undefined, 5]); 22 23 function hole2(...args) { 24 args.length = 5; 25 return makeArray(...args); 26 } 27 assertDeepEq(hole2(1, 2, 3), [1, 2, 3, undefined, undefined]); 28 29 function hole3(...args) { 30 delete args[1]; 31 return makeArray(...args); 32 } 33 assertDeepEq(hole3(1, 2, 3), [1, undefined, 3]); 34 35 // Not optimizable case 2: array[@@iterator] is modified. 36 function modifiedIterator(...args) { 37 args[Symbol.iterator] = function*() { 38 for (let i = 0; i < this.length; i++) 39 yield this[i] * 10; 40 }; 41 return makeArray(...args); 42 } 43 assertDeepEq(modifiedIterator(1, 2, 3), [10, 20, 30]); 44 45 // Not optimizable case 3: the array's prototype is modified. 46 function modifiedProto(...args) { 47 args.__proto__ = { 48 __proto__: Array.prototype, 49 *[Symbol.iterator]() { 50 for (let i = 0; i < this.length; i++) 51 yield this[i] * 10; 52 } 53 }; 54 return makeArray(...args); 55 } 56 assertDeepEq(modifiedProto(1, 2, 3), [10, 20, 30]); 57 58 // Not optimizable case 4: Array.prototype[@@iterator] is modified. 59 let ArrayValues = Array.prototype[Symbol.iterator]; 60 Array.prototype[Symbol.iterator] = function*() { 61 for (let i = 0; i < this.length; i++) 62 yield this[i] * 10; 63 }; 64 assertDeepEq(test(1, 2, 3), [10, 20, 30]); 65 Array.prototype[Symbol.iterator] = ArrayValues; 66 67 // Not optimizable case 5: %ArrayIteratorPrototype%.next is modified. 68 let ArrayIteratorPrototype = Object.getPrototypeOf(Array.prototype[Symbol.iterator]()); 69 let i = 1; 70 ArrayIteratorPrototype.next = function() { 71 return { done: i % 4 == 0, value: 10 * i++ }; 72 }; 73 assertDeepEq(test(1, 2, 3), [10, 20, 30]);