Skip to content

Commit f63b7b0

Browse files
authored
fix corner case in collapse_vars (#5639)
fixes #5638
1 parent d530f93 commit f63b7b0

3 files changed

Lines changed: 115 additions & 3 deletions

File tree

lib/compress.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3416,9 +3416,15 @@ Compressor.prototype.compress = function(node) {
34163416
if (def.references.length - def.replaced == referenced) return true;
34173417
if (!def.fixed) return false;
34183418
if (!lhs.fixed) return false;
3419-
if (def.references.filter(function(ref) {
3420-
return ref.fixed === lhs.fixed;
3421-
}).length != referenced) return false;
3419+
var matched = 0;
3420+
if (!all(def.references, function(ref, index) {
3421+
var fixed = ref.fixed;
3422+
if (!fixed) return false;
3423+
if (fixed.to_binary || fixed.to_prefix) return false;
3424+
if (fixed === lhs.fixed) matched++;
3425+
return true;
3426+
})) return false;
3427+
if (matched != referenced) return false;
34223428
verify_ref = true;
34233429
return true;
34243430
}

test/compress/collapse_vars.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10000,3 +10000,55 @@ issue_5568: {
1000010000
}
1000110001
expect_stdout: "PASS"
1000210002
}
10003+
10004+
issue_5638_1: {
10005+
options = {
10006+
collapse_vars: true,
10007+
pure_getters: "strict",
10008+
reduce_vars: true,
10009+
toplevel: true,
10010+
}
10011+
input: {
10012+
var log = console.log;
10013+
var a = { foo: 42 }, b;
10014+
for (var k in a) {
10015+
b = a[k];
10016+
log(k || b, b++);
10017+
}
10018+
}
10019+
expect: {
10020+
var log = console.log;
10021+
var a = { foo: 42 }, b;
10022+
for (var k in a) {
10023+
b = a[k];
10024+
log(k || b, b++);
10025+
}
10026+
}
10027+
expect_stdout: "foo 42"
10028+
}
10029+
10030+
issue_5638_2: {
10031+
options = {
10032+
collapse_vars: true,
10033+
pure_getters: "strict",
10034+
reduce_vars: true,
10035+
toplevel: true,
10036+
}
10037+
input: {
10038+
var log = console.log;
10039+
var a = { foo: 6 }, b;
10040+
for (var k in a) {
10041+
b = a[k];
10042+
log(k || b, b *= 7);
10043+
}
10044+
}
10045+
expect: {
10046+
var log = console.log;
10047+
var a = { foo: 6 }, b;
10048+
for (var k in a) {
10049+
b = a[k];
10050+
log(k || b, b *= 7);
10051+
}
10052+
}
10053+
expect_stdout: "foo 42"
10054+
}

test/compress/hoist_vars.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,3 +701,57 @@ issue_5626: {
701701
}
702702
expect_stdout: "PASS"
703703
}
704+
705+
issue_5638_1: {
706+
options = {
707+
collapse_vars: true,
708+
hoist_vars: true,
709+
pure_getters: "strict",
710+
reduce_vars: true,
711+
toplevel: true,
712+
}
713+
input: {
714+
var log = console.log;
715+
var o = { foo: 42 };
716+
for (var k in o) {
717+
var v = o[k];
718+
log(k || v, v++);
719+
}
720+
}
721+
expect: {
722+
var log, o, k, v;
723+
log = console.log;
724+
for (k in o = { foo: 42 }) {
725+
v = o[k];
726+
log(k || v, v++);
727+
}
728+
}
729+
expect_stdout: "foo 42"
730+
}
731+
732+
issue_5638_2: {
733+
options = {
734+
collapse_vars: true,
735+
hoist_vars: true,
736+
pure_getters: "strict",
737+
reduce_vars: true,
738+
toplevel: true,
739+
}
740+
input: {
741+
var log = console.log;
742+
var o = { foo: 6 };
743+
for (var k in o) {
744+
var v = o[k];
745+
log(k || v, v *= 7);
746+
}
747+
}
748+
expect: {
749+
var log, o, k, v;
750+
log = console.log;
751+
for (k in o = { foo: 6 }) {
752+
v = o[k];
753+
log(k || v, v *= 7);
754+
}
755+
}
756+
expect_stdout: "foo 42"
757+
}

0 commit comments

Comments
 (0)