Skip to content

Commit 124c4d3

Browse files
authoredJul 8, 2024··
fix corner case in reduce_vars (#5873)
fixes #5872
1 parent 787dfbe commit 124c4d3

File tree

2 files changed

+128
-4
lines changed

2 files changed

+128
-4
lines changed
 

‎lib/compress.js

+12-4
Original file line numberDiff line numberDiff line change
@@ -654,12 +654,20 @@ Compressor.prototype.compress = function(node) {
654654
}
655655

656656
function access(tw, def) {
657-
tw.defined_ids[def.id] = [ tw.defined_ids.seq ];
657+
tw.defined_ids[def.id] = tw.defined_ids.seq;
658658
}
659659

660660
function assign(tw, def) {
661+
tw.assigned_ids[def.id] = tw.defined_ids.seq;
662+
tw.defined_ids[def.id] = false;
663+
}
664+
665+
function safe_to_access(tw, def) {
666+
var seq = tw.defined_ids.seq;
661667
var defined = tw.defined_ids[def.id];
662-
if (defined) defined[0] = false;
668+
if (defined !== seq) return false;
669+
var assigned = tw.assigned_ids[def.id];
670+
return !assigned || assigned === seq;
663671
}
664672

665673
function mark(tw, def) {
@@ -1424,8 +1432,7 @@ Compressor.prototype.compress = function(node) {
14241432
var d = ref.definition();
14251433
var fixed = d.fixed || d.last_ref && d.last_ref.fixed;
14261434
push_ref(d, ref);
1427-
var defined = tw.defined_ids[d.id];
1428-
if (defined && defined[0] === tw.defined_ids.seq) ref.defined = true;
1435+
if (safe_to_access(tw, d)) ref.defined = true;
14291436
if (d.references.length == 1 && !d.fixed && d.orig[0] instanceof AST_SymbolDefun) {
14301437
tw.loop_ids[d.id] = tw.in_loop;
14311438
}
@@ -1656,6 +1663,7 @@ Compressor.prototype.compress = function(node) {
16561663
return node.reduce_vars(tw, descend, compressor);
16571664
} : reset_flags);
16581665
// Side-effect tracking on sequential property access
1666+
tw.assigned_ids = Object.create(null);
16591667
tw.defined_ids = Object.create(null);
16601668
tw.defined_ids.seq = {};
16611669
// Flow control for visiting lambda definitions

‎test/compress/reduce_vars.js

+116
Original file line numberDiff line numberDiff line change
@@ -8346,3 +8346,119 @@ issue_1666_undefined_strict: {
83468346
}
83478347
expect_stdout: true
83488348
}
8349+
8350+
issue_5872_1: {
8351+
options = {
8352+
pure_getters: "strict",
8353+
reduce_vars: true,
8354+
side_effects: true,
8355+
}
8356+
input: {
8357+
var a = 42;
8358+
try {
8359+
while (!function f() {
8360+
a.p;
8361+
a = null;
8362+
}(a.q)) {
8363+
a.r;
8364+
console.log("FAIL");
8365+
}
8366+
} catch (e) {
8367+
console.log("PASS");
8368+
}
8369+
}
8370+
expect: {
8371+
var a = 42;
8372+
try {
8373+
while (!function f() {
8374+
a.p;
8375+
a = null;
8376+
}(a.q)) {
8377+
a.r;
8378+
console.log("FAIL");
8379+
}
8380+
} catch (e) {
8381+
console.log("PASS");
8382+
}
8383+
}
8384+
expect_stdout: "PASS"
8385+
}
8386+
8387+
issue_5872_2: {
8388+
options = {
8389+
pure_getters: "strict",
8390+
reduce_vars: true,
8391+
side_effects: true,
8392+
toplevel: true,
8393+
}
8394+
input: {
8395+
function f() {
8396+
a.p;
8397+
a = null;
8398+
}
8399+
8400+
var a = 42;
8401+
try {
8402+
while (!f(a.q)) {
8403+
a.r;
8404+
console.log("FAIL");
8405+
}
8406+
} catch (e) {
8407+
console.log("PASS");
8408+
}
8409+
}
8410+
expect: {
8411+
function f() {
8412+
a.p;
8413+
a = null;
8414+
}
8415+
8416+
var a = 42;
8417+
try {
8418+
while (!f(a.q)) {
8419+
a.r;
8420+
console.log("FAIL");
8421+
}
8422+
} catch (e) {
8423+
console.log("PASS");
8424+
}
8425+
}
8426+
expect_stdout: "PASS"
8427+
}
8428+
8429+
issue_5872_3: {
8430+
options = {
8431+
pure_getters: "strict",
8432+
reduce_vars: true,
8433+
side_effects: true,
8434+
}
8435+
input: {
8436+
var a = 42;
8437+
try {
8438+
while (new function() {
8439+
a.p;
8440+
a = null;
8441+
}(a.q)) {
8442+
a.r;
8443+
console.log("FAIL");
8444+
}
8445+
} catch (e) {
8446+
console.log("PASS");
8447+
}
8448+
}
8449+
expect: {
8450+
var a = 42;
8451+
try {
8452+
while (new function() {
8453+
a.p;
8454+
a = null;
8455+
}(a.q)) {
8456+
a.r;
8457+
console.log("FAIL");
8458+
}
8459+
} catch (e) {
8460+
console.log("PASS");
8461+
}
8462+
}
8463+
expect_stdout: "PASS"
8464+
}

0 commit comments

Comments
 (0)
Please sign in to comment.