fix corner case in inline (#4660)

fixes #4659
This commit is contained in:
Alex Lam S.L
2021-02-18 08:15:44 +00:00
committed by GitHub
parent 6a2bda52f3
commit a7bcd4d613
3 changed files with 133 additions and 9 deletions

View File

@@ -5964,7 +5964,7 @@ merge(Compressor.prototype, {
if (old_def) old_def.forEach(function(node) { if (old_def) old_def.forEach(function(node) {
node.name = name_def.name; node.name = name_def.name;
node.thedef = name_def; node.thedef = name_def;
node.reference({}); node.reference();
}); });
body.push(defun); body.push(defun);
} else { } else {
@@ -6798,7 +6798,7 @@ merge(Compressor.prototype, {
scope: self, scope: self,
thedef: decl.definition() thedef: decl.definition()
}); });
sym.reference({}); sym.reference();
assignments.push(make_node(AST_Assign, node, { assignments.push(make_node(AST_Assign, node, {
operator: "=", operator: "=",
left: sym, left: sym,
@@ -6845,7 +6845,7 @@ merge(Compressor.prototype, {
scope: node.expression.scope, scope: node.expression.scope,
thedef: def thedef: def
}); });
sym.reference({}); sym.reference();
return sym; return sym;
} }
if (node instanceof AST_Unary) { if (node instanceof AST_Unary) {
@@ -8469,12 +8469,12 @@ merge(Compressor.prototype, {
node = maintain_this_binding(compressor, parent, current, node); node = maintain_this_binding(compressor, parent, current, node);
if (replacing || best_of_expression(node, self) === node) { if (replacing || best_of_expression(node, self) === node) {
refs.forEach(function(ref) { refs.forEach(function(ref) {
var def = ref.definition(); ref.scope = exp === fn ? fn.parent_scope : exp.scope;
def.references.push(ref); ref.reference();
if (replacing) { if (replacing) {
def.replaced++; ref.definition().replaced++;
} else { } else {
def.single_use = false; ref.definition().single_use = false;
} }
}); });
return node; return node;
@@ -10853,7 +10853,7 @@ merge(Compressor.prototype, {
}, fn.argnames) === argname) { }, fn.argnames) === argname) {
def.reassigned = false; def.reassigned = false;
var sym = make_node(AST_SymbolRef, self, argname); var sym = make_node(AST_SymbolRef, self, argname);
sym.reference({}); sym.reference();
delete argname.__unused; delete argname.__unused;
return sym; return sym;
} }

View File

@@ -433,7 +433,9 @@ AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
var def = this.definition(); var def = this.definition();
for (var s = this.scope; s; s = s.parent_scope) { for (var s = this.scope; s; s = s.parent_scope) {
push_uniq(s.enclosed, def); push_uniq(s.enclosed, def);
if (options.keep_fnames) { if (!options) {
delete s._var_names;
} else if (options.keep_fnames) {
s.functions.each(function(d) { s.functions.each(function(d) {
push_uniq(def.scope.enclosed, d); push_uniq(def.scope.enclosed, d);
}); });

View File

@@ -5436,3 +5436,125 @@ issue_4655: {
} }
expect_stdout: "PASS" expect_stdout: "PASS"
} }
issue_4659_1: {
options = {
inline: true,
reduce_vars: true,
}
input: {
var a = 0;
(function() {
function f() {
return a++;
}
(function() {
f && f();
(function() {
var a = console && a;
})();
})();
})();
console.log(a);
}
expect: {
var a = 0;
(function() {
function f() {
return a++;
}
(function() {
f && a++;
(function() {
var a = console && a;
})();
})();
})();
console.log(a);
}
expect_stdout: "1"
}
issue_4659_2: {
options = {
inline: true,
reduce_vars: true,
}
input: {
var a = 0;
(function() {
function f() {
return a++;
}
(function() {
(function() {
f && f();
})();
(function() {
var a = console && a;
})();
})();
})();
console.log(a);
}
expect: {
var a = 0;
(function() {
function f() {
return a++;
}
(function() {
void (f && a++);
(function() {
var a = console && a;
})();
})();
})();
console.log(a);
}
expect_stdout: "1"
}
issue_4659_3: {
options = {
inline: true,
reduce_vars: true,
unused: true,
}
input: {
var a = 0;
(function() {
function f() {
return a++;
}
(function() {
function g() {
while (!console);
}
g(f && f());
(function() {
var a = console && a;
})();
})();
})();
console.log(a);
}
expect: {
var a = 0;
(function() {
function f() {
return a++;
}
(function() {
(function() {
while (!console);
})(f && a++);
(function() {
var a = console && a;
})();
})();
})();
console.log(a);
}
expect_stdout: "1"
}