@@ -352,6 +352,23 @@ merge(Compressor.prototype, {
|
|||||||
return orig.length == 1 && orig[0] instanceof AST_SymbolFunarg;
|
return orig.length == 1 && orig[0] instanceof AST_SymbolFunarg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function is_content_constant(ref, depth) {
|
||||||
|
var escaped = ref.definition().escaped;
|
||||||
|
switch (escaped.length) {
|
||||||
|
case 0:
|
||||||
|
return true;
|
||||||
|
case 1:
|
||||||
|
var found = false;
|
||||||
|
escaped[0].walk(new TreeWalker(function(node) {
|
||||||
|
if (found) return true;
|
||||||
|
if (node === ref) return found = true;
|
||||||
|
}));
|
||||||
|
return found;
|
||||||
|
default:
|
||||||
|
return depth <= escaped.depth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
(function(def) {
|
(function(def) {
|
||||||
def(AST_Node, noop);
|
def(AST_Node, noop);
|
||||||
|
|
||||||
@@ -496,9 +513,15 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function to_value(def, sym, fixed) {
|
function to_value(def, sym, fixed) {
|
||||||
if (fixed instanceof AST_Node) return fixed;
|
if (fixed == null) {
|
||||||
if (typeof fixed == "function") return fixed();
|
fixed = make_node(AST_Undefined, sym);
|
||||||
return make_node(AST_Undefined, sym);
|
} else if (typeof fixed == "function") {
|
||||||
|
fixed = fixed();
|
||||||
|
}
|
||||||
|
if (fixed instanceof AST_Array || fixed instanceof AST_Object) {
|
||||||
|
if (!is_content_constant(sym)) return false;
|
||||||
|
}
|
||||||
|
return fixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ref_once(compressor, def) {
|
function ref_once(compressor, def) {
|
||||||
@@ -3515,27 +3538,8 @@ merge(Compressor.prototype, {
|
|||||||
};
|
};
|
||||||
cached.push(fixed);
|
cached.push(fixed);
|
||||||
}
|
}
|
||||||
if (value && typeof value == "object") {
|
if (value && typeof value == "object" && !is_content_constant(this, depth)) return this;
|
||||||
var escaped = this.definition().escaped;
|
|
||||||
switch (escaped.length) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (contains_ref(escaped[0], this)) break;
|
|
||||||
default:
|
|
||||||
if (depth > escaped.depth) return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
function contains_ref(expr, ref) {
|
|
||||||
var found = false;
|
|
||||||
expr.walk(new TreeWalker(function(node) {
|
|
||||||
if (found) return true;
|
|
||||||
if (node === ref) return found = true;
|
|
||||||
}));
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
var global_objs = {
|
var global_objs = {
|
||||||
Array: Array,
|
Array: Array,
|
||||||
|
|||||||
@@ -7323,3 +7323,38 @@ issue_3957_2: {
|
|||||||
"0",
|
"0",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3958: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
(function(b) {
|
||||||
|
(function(c) {
|
||||||
|
console.log(c[0] = 1);
|
||||||
|
})(a = b);
|
||||||
|
--a;
|
||||||
|
})([]);
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
(function(b) {
|
||||||
|
(function(c) {
|
||||||
|
console.log(c[0] = 1);
|
||||||
|
})(a = []);
|
||||||
|
--a;
|
||||||
|
})();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"0",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user