@@ -6033,7 +6033,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var NO_MERGE = makePredicate("arguments await yield");
|
||||
AST_Scope.DEFMETHOD("merge_variables", function(compressor) {
|
||||
if (!compressor.option("merge_vars")) return;
|
||||
var in_try, root, segment = {}, self = this;
|
||||
var in_arg = [], in_try, root, segment = {}, self = this;
|
||||
var first = [], last = [], index = 0;
|
||||
var declarations = new Dictionary();
|
||||
var references = Object.create(null);
|
||||
@@ -6183,45 +6183,29 @@ Compressor.prototype.compress = function(node) {
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_Scope) {
|
||||
push();
|
||||
segment.block = node;
|
||||
var parent = tw.parent();
|
||||
var in_iife = parent && parent.TYPE == "Call" && parent.expression === node;
|
||||
if (!in_iife) {
|
||||
push();
|
||||
segment.block = node;
|
||||
}
|
||||
if (node === self) root = segment;
|
||||
if (node instanceof AST_Lambda) {
|
||||
if (node.name) references[node.name.definition().id] = false;
|
||||
var parent = tw.parent();
|
||||
var in_iife = parent && parent.TYPE == "Call" && parent.expression === node;
|
||||
var marker = node.uses_arguments && !tw.has_directive("use strict") ? function(node) {
|
||||
if (node instanceof AST_SymbolFunarg) references[node.definition().id] = false;
|
||||
} : function(node) {
|
||||
if (node instanceof AST_SymbolFunarg) mark(node);
|
||||
};
|
||||
var scanner = new TreeWalker(function(ref) {
|
||||
if (ref instanceof AST_SymbolDeclaration) references[ref.definition().id] = false;
|
||||
if (!(ref instanceof AST_SymbolRef)) return;
|
||||
var def = ref.definition();
|
||||
var ldef = node.variables.get(ref.name);
|
||||
if (ldef && (ldef === def
|
||||
|| def.undeclared
|
||||
|| node.parent_scope.find_variable(ref.name) === def)) {
|
||||
references[def.id] = false;
|
||||
references[ldef.id] = false;
|
||||
} else if (in_iife) {
|
||||
var save = segment;
|
||||
pop();
|
||||
mark(ref, true);
|
||||
segment = save;
|
||||
} else {
|
||||
mark(ref, true);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
in_arg.push(node);
|
||||
node.argnames.forEach(function(argname) {
|
||||
argname.mark_symbol(marker, scanner);
|
||||
argname.mark_symbol(marker, tw);
|
||||
});
|
||||
if (node.rest) node.rest.mark_symbol(marker, scanner);
|
||||
if (node.rest) node.rest.mark_symbol(marker, tw);
|
||||
in_arg.pop();
|
||||
}
|
||||
walk_lambda(node, tw);
|
||||
pop();
|
||||
if (!in_iife) pop();
|
||||
return true;
|
||||
}
|
||||
if (node instanceof AST_Sub) {
|
||||
@@ -6433,7 +6417,16 @@ Compressor.prototype.compress = function(node) {
|
||||
}
|
||||
|
||||
function mark(sym, read) {
|
||||
var def = sym.definition(), ldef, seg = segment;
|
||||
var def = sym.definition(), ldef;
|
||||
if (read && !all(in_arg, function(fn) {
|
||||
ldef = fn.variables.get(sym.name);
|
||||
if (!ldef) return true;
|
||||
if (!is_funarg(ldef)) return true;
|
||||
return ldef !== def
|
||||
&& !def.undeclared
|
||||
&& fn.parent_scope.find_variable(sym.name) !== def;
|
||||
})) return references[def.id] = references[ldef.id] = false;
|
||||
var seg = segment;
|
||||
if (in_try) {
|
||||
push();
|
||||
seg = segment;
|
||||
|
||||
Reference in New Issue
Block a user