function assert(b) { if (!b) throw new Error("Bad!") } noInline(assert); function test1() { function foo(...c) { return c; } noInline(foo); let arr = [1,2,3]; for (let i = 0; i < 10000; i++) { let result = foo(...arr); assert(result.length === 3); assert(result.length === arr.length); assert(result[0] === arr[0]); assert(result[1] === arr[1]); assert(result[2] === arr[2]); } let called = false; Reflect.defineProperty(Array.prototype, "10", { get() { return 35; }, set(x) { called = true; } }); let called2 = false; Reflect.defineProperty(Array.prototype, "0", { get: function() { print("In get!"); return 35; }, set: function(x) { called2 = true; } }); for (let i = 0; i < 10000; i++) { let result = foo(...arr); assert(result.length === 3); assert(result[0] === arr[0]); assert(result[0] === 1); assert(result[1] === arr[1]); assert(result[2] === arr[2]); result[10] = 25; assert(result[10] === 35); assert(called); called = false; result[0] = "foo"; assert(!called2); // Creating a rest should defineProperty, ensuring we don't call the setter. } for (let i = 0; i < 10000; i++) { let result = foo(...arr); assert(result.length === 3); assert(result[0] === arr[0]); assert(result[0] === 1); assert(result[1] === arr[1]); assert(result[2] === arr[2]); result[11] = 35; assert(result.length === 12); result[10] = 25; assert(result[10] === 35); assert(called); called = false; result[0] = "foo"; assert(!called2); // Creating a rest should defineProperty, ensuring we don't call the setter. } } test1();