Skip to content

Commit 862b1b7

Browse files
authored
fix corner cases in merge_vars & with exports (#4762)
fixes #4761
1 parent b4944a3 commit 862b1b7

File tree

4 files changed

+42
-11
lines changed

4 files changed

+42
-11
lines changed

lib/compress.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5605,21 +5605,25 @@ merge(Compressor.prototype, {
56055605
}
56065606

56075607
function mark(sym, read) {
5608-
if (in_try) push();
5609-
var def = sym.definition(), ldef;
5608+
var def = sym.definition(), ldef, seg = segment;
5609+
if (in_try) {
5610+
push();
5611+
seg = segment;
5612+
pop();
5613+
}
56105614
if (def.id in references) {
56115615
var refs = references[def.id];
56125616
if (!refs) return;
5613-
if (refs.start.block !== segment.block) return references[def.id] = false;
5617+
if (refs.start.block !== seg.block) return references[def.id] = false;
56145618
refs.push(sym);
5615-
refs.end = segment;
5619+
refs.end = seg;
56165620
if (def.id in prev) {
56175621
last[prev[def.id]] = null;
56185622
} else if (!read) {
56195623
return;
56205624
}
56215625
} else if ((ldef = self.variables.get(def.name)) !== def) {
5622-
if (ldef && root === segment) references[ldef.id] = false;
5626+
if (ldef && root === seg) references[ldef.id] = false;
56235627
return references[def.id] = false;
56245628
} else if (compressor.exposed(def) || NO_MERGE[sym.name]) {
56255629
return references[def.id] = false;
@@ -5628,13 +5632,13 @@ merge(Compressor.prototype, {
56285632
refs.push(sym);
56295633
references[def.id] = refs;
56305634
if (!read) {
5631-
refs.start = segment;
5635+
refs.start = seg;
56325636
return first.push({
56335637
index: index++,
56345638
definition: def,
56355639
});
56365640
}
5637-
if (segment.block !== self) return references[def.id] = false;
5641+
if (seg.block !== self) return references[def.id] = false;
56385642
refs.start = root;
56395643
}
56405644
prev[def.id] = last.length;

lib/parse.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,14 +1504,14 @@ function parse($TEXT, options) {
15041504
}
15051505

15061506
function export_default_decl() {
1507-
switch (S.token.value) {
1508-
case "async":
1507+
if (is("name", "async")) {
15091508
if (!is_token(peek(), "keyword", "function")) return;
15101509
next();
15111510
next();
15121511
if (!is("operator", "*")) return maybe_named(AST_AsyncDefun, function_(AST_AsyncFunction));
15131512
next();
15141513
return maybe_named(AST_AsyncGeneratorDefun, function_(AST_AsyncGeneratorFunction));
1514+
} else if (is("keyword")) switch (S.token.value) {
15151515
case "class":
15161516
next();
15171517
return maybe_named(AST_DefClass, class_(AST_ClassExpression));
@@ -1524,13 +1524,13 @@ function parse($TEXT, options) {
15241524
}
15251525

15261526
var export_decl = embed_tokens(function() {
1527-
switch (S.token.value) {
1528-
case "async":
1527+
if (is("name", "async")) {
15291528
next();
15301529
expect_token("keyword", "function");
15311530
if (!is("operator", "*")) return function_(AST_AsyncDefun);
15321531
next();
15331532
return function_(AST_AsyncGeneratorDefun);
1533+
} else if (is("keyword")) switch (S.token.value) {
15341534
case "class":
15351535
next();
15361536
return class_(AST_DefClass);

test/compress/exports.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,3 +457,10 @@ issue_4742_unused_2: {
457457
a = "bar";
458458
}
459459
}
460+
461+
issue_4761: {
462+
input: {
463+
export default "function" == 42;
464+
}
465+
expect_exact: 'export default"function"==42;'
466+
}

test/compress/merge_vars.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3281,3 +3281,23 @@ issue_4759: {
32813281
}
32823282
expect_stdout: "undefined"
32833283
}
3284+
3285+
issue_4761: {
3286+
options = {
3287+
merge_vars: true,
3288+
toplevel: true,
3289+
}
3290+
input: {
3291+
var a = "FAIL", b;
3292+
try {
3293+
!a && --a && (b = 0)[console] || console.log(b);
3294+
} catch (e) {}
3295+
}
3296+
expect: {
3297+
var a = "FAIL", b;
3298+
try {
3299+
!a && --a && (b = 0)[console] || console.log(b);
3300+
} catch (e) {}
3301+
}
3302+
expect_stdout: "undefined"
3303+
}

0 commit comments

Comments
 (0)