function assert(b) { | |
if (!b) | |
throw new Error("Bad assertion") | |
} | |
noInline(assert); | |
function shouldThrowTDZ(func) { | |
var hasThrown = false; | |
try { | |
func(); | |
} catch(e) { | |
if (e.name.indexOf("ReferenceError") !== -1) | |
hasThrown = true; | |
} | |
assert(hasThrown); | |
} | |
noInline(shouldThrowTDZ); | |
function foo(a = function() { return c; }, b = a(), ...c) { | |
return a(); | |
} | |
noInline(foo); | |
function baz(a = function() { return b; }, ...b) { | |
return a(); | |
} | |
for (let i = 0; i < 1000; i++) { | |
shouldThrowTDZ(function() { foo(undefined, undefined, 10, 20); }); | |
let o = {x: 20}; | |
let result = baz(undefined, 10, o, "baz"); | |
assert(result.length === 3); | |
assert(result[0] === 10); | |
assert(result[1] === o); | |
assert(result[2] === "baz"); | |
} |