fix corner case in inline (#3778)

fixes #3777
This commit is contained in:
Alex Lam S.L
2020-04-11 12:54:26 +01:00
committed by GitHub
parent c810ecd081
commit 903a5df9a5
3 changed files with 63 additions and 11 deletions

View File

@@ -5820,7 +5820,7 @@ merge(Compressor.prototype, {
} }
} }
if (is_func) { if (is_func) {
var def, value; var def, value, var_assigned = false;
if (can_inline if (can_inline
&& !fn.uses_arguments && !fn.uses_arguments
&& !fn.pinned() && !fn.pinned()
@@ -5909,10 +5909,12 @@ merge(Compressor.prototype, {
for (var i = 0; i < len; i++) { for (var i = 0; i < len; i++) {
var line = fn.body[i]; var line = fn.body[i];
if (line instanceof AST_Var) { if (line instanceof AST_Var) {
if (stat && !all(line.definitions, function(var_def) { var assigned = var_assigned || !all(line.definitions, function(var_def) {
return !var_def.value; return !var_def.value;
})) { });
return false; if (assigned) {
var_assigned = true;
if (stat) return false;
} }
} else if (line instanceof AST_Defun || line instanceof AST_EmptyStatement) { } else if (line instanceof AST_Defun || line instanceof AST_EmptyStatement) {
continue; continue;
@@ -5932,15 +5934,11 @@ merge(Compressor.prototype, {
} }
function can_substitute_directly() { function can_substitute_directly() {
if (var_assigned) return;
if (compressor.option("inline") <= 1 && fn.argnames.length) return; if (compressor.option("inline") <= 1 && fn.argnames.length) return;
var var_count = fn.variables.size() - 1; if (!fn.variables.all(function(def) {
if (var_count > fn.argnames.length) return; return def.references.length < 2 && def.orig[0] instanceof AST_SymbolFunarg;
var var_names = [];
if (!all(fn.argnames, function(argname) {
push_uniq(var_names, argname.name);
return argname.definition().references.length < 2;
})) return; })) return;
if (var_count > var_names.length) return;
var abort = false; var abort = false;
var begin; var begin;
var in_order = []; var in_order = [];

View File

@@ -217,6 +217,12 @@ Dictionary.prototype = {
return this; return this;
}, },
has: function(key) { return ("$" + key) in this._values }, has: function(key) { return ("$" + key) in this._values },
all: function(predicate) {
for (var i in this._values)
if (!predicate(this._values[i], i.substr(1)))
return false;
return true;
},
each: function(f) { each: function(f) {
for (var i in this._values) for (var i in this._values)
f(this._values[i], i.substr(1)); f(this._values[i], i.substr(1));

View File

@@ -4014,3 +4014,51 @@ issue_3772: {
} }
expect_stdout: "PASS" expect_stdout: "PASS"
} }
issue_3777_1: {
options = {
inline: true,
reduce_vars: true,
side_effects: true,
}
input: {
(function() {
ff && ff(NaN);
function ff(a) {
var a = console.log("PASS");
}
})();
}
expect: {
(function() {
ff && ff(NaN);
function ff(a) {
var a = console.log("PASS");
}
})();
}
expect_stdout: "PASS"
}
issue_3777_2: {
options = {
inline: true,
pure_getters: "strict",
reduce_vars: true,
side_effects: true,
toplevel: true,
}
input: {
ff(ff.p);
function ff(a) {
var a = console.log("PASS");
}
}
expect: {
ff(ff.p);
function ff(a) {
var a = console.log("PASS");
}
}
expect_stdout: "PASS"
}