fix dead_code on AST_Switch (#1667)
Need to call `extract_declarations_from_unreachable_code()`. fixes #1663
This commit is contained in:
@@ -2529,14 +2529,14 @@ merge(Compressor.prototype, {
|
|||||||
// no need to descend these node types
|
// no need to descend these node types
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_Switch && node === self) {
|
else if (node === self) {
|
||||||
node = node.clone();
|
node = node.clone();
|
||||||
descend(node, this);
|
descend(node, this);
|
||||||
return ruined ? node : make_node(AST_BlockStatement, node, {
|
return ruined ? node : make_node(AST_BlockStatement, node, {
|
||||||
body: node.body.reduce(function(a, branch){
|
body: node.body.map(function(stat) {
|
||||||
return a.concat(branch.body);
|
return stat instanceof AST_SwitchBranch ? make_node(AST_BlockStatement, stat, stat) : stat;
|
||||||
}, [])
|
})
|
||||||
}).transform(compressor);
|
}).optimize(compressor);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_If || node instanceof AST_Try) {
|
else if (node instanceof AST_If || node instanceof AST_Try) {
|
||||||
var save = in_if;
|
var save = in_if;
|
||||||
@@ -2559,10 +2559,10 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
if (in_block) return node;
|
if (in_block) return node;
|
||||||
stopped = true;
|
stopped = true;
|
||||||
return in_list ? MAP.skip : make_node(AST_EmptyStatement, node);
|
return skip(node);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SwitchBranch && this.parent() === self) {
|
else if (node instanceof AST_SwitchBranch && this.parent() === self) {
|
||||||
if (stopped) return MAP.skip;
|
if (stopped) return skip(node);
|
||||||
if (node instanceof AST_Case) {
|
if (node instanceof AST_Case) {
|
||||||
var exp = node.expression.evaluate(compressor);
|
var exp = node.expression.evaluate(compressor);
|
||||||
if (exp === node.expression) {
|
if (exp === node.expression) {
|
||||||
@@ -2572,16 +2572,20 @@ merge(Compressor.prototype, {
|
|||||||
if (exp === value || started) {
|
if (exp === value || started) {
|
||||||
started = true;
|
started = true;
|
||||||
if (aborts(node)) stopped = true;
|
if (aborts(node)) stopped = true;
|
||||||
descend(node, this);
|
} else return skip(node);
|
||||||
return node;
|
|
||||||
}
|
|
||||||
return MAP.skip;
|
|
||||||
}
|
}
|
||||||
descend(node, this);
|
}
|
||||||
return node;
|
|
||||||
|
function skip(node) {
|
||||||
|
var a = [];
|
||||||
|
extract_declarations_from_unreachable_code(compressor, node, a);
|
||||||
|
return in_list ? MAP.splice(a) : make_node(AST_BlockStatement, node, {
|
||||||
|
body: a
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
tt.stack = compressor.stack.slice(); // so that's able to see parent nodes
|
// allow transform() to view the whole AST
|
||||||
|
tt.stack = compressor.stack.slice(0, -1);
|
||||||
self = self.transform(tt);
|
self = self.transform(tt);
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
if (ex !== self) throw ex;
|
if (ex !== self) throw ex;
|
||||||
|
|||||||
@@ -258,3 +258,35 @@ keep_default: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_1663: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
switch (1) {
|
||||||
|
case 1:
|
||||||
|
b = a++;
|
||||||
|
return ++b;
|
||||||
|
default:
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f() {
|
||||||
|
b = a++;
|
||||||
|
return ++b;
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user