reduce hoisting declarations (#2687)
This commit is contained in:
@@ -325,9 +325,14 @@ merge(Compressor.prototype, {
|
|||||||
def.single_use = undefined;
|
def.single_use = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
function reset_variables(compressor, node) {
|
function reset_variables(tw, compressor, node) {
|
||||||
node.variables.each(function(def) {
|
node.variables.each(function(def) {
|
||||||
reset_def(compressor, def);
|
reset_def(compressor, def);
|
||||||
|
if (def.fixed === undefined && def.orig[0].TYPE == "SymbolVar") {
|
||||||
|
def.fixed = null;
|
||||||
|
def.safe_ids = tw.safe_ids;
|
||||||
|
mark(tw, def, true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,6 +361,11 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function safe_to_assign(tw, def, value) {
|
function safe_to_assign(tw, def, value) {
|
||||||
|
if (def.fixed === null && def.safe_ids) {
|
||||||
|
def.safe_ids[def.id] = false;
|
||||||
|
delete def.safe_ids;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (!HOP(tw.safe_ids, def.id)) return false;
|
if (!HOP(tw.safe_ids, def.id)) return false;
|
||||||
if (!safe_to_read(tw, def)) return false;
|
if (!safe_to_read(tw, def)) return false;
|
||||||
if (def.fixed === false) return false;
|
if (def.fixed === false) return false;
|
||||||
@@ -462,10 +472,7 @@ merge(Compressor.prototype, {
|
|||||||
var node = this;
|
var node = this;
|
||||||
if (node.operator != "=" || !(node.left instanceof AST_SymbolRef)) return;
|
if (node.operator != "=" || !(node.left instanceof AST_SymbolRef)) return;
|
||||||
var d = node.left.definition();
|
var d = node.left.definition();
|
||||||
if (safe_to_assign(tw, d, node.right)
|
if (safe_to_assign(tw, d, node.right)) {
|
||||||
|| d.fixed === undefined && all(d.orig, function(sym) {
|
|
||||||
return sym instanceof AST_SymbolVar;
|
|
||||||
})) {
|
|
||||||
d.references.push(node.left);
|
d.references.push(node.left);
|
||||||
d.fixed = function() {
|
d.fixed = function() {
|
||||||
return node.right;
|
return node.right;
|
||||||
@@ -495,7 +502,6 @@ merge(Compressor.prototype, {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
def(AST_Defun, function(tw, descend, compressor) {
|
def(AST_Defun, function(tw, descend, compressor) {
|
||||||
reset_variables(compressor, this);
|
|
||||||
this.inlined = false;
|
this.inlined = false;
|
||||||
var d = this.name.definition();
|
var d = this.name.definition();
|
||||||
if (compressor.exposed(d) || safe_to_read(tw, d)) {
|
if (compressor.exposed(d) || safe_to_read(tw, d)) {
|
||||||
@@ -508,6 +514,7 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
var save_ids = tw.safe_ids;
|
var save_ids = tw.safe_ids;
|
||||||
tw.safe_ids = Object.create(null);
|
tw.safe_ids = Object.create(null);
|
||||||
|
reset_variables(tw, compressor, this);
|
||||||
descend();
|
descend();
|
||||||
tw.safe_ids = save_ids;
|
tw.safe_ids = save_ids;
|
||||||
return true;
|
return true;
|
||||||
@@ -555,9 +562,9 @@ merge(Compressor.prototype, {
|
|||||||
});
|
});
|
||||||
def(AST_Function, function(tw, descend, compressor) {
|
def(AST_Function, function(tw, descend, compressor) {
|
||||||
var node = this;
|
var node = this;
|
||||||
reset_variables(compressor, node);
|
|
||||||
node.inlined = false;
|
node.inlined = false;
|
||||||
push(tw);
|
push(tw);
|
||||||
|
reset_variables(tw, compressor, node);
|
||||||
var iife;
|
var iife;
|
||||||
if (!node.name
|
if (!node.name
|
||||||
&& (iife = tw.parent()) instanceof AST_Call
|
&& (iife = tw.parent()) instanceof AST_Call
|
||||||
@@ -644,7 +651,7 @@ merge(Compressor.prototype, {
|
|||||||
this.globals.each(function(def) {
|
this.globals.each(function(def) {
|
||||||
reset_def(compressor, def);
|
reset_def(compressor, def);
|
||||||
});
|
});
|
||||||
reset_variables(compressor, this);
|
reset_variables(tw, compressor, this);
|
||||||
});
|
});
|
||||||
def(AST_Try, function(tw) {
|
def(AST_Try, function(tw) {
|
||||||
push(tw);
|
push(tw);
|
||||||
@@ -669,8 +676,6 @@ merge(Compressor.prototype, {
|
|||||||
tw.loop_ids[d.id] = tw.in_loop;
|
tw.loop_ids[d.id] = tw.in_loop;
|
||||||
mark(tw, d, false);
|
mark(tw, d, false);
|
||||||
descend();
|
descend();
|
||||||
} else {
|
|
||||||
d.fixed = null;
|
|
||||||
}
|
}
|
||||||
mark(tw, d, true);
|
mark(tw, d, true);
|
||||||
return true;
|
return true;
|
||||||
@@ -4008,8 +4013,8 @@ merge(Compressor.prototype, {
|
|||||||
var name = fn.argnames[i];
|
var name = fn.argnames[i];
|
||||||
var value = self.args[i];
|
var value = self.args[i];
|
||||||
if (name.__unused) {
|
if (name.__unused) {
|
||||||
if (value || expressions.length) {
|
if (value) {
|
||||||
expressions.unshift(value || make_node(AST_Undefined, self));
|
expressions.unshift(value);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var def = name.definition();
|
var def = name.definition();
|
||||||
@@ -4024,10 +4029,10 @@ merge(Compressor.prototype, {
|
|||||||
}));
|
}));
|
||||||
var sym = make_node(AST_SymbolRef, name, name);
|
var sym = make_node(AST_SymbolRef, name, name);
|
||||||
def.references.push(sym);
|
def.references.push(sym);
|
||||||
expressions.unshift(make_node(AST_Assign, self, {
|
if (value) expressions.unshift(make_node(AST_Assign, self, {
|
||||||
operator: "=",
|
operator: "=",
|
||||||
left: sym,
|
left: sym,
|
||||||
right: value || make_node(AST_Undefined, self)
|
right: value
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2312,8 +2312,7 @@ delay_def: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
return a;
|
return;
|
||||||
var a;
|
|
||||||
}
|
}
|
||||||
function g() {
|
function g() {
|
||||||
return a;
|
return a;
|
||||||
@@ -2324,6 +2323,28 @@ delay_def: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delay_def_lhs: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
long_name++;
|
||||||
|
return long_name;
|
||||||
|
var long_name;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
long_name++;
|
||||||
|
return long_name;
|
||||||
|
var long_name;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "NaN"
|
||||||
|
}
|
||||||
|
|
||||||
booleans: {
|
booleans: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
@@ -4952,3 +4973,29 @@ issue_2598: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "true"
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var_if: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
if (x()) {
|
||||||
|
var a;
|
||||||
|
if (!g) a = true;
|
||||||
|
if (a) g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
if (x()) {
|
||||||
|
var a;
|
||||||
|
if (!g) a = true;
|
||||||
|
if (a) g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user