Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
function* _restoreLabeledStatements() {
for (const i of s.sub()) {
if (
i.enter &&
i.value.stmt &&
!i.value.eff &&
i.value.savedLabs &&
i.value.savedLabs.length
) {
const lab = s.label();
let pos = i.pos;
for (const j of i.value.savedLabs) {
yield s.enter(pos, Tag.LabeledStatement);
yield s.tok(Tag.label, Tag.Identifier, { node: { name: j } });
pos = Tag.body;
}
yield s.peel(Kit.setPos(i, Tag.body));
yield* _restoreLabeledStatements();
yield* lab();
continue;
}
yield i;
}
}
}
function walk(labs, map, brkLab) {
for (const i of sl.sub()) {
if (i.enter) {
i.value.ctrl = null;
switch (i.type) {
case Tag.LabeledStatement:
walk([...labs, i.value.node.label.name], map, brkLab);
break;
case Tag.BlockStatement:
let bmap = map;
if (labs.length) {
bmap = new Map(map);
i.value.ctrl = labs[0];
i.value.labs = [...labs];
for (const j of labs) bmap.set(j, i.value);
}
walk([], bmap, brkLab);
break;
case Tag.WhileStatement:
case Tag.DoWhileStatement:
case Tag.ForStatement:
case Tag.SwitchStatement:
function* walk(rename) {
for (const i of sl.sub()) {
if (i.value.ctrl) {
if (i.enter) {
const lab = sl.label();
let pos = i.pos;
const j = i.value.ctrl;
if (j !== "#" && j !== "#ret") {
let nm = j;
nm = nm.replace("#", "_");
const lx = labs[j] || 0;
if (lx !== 0) nm += lx;
labs[nm] = lx + 1;
rename[j] = nm;
yield sl.enter(pos, Tag.LabeledStatement, {
node: { label: { type: "Identifier", name: nm } }
});
pos = Tag.body;
}
yield sl.peel(Kit.setPos(i, pos));
yield* walk(Object.create(rename));
yield* lab();
continue;
}
}
if (i.value.node != null && i.value.node.label != null) {
const name = rename[i.value.node.label.name];
if (name != null) i.value.node.label = { type: "Identifier", name };
}
yield i;
}