fix corner case in passes & reduce_vars (#4316)

fixes #4315
This commit is contained in:
Alex Lam S.L
2020-11-22 23:05:20 +00:00
committed by GitHub
parent 9f67866147
commit 1e8fa1aa1d
2 changed files with 48 additions and 8 deletions

View File

@@ -597,9 +597,10 @@ merge(Compressor.prototype, {
function scan_declaration(tw, lhs, fixed, visit) {
var scanner = new TreeWalker(function(node) {
if (node instanceof AST_DestructuredArray) {
reset_flags(node);
var save = fixed;
node.elements.forEach(function(node, index) {
if (node instanceof AST_Hole) return;
if (node instanceof AST_Hole) return reset_flags(node);
fixed = function() {
return make_node(AST_Sub, node, {
expression: save(),
@@ -614,8 +615,10 @@ merge(Compressor.prototype, {
return true;
}
if (node instanceof AST_DestructuredObject) {
reset_flags(node);
var save = fixed;
node.properties.forEach(function(node) {
reset_flags(node);
if (node.key instanceof AST_Node) {
push(tw);
node.key.walk(tw);
@@ -1112,6 +1115,13 @@ merge(Compressor.prototype, {
node.DEFMETHOD("reduce_vars", func);
});
function reset_flags(node) {
node._squeezed = false;
node._optimized = false;
delete node.fixed;
if (node instanceof AST_Scope) delete node._var_names;
}
AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) {
var tw = new TreeWalker(compressor.option("reduce_vars") ? function(node, descend) {
reset_flags(node);
@@ -1129,13 +1139,6 @@ merge(Compressor.prototype, {
// - backup & restore via `save_ids` when visiting out-of-order sections
tw.safe_ids = Object.create(null);
this.walk(tw);
function reset_flags(node) {
node._squeezed = false;
node._optimized = false;
delete node.fixed;
if (node instanceof AST_Scope) delete node._var_names;
}
});
AST_Symbol.DEFMETHOD("fixed_value", function() {

View File

@@ -1647,3 +1647,40 @@ issue_4312: {
expect_stdout: "PASS"
node_version: ">=6"
}
issue_4315: {
options = {
conditionals: true,
dead_code: true,
evaluate: true,
inline: true,
passes: 2,
reduce_funcs: true,
reduce_vars: true,
side_effects: true,
toplevel: true,
unused: true,
}
input: {
function f() {
console;
}
var a = function() {
if ([ 0[f && f] ] = [])
return this;
}(), b;
do {
console.log("PASS");
} while (0 && (b = 0), b && a);
}
expect: {
[ 0[function() {
console
}] ] = [];
do {
console.log("PASS");
} while (void 0);
}
expect_stdout: "PASS"
node_version: ">=6"
}