Skip to content

Commit 15c8edb

Browse files
authoredAug 1, 2024··
fix corner case in side_effects (#5902)
fixes #5900
1 parent d82b7de commit 15c8edb

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed
 

‎lib/compress.js

+13-6
Original file line numberDiff line numberDiff line change
@@ -9345,14 +9345,21 @@ Compressor.prototype.compress = function(node) {
93459345
return expressions === this.expressions ? this : make_sequence(this, expressions);
93469346
});
93479347
def(AST_Sub, function(compressor, first_in_statement) {
9348-
var expr = this.expression;
9349-
if (expr.may_throw_on_access(compressor)) return this;
9350-
var prop = this.property;
9351-
expr = expr.drop_side_effect_free(compressor, first_in_statement);
9352-
if (!expr) return prop.drop_side_effect_free(compressor, first_in_statement);
9348+
var self = this;
9349+
var expr = self.expression;
9350+
if (expr.may_throw_on_access(compressor)) return self;
9351+
var prop = self.property;
9352+
var optional = self.optional;
9353+
if (!optional) {
9354+
expr = expr.drop_side_effect_free(compressor, first_in_statement);
9355+
if (!expr) return prop.drop_side_effect_free(compressor, first_in_statement);
9356+
}
93539357
prop = prop.drop_side_effect_free(compressor);
93549358
if (!prop) return expr;
9355-
return make_sequence(this, [ expr, prop ]);
9359+
if (!optional) return make_sequence(self, [ expr, prop ]);
9360+
self = self.clone();
9361+
self.property = prop;
9362+
return self;
93569363
});
93579364
def(AST_SymbolRef, function(compressor) {
93589365
return this.is_declared(compressor) && can_drop_symbol(this, compressor) ? null : this;

‎test/compress/optional-chains.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ issue_5292_sub_pure_getters: {
586586
console.log("foo");
587587
}
588588
};
589-
console.log("bar");
589+
o?.[console.log("bar")];
590590
}
591591
}
592592

@@ -647,3 +647,25 @@ issue_5856: {
647647
expect_stdout: "PASS"
648648
node_version: ">=14"
649649
}
650+
651+
issue_5900: {
652+
options = {
653+
pure_getters: "strict",
654+
reduce_vars: true,
655+
side_effects: true,
656+
}
657+
input: {
658+
var a = 42, b = "PASS";
659+
a[a = null];
660+
a?.[b = "FAIL"];
661+
console.log(b);
662+
}
663+
expect: {
664+
var a = 42, b = "PASS";
665+
a[a = null];
666+
a?.[b = "FAIL"];
667+
console.log(b);
668+
}
669+
expect_stdout: "PASS"
670+
node_version: ">=14"
671+
}

0 commit comments

Comments
 (0)
Please sign in to comment.