@@ -8129,6 +8129,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function trim_destructured(node, value, process, drop, root) {
|
function trim_destructured(node, value, process, drop, root) {
|
||||||
|
var unwind = true;
|
||||||
var trimmer = new TreeTransformer(function(node) {
|
var trimmer = new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_DefaultValue) {
|
if (node instanceof AST_DefaultValue) {
|
||||||
if (!(compressor.option("default_values") && value && value.is_defined(compressor))) {
|
if (!(compressor.option("default_values") && value && value.is_defined(compressor))) {
|
||||||
@@ -8146,21 +8147,27 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_DestructuredArray) {
|
if (node instanceof AST_DestructuredArray) {
|
||||||
var save_drop = drop;
|
var save_drop = drop;
|
||||||
|
var save_unwind = unwind;
|
||||||
var save_value = value;
|
var save_value = value;
|
||||||
if (value instanceof AST_SymbolRef) {
|
if (value instanceof AST_SymbolRef) {
|
||||||
drop = false;
|
drop = false;
|
||||||
value = value.fixed_value();
|
value = value.fixed_value();
|
||||||
}
|
}
|
||||||
var native, values;
|
var last_side_effects, native, values;
|
||||||
if (value instanceof AST_Array) {
|
if (value instanceof AST_Array) {
|
||||||
native = true;
|
native = true;
|
||||||
values = value.elements;
|
values = value.elements;
|
||||||
|
if (save_unwind) for (last_side_effects = values.length; --last_side_effects >= 0;) {
|
||||||
|
if (values[last_side_effects].has_side_effects(compressor)) break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
native = value && value.is_string(compressor);
|
native = value && value.is_string(compressor);
|
||||||
values = false;
|
values = false;
|
||||||
|
last_side_effects = node.elements.length;
|
||||||
}
|
}
|
||||||
var elements = [], newValues = drop && [], pos = 0;
|
var elements = [], newValues = drop && [], pos = 0;
|
||||||
node.elements.forEach(function(element, index) {
|
node.elements.forEach(function(element, index) {
|
||||||
|
if (save_unwind) unwind = index >= last_side_effects;
|
||||||
value = values && values[index];
|
value = values && values[index];
|
||||||
if (value instanceof AST_Hole) {
|
if (value instanceof AST_Hole) {
|
||||||
value = null;
|
value = null;
|
||||||
@@ -8203,6 +8210,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
value = save_value;
|
value = save_value;
|
||||||
|
unwind = save_unwind;
|
||||||
drop = save_drop;
|
drop = save_drop;
|
||||||
if (values && newValues) {
|
if (values && newValues) {
|
||||||
fill_holes(value, newValues);
|
fill_holes(value, newValues);
|
||||||
@@ -8218,6 +8226,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
return null;
|
return null;
|
||||||
case 1:
|
case 1:
|
||||||
if (!drop) break;
|
if (!drop) break;
|
||||||
|
if (!unwind) break;
|
||||||
if (node === root) break;
|
if (node === root) break;
|
||||||
var sym = elements[0];
|
var sym = elements[0];
|
||||||
if (sym.has_side_effects(compressor)) break;
|
if (sym.has_side_effects(compressor)) break;
|
||||||
@@ -8236,16 +8245,19 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_DestructuredObject) {
|
if (node instanceof AST_DestructuredObject) {
|
||||||
var save_drop = drop;
|
var save_drop = drop;
|
||||||
|
var save_unwind = unwind;
|
||||||
var save_value = value;
|
var save_value = value;
|
||||||
if (value instanceof AST_SymbolRef) {
|
if (value instanceof AST_SymbolRef) {
|
||||||
drop = false;
|
drop = false;
|
||||||
value = value.fixed_value();
|
value = value.fixed_value();
|
||||||
}
|
}
|
||||||
var prop_keys, prop_map, values;
|
var last_side_effects, prop_keys, prop_map, values;
|
||||||
if (value instanceof AST_Object) {
|
if (value instanceof AST_Object) {
|
||||||
|
last_side_effects = -1;
|
||||||
prop_keys = [];
|
prop_keys = [];
|
||||||
prop_map = new Dictionary();
|
prop_map = new Dictionary();
|
||||||
values = value.properties.map(function(prop, index) {
|
values = value.properties.map(function(prop, index) {
|
||||||
|
if (save_unwind && prop.has_side_effects(compressor)) last_side_effects = index;
|
||||||
prop = prop.clone();
|
prop = prop.clone();
|
||||||
if (prop instanceof AST_Spread) {
|
if (prop instanceof AST_Spread) {
|
||||||
prop_map = false;
|
prop_map = false;
|
||||||
@@ -8261,6 +8273,8 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
return prop;
|
return prop;
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
last_side_effects = node.properties.length;
|
||||||
}
|
}
|
||||||
if (node.rest) {
|
if (node.rest) {
|
||||||
value = false;
|
value = false;
|
||||||
@@ -8283,6 +8297,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
return key;
|
return key;
|
||||||
}).forEach(function(key, index) {
|
}).forEach(function(key, index) {
|
||||||
var prop = node.properties[index], trimmed;
|
var prop = node.properties[index], trimmed;
|
||||||
|
if (save_unwind) unwind = index >= last_side_effects;
|
||||||
if (key instanceof AST_Node) {
|
if (key instanceof AST_Node) {
|
||||||
drop = false;
|
drop = false;
|
||||||
value = false;
|
value = false;
|
||||||
@@ -8323,6 +8338,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
value = save_value;
|
value = save_value;
|
||||||
|
unwind = save_unwind;
|
||||||
drop = save_drop;
|
drop = save_drop;
|
||||||
if (drop_keys && prop_keys) {
|
if (drop_keys && prop_keys) {
|
||||||
value = value.clone();
|
value = value.clone();
|
||||||
@@ -8357,6 +8373,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
return null;
|
return null;
|
||||||
case 1:
|
case 1:
|
||||||
if (!drop) break;
|
if (!drop) break;
|
||||||
|
if (!unwind) break;
|
||||||
if (node === root) break;
|
if (node === root) break;
|
||||||
var prop = properties[0];
|
var prop = properties[0];
|
||||||
if (prop.key instanceof AST_Node) break;
|
if (prop.key instanceof AST_Node) break;
|
||||||
|
|||||||
@@ -4007,3 +4007,237 @@ issue_5854_2: {
|
|||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5866_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
var { p: { q: b } } = {
|
||||||
|
p: a,
|
||||||
|
r: a.q = "PASS",
|
||||||
|
};
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
var { q: b } = {
|
||||||
|
p: a,
|
||||||
|
r: a.q = "PASS",
|
||||||
|
}.p;
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {}, b;
|
||||||
|
({ p: { q: b } } = {
|
||||||
|
p: a,
|
||||||
|
r: a.q = "PASS",
|
||||||
|
});
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, a = {};
|
||||||
|
({ q: b } = {
|
||||||
|
p: a,
|
||||||
|
r: a.q = "PASS",
|
||||||
|
}.p);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_3: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
var [ { p: b } ] = [ a, a.p = "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
var { p: b } = [ a, a.p = "PASS" ][0];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_4: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {}, b;
|
||||||
|
[ { p: b } ] = [ a, a.p = "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, a = {};
|
||||||
|
({ p: b } = [ a, a.p = "PASS" ][0]);
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_5: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [];
|
||||||
|
var [ [ b ] ] = [ a, a[0] = "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = [];
|
||||||
|
var [ b ] = [ a, a[0] = "PASS" ][0];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_6: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [], b;
|
||||||
|
[ [ b ] ] = [ a, a[0] = "PASS" ];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, a = [];
|
||||||
|
[ b ] = [ a, a[0] = "PASS" ][0];
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_7: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
var [ { p: b }, c ] = [ a, a.p = {} ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
var [ { p: b }, c ] = [ a, a.p = {} ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_8: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {}, b, c;
|
||||||
|
[ { p: b }, c ] = [ a, a.p = {} ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, c, a = {};
|
||||||
|
[ { p: b }, c ] = [ a, a.p = {} ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_9: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
var [ b, { p: c } ] = [ a.p = {}, a ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
var [ b, c ] = [ a.p = {}, a.p ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_10: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {}, b, c;
|
||||||
|
[ b, { p: c } ] = [ a.p = {}, a ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, c, a = {};
|
||||||
|
[ b, c ] = [ a.p = {}, a.p ];
|
||||||
|
console.log(b === c ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_11: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {};
|
||||||
|
var { p: { q: b } } = { p: a = { q: {} } };
|
||||||
|
console.log(a.q === b ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = {};
|
||||||
|
var b = { p: (a = { q: {} }).q }.p;
|
||||||
|
console.log(a.q === b ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5866_12: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = {}, b;
|
||||||
|
({ p: { q: b } } = { p: a = { q: {} } });
|
||||||
|
console.log(a.q === b ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b, a = {};
|
||||||
|
b = { p: (a = { q: {} }).q }.p;
|
||||||
|
console.log(a.q === b ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user