Files
ladybird/Tests/LibJS/Bytecode/input/lexical-env-teardown.js

63 lines
1.3 KiB
JavaScript

// Tests that lexical environment teardown works correctly for
// all code paths: with, block scope, for-in/of, catch, and
// named function expressions.
// 1. with statement restores outer environment
function withTeardown() {
let outer = 1;
with ({ x: 10 }) {
let inner = x + outer;
}
return outer;
}
console.log(withTeardown());
// 2. Block scope with let restores environment
function blockTeardown() {
let outer = 2;
{
let inner = 3;
outer;
}
return outer;
}
console.log(blockTeardown());
// 3. for-in with lexical binding restores environment
function forInTeardown() {
let outer = 4;
for (let k in { a: 1, b: 2 }) {
k;
}
return outer;
}
console.log(forInTeardown());
// 4. for-of with lexical binding restores environment
function forOfTeardown() {
let outer = 5;
for (let v of [10, 20]) {
v;
}
return outer;
}
console.log(forOfTeardown());
// 5. try-catch restores environment after catch scope
function catchTeardown() {
let outer = 6;
try {
throw new Error("test");
} catch (e) {
e;
}
return outer;
}
console.log(catchTeardown());
// 6. Named function expression scope teardown
var namedFn = function myName() {
return typeof myName;
};
console.log(namedFn());