handle AST_Expansion in collapse_vars & inline
This commit is contained in:
@@ -848,6 +848,21 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function has_overlapping_symbol(fn, arg) {
|
||||||
|
var found = false;
|
||||||
|
arg.walk(new TreeWalker(function(node) {
|
||||||
|
if (found) return true;
|
||||||
|
if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
|
||||||
|
var s = node.definition().scope;
|
||||||
|
if (s !== scope) while (s = s.parent_scope) {
|
||||||
|
if (s === scope) return true;
|
||||||
|
}
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
function extract_args() {
|
function extract_args() {
|
||||||
var iife, fn = compressor.self();
|
var iife, fn = compressor.self();
|
||||||
if (is_func_expr(fn)
|
if (is_func_expr(fn)
|
||||||
@@ -860,23 +875,27 @@ merge(Compressor.prototype, {
|
|||||||
return !(arg instanceof AST_Expansion);
|
return !(arg instanceof AST_Expansion);
|
||||||
})) {
|
})) {
|
||||||
fn.argnames.forEach(function(sym, i) {
|
fn.argnames.forEach(function(sym, i) {
|
||||||
if (!(sym instanceof AST_SymbolFunarg)) return;
|
if (sym instanceof AST_Expansion) {
|
||||||
|
var elements = iife.args.slice(i);
|
||||||
|
if (all(elements, function(arg) {
|
||||||
|
return !has_overlapping_symbol(fn, arg);
|
||||||
|
})) {
|
||||||
|
candidates.push(make_node(AST_VarDef, sym, {
|
||||||
|
name: sym.expression,
|
||||||
|
value: make_node(AST_Array, iife, {
|
||||||
|
elements: elements
|
||||||
|
})
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
var arg = iife.args[i];
|
var arg = iife.args[i];
|
||||||
if (!arg) arg = make_node(AST_Undefined, sym);
|
if (!arg) arg = make_node(AST_Undefined, sym);
|
||||||
else arg.walk(new TreeWalker(function(node) {
|
else if (has_overlapping_symbol(fn, arg)) arg = null;
|
||||||
if (!arg) return true;
|
|
||||||
if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
|
|
||||||
var s = node.definition().scope;
|
|
||||||
if (s !== scope) while (s = s.parent_scope) {
|
|
||||||
if (s === scope) return true;
|
|
||||||
}
|
|
||||||
arg = null;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
if (arg) candidates.push(make_node(AST_VarDef, sym, {
|
if (arg) candidates.push(make_node(AST_VarDef, sym, {
|
||||||
name: sym,
|
name: sym,
|
||||||
value: arg
|
value: arg
|
||||||
}));
|
}));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -945,11 +964,16 @@ merge(Compressor.prototype, {
|
|||||||
|
|
||||||
function remove_candidate(expr) {
|
function remove_candidate(expr) {
|
||||||
if (expr.name instanceof AST_SymbolFunarg) {
|
if (expr.name instanceof AST_SymbolFunarg) {
|
||||||
var index = compressor.self().argnames.indexOf(expr.name);
|
var iife = compressor.parent(), argnames = compressor.self().argnames;
|
||||||
var args = compressor.parent().args;
|
var index = argnames.indexOf(expr.name);
|
||||||
|
if (index < 0) {
|
||||||
|
iife.args.length = Math.min(iife.args.length, argnames.length - 1);
|
||||||
|
} else {
|
||||||
|
var args = iife.args;
|
||||||
if (args[index]) args[index] = make_node(AST_Number, args[index], {
|
if (args[index]) args[index] = make_node(AST_Number, args[index], {
|
||||||
value: 0
|
value: 0
|
||||||
});
|
});
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
var found = false;
|
var found = false;
|
||||||
@@ -3154,7 +3178,7 @@ merge(Compressor.prototype, {
|
|||||||
var pos = 0, last = 0;
|
var pos = 0, last = 0;
|
||||||
for (var i = 0, len = self.args.length; i < len; i++) {
|
for (var i = 0, len = self.args.length; i < len; i++) {
|
||||||
if (fn.argnames[i] instanceof AST_Expansion) {
|
if (fn.argnames[i] instanceof AST_Expansion) {
|
||||||
if (fn.argnames[i].__unused) while (i < len) {
|
if (fn.argnames[i].expression.__unused) while (i < len) {
|
||||||
var node = self.args[i++].drop_side_effect_free(compressor);
|
var node = self.args[i++].drop_side_effect_free(compressor);
|
||||||
if (node) {
|
if (node) {
|
||||||
self.args[pos++] = node;
|
self.args[pos++] = node;
|
||||||
@@ -3403,6 +3427,7 @@ merge(Compressor.prototype, {
|
|||||||
&& !exp.uses_eval
|
&& !exp.uses_eval
|
||||||
&& (exp.body instanceof AST_Node || exp.body.length == 1)
|
&& (exp.body instanceof AST_Node || exp.body.length == 1)
|
||||||
&& all(exp.argnames, function(arg) {
|
&& all(exp.argnames, function(arg) {
|
||||||
|
if (arg instanceof AST_Expansion) return arg.expression.__unused;
|
||||||
return arg.__unused;
|
return arg.__unused;
|
||||||
})
|
})
|
||||||
&& !self.has_pure_annotation(compressor)) {
|
&& !self.has_pure_annotation(compressor)) {
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ issue_2105_2: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
issue_2136_2: {
|
issue_2136_2: {
|
||||||
options = {
|
options = {
|
||||||
arrows: true,
|
arrows: true,
|
||||||
@@ -430,7 +430,7 @@ issue_2136_3: {
|
|||||||
expect_stdout: "2"
|
expect_stdout: "2"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
call_args: {
|
call_args: {
|
||||||
options = {
|
options = {
|
||||||
arrows: true,
|
arrows: true,
|
||||||
|
|||||||
@@ -1358,7 +1358,7 @@ issue_2136_1: {
|
|||||||
expect_stdout: "[]"
|
expect_stdout: "[]"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
issue_2136_2: {
|
issue_2136_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
@@ -1410,7 +1410,7 @@ issue_2136_3: {
|
|||||||
expect_stdout: "2"
|
expect_stdout: "2"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
issue_2163: {
|
issue_2163: {
|
||||||
options = {
|
options = {
|
||||||
pure_funcs: [ "pure" ],
|
pure_funcs: [ "pure" ],
|
||||||
|
|||||||
Reference in New Issue
Block a user