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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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) { function scan_declaration(tw, lhs, fixed, visit) {
var scanner = new TreeWalker(function(node) { var scanner = new TreeWalker(function(node) {
if (node instanceof AST_DestructuredArray) { if (node instanceof AST_DestructuredArray) {
reset_flags(node);
var save = fixed; var save = fixed;
node.elements.forEach(function(node, index) { node.elements.forEach(function(node, index) {
if (node instanceof AST_Hole) return; if (node instanceof AST_Hole) return reset_flags(node);
fixed = function() { fixed = function() {
return make_node(AST_Sub, node, { return make_node(AST_Sub, node, {
expression: save(), expression: save(),
@ -614,8 +615,10 @@ merge(Compressor.prototype, {
return true; return true;
} }
if (node instanceof AST_DestructuredObject) { if (node instanceof AST_DestructuredObject) {
reset_flags(node);
var save = fixed; var save = fixed;
node.properties.forEach(function(node) { node.properties.forEach(function(node) {
reset_flags(node);
if (node.key instanceof AST_Node) { if (node.key instanceof AST_Node) {
push(tw); push(tw);
node.key.walk(tw); node.key.walk(tw);
@ -1112,6 +1115,13 @@ merge(Compressor.prototype, {
node.DEFMETHOD("reduce_vars", func); 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) { AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) {
var tw = new TreeWalker(compressor.option("reduce_vars") ? function(node, descend) { var tw = new TreeWalker(compressor.option("reduce_vars") ? function(node, descend) {
reset_flags(node); reset_flags(node);
@ -1129,13 +1139,6 @@ merge(Compressor.prototype, {
// - backup & restore via `save_ids` when visiting out-of-order sections // - backup & restore via `save_ids` when visiting out-of-order sections
tw.safe_ids = Object.create(null); tw.safe_ids = Object.create(null);
this.walk(tw); 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() { AST_Symbol.DEFMETHOD("fixed_value", function() {

View File

@ -1647,3 +1647,40 @@ issue_4312: {
expect_stdout: "PASS" expect_stdout: "PASS"
node_version: ">=6" 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"
}