@@ -751,6 +751,18 @@ Compressor.prototype.compress = function(node) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function make_fixed(save, fn) {
|
||||||
|
var prev_save, prev_value;
|
||||||
|
return function() {
|
||||||
|
var current = save();
|
||||||
|
if (prev_save !== current) {
|
||||||
|
prev_save = current;
|
||||||
|
prev_value = fn(current);
|
||||||
|
}
|
||||||
|
return prev_value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function scan_declaration(tw, compressor, lhs, fixed, visit) {
|
function scan_declaration(tw, compressor, lhs, fixed, visit) {
|
||||||
var scanner = new TreeWalker(function(node) {
|
var scanner = new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_DefaultValue) {
|
if (node instanceof AST_DefaultValue) {
|
||||||
@@ -759,15 +771,14 @@ Compressor.prototype.compress = function(node) {
|
|||||||
node.value.walk(tw);
|
node.value.walk(tw);
|
||||||
pop(tw);
|
pop(tw);
|
||||||
var save = fixed;
|
var save = fixed;
|
||||||
if (save) fixed = function() {
|
if (save) fixed = make_fixed(save, function(value) {
|
||||||
var value = save();
|
|
||||||
var ev;
|
var ev;
|
||||||
if (is_undefined(value, compressor)
|
if (is_undefined(value, compressor)
|
||||||
|| (ev = fuzzy_eval(compressor, value, true)) === undefined) {
|
|| (ev = fuzzy_eval(compressor, value, true)) === undefined) {
|
||||||
return make_sequence(node, [ value, node.value ]);
|
return make_sequence(node, [ value, node.value ]);
|
||||||
}
|
}
|
||||||
return ev instanceof AST_Node ? node : value;
|
return ev instanceof AST_Node ? node : value;
|
||||||
};
|
});
|
||||||
node.name.walk(scanner);
|
node.name.walk(scanner);
|
||||||
fixed = save;
|
fixed = save;
|
||||||
return true;
|
return true;
|
||||||
@@ -777,18 +788,17 @@ Compressor.prototype.compress = function(node) {
|
|||||||
var save = fixed;
|
var save = fixed;
|
||||||
node.elements.forEach(function(node, index) {
|
node.elements.forEach(function(node, index) {
|
||||||
if (node instanceof AST_Hole) return reset_flags(node);
|
if (node instanceof AST_Hole) return reset_flags(node);
|
||||||
if (save) fixed = function() {
|
if (save) fixed = make_fixed(save, function(value) {
|
||||||
return make_node(AST_Sub, node, {
|
return make_node(AST_Sub, node, {
|
||||||
expression: save(),
|
expression: value,
|
||||||
property: make_node(AST_Number, node, { value: index }),
|
property: make_node(AST_Number, node, { value: index }),
|
||||||
});
|
});
|
||||||
};
|
});
|
||||||
node.walk(scanner);
|
node.walk(scanner);
|
||||||
});
|
});
|
||||||
if (node.rest) {
|
if (node.rest) {
|
||||||
var fixed_node;
|
var fixed_node;
|
||||||
if (save) fixed = compressor.option("rests") && function() {
|
if (save) fixed = compressor.option("rests") && make_fixed(save, function(value) {
|
||||||
var value = save();
|
|
||||||
if (!(value instanceof AST_Array)) return node;
|
if (!(value instanceof AST_Array)) return node;
|
||||||
for (var i = 0, len = node.elements.length; i < len; i++) {
|
for (var i = 0, len = node.elements.length; i < len; i++) {
|
||||||
if (value.elements[i] instanceof AST_Spread) return node;
|
if (value.elements[i] instanceof AST_Spread) return node;
|
||||||
@@ -796,7 +806,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
if (!fixed_node) fixed_node = make_node(AST_Array, node);
|
if (!fixed_node) fixed_node = make_node(AST_Array, node);
|
||||||
fixed_node.elements = value.elements.slice(len);
|
fixed_node.elements = value.elements.slice(len);
|
||||||
return fixed_node;
|
return fixed_node;
|
||||||
};
|
});
|
||||||
node.rest.walk(scanner);
|
node.rest.walk(scanner);
|
||||||
}
|
}
|
||||||
fixed = save;
|
fixed = save;
|
||||||
@@ -812,7 +822,7 @@ Compressor.prototype.compress = function(node) {
|
|||||||
node.key.walk(tw);
|
node.key.walk(tw);
|
||||||
pop(tw);
|
pop(tw);
|
||||||
}
|
}
|
||||||
if (save) fixed = function() {
|
if (save) fixed = make_fixed(save, function(value) {
|
||||||
var key = node.key;
|
var key = node.key;
|
||||||
var type = AST_Sub;
|
var type = AST_Sub;
|
||||||
if (typeof key == "string") {
|
if (typeof key == "string") {
|
||||||
@@ -823,10 +833,10 @@ Compressor.prototype.compress = function(node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return make_node(type, node, {
|
return make_node(type, node, {
|
||||||
expression: save(),
|
expression: value,
|
||||||
property: key
|
property: key,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
|
||||||
node.value.walk(scanner);
|
node.value.walk(scanner);
|
||||||
});
|
});
|
||||||
if (node.rest) {
|
if (node.rest) {
|
||||||
|
|||||||
@@ -3497,3 +3497,41 @@ issue_5370: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_5405_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var [ a ] = [ {} ];
|
||||||
|
console.log(a === a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var [ a ] = [ {} ];
|
||||||
|
console.log(true ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_5405_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var { p: a } = { p: [] };
|
||||||
|
console.log(a === a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var { p: a } = { p: [] };
|
||||||
|
console.log(true ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user