@@ -1748,6 +1748,7 @@ Compressor.prototype.compress = function(node) {
|
||||
|
||||
var identifier_atom = makePredicate("Infinity NaN undefined");
|
||||
function is_lhs_read_only(lhs, compressor) {
|
||||
if (lhs instanceof AST_Atom) return true;
|
||||
if (lhs instanceof AST_ObjectIdentity) return true;
|
||||
if (lhs instanceof AST_PropAccess) {
|
||||
if (lhs.property === "__proto__") return true;
|
||||
@@ -11589,10 +11590,12 @@ Compressor.prototype.compress = function(node) {
|
||||
if (node instanceof AST_Unary) return true;
|
||||
}
|
||||
|
||||
function extract_lhs(node) {
|
||||
if (node instanceof AST_Assign) return node.left;
|
||||
function extract_lhs(node, compressor) {
|
||||
if (node instanceof AST_Assign) return is_lhs_read_only(node.left, compressor) ? node : node.left;
|
||||
if (node instanceof AST_Sequence) return extract_lhs(node.tail_node());
|
||||
if (node instanceof AST_UnaryPrefix && UNARY_POSTFIX[node.operator]) return node.expression;
|
||||
if (node instanceof AST_UnaryPrefix && UNARY_POSTFIX[node.operator]) {
|
||||
return is_lhs_read_only(node.expression, compressor) ? node : node.expression;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
@@ -11601,6 +11604,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (node instanceof AST_Sub) {
|
||||
return repeatable(compressor, node.expression) && repeatable(compressor, node.property);
|
||||
}
|
||||
if (node instanceof AST_Symbol) return true;
|
||||
return !node.has_side_effects(compressor);
|
||||
}
|
||||
|
||||
@@ -11637,7 +11641,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (seq !== self) return seq.optimize(compressor);
|
||||
}
|
||||
if (compressor.option("assignments") && lazy_op[self.operator]) {
|
||||
var lhs = extract_lhs(self.left);
|
||||
var lhs = extract_lhs(self.left, compressor);
|
||||
var right = self.right;
|
||||
// a || (a = x) ---> a = a || x
|
||||
// (a = x) && (a = y) ---> a = (a = x) && y
|
||||
@@ -11737,7 +11741,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var in_bool = false;
|
||||
var parent = compressor.parent();
|
||||
if (compressor.option("booleans")) {
|
||||
var lhs = extract_lhs(self.left);
|
||||
var lhs = extract_lhs(self.left, compressor);
|
||||
if (lazy_op[self.operator] && !lhs.has_side_effects(compressor)) {
|
||||
// a || a ---> a
|
||||
// (a = x) && a --> a = x
|
||||
@@ -12898,7 +12902,7 @@ Compressor.prototype.compress = function(node) {
|
||||
}
|
||||
var consequent = self.consequent;
|
||||
var alternative = self.alternative;
|
||||
var cond_lhs = extract_lhs(condition);
|
||||
var cond_lhs = extract_lhs(condition, compressor);
|
||||
if (repeatable(compressor, cond_lhs)) {
|
||||
// x ? x : y ---> x || y
|
||||
if (cond_lhs.equals(consequent)) return make_node(AST_Binary, self, {
|
||||
|
||||
Reference in New Issue
Block a user