Skip to content

Commit

Permalink
fix corner cases in merge_vars & with exports (#4762)
Browse files Browse the repository at this point in the history
fixes #4761
  • Loading branch information
alexlamsl authored Mar 11, 2021
1 parent b4944a3 commit 862b1b7
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 11 deletions.
18 changes: 11 additions & 7 deletions lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -5605,21 +5605,25 @@ merge(Compressor.prototype, {
}

function mark(sym, read) {
if (in_try) push();
var def = sym.definition(), ldef;
var def = sym.definition(), ldef, seg = segment;
if (in_try) {
push();
seg = segment;
pop();
}
if (def.id in references) {
var refs = references[def.id];
if (!refs) return;
if (refs.start.block !== segment.block) return references[def.id] = false;
if (refs.start.block !== seg.block) return references[def.id] = false;
refs.push(sym);
refs.end = segment;
refs.end = seg;
if (def.id in prev) {
last[prev[def.id]] = null;
} else if (!read) {
return;
}
} else if ((ldef = self.variables.get(def.name)) !== def) {
if (ldef && root === segment) references[ldef.id] = false;
if (ldef && root === seg) references[ldef.id] = false;
return references[def.id] = false;
} else if (compressor.exposed(def) || NO_MERGE[sym.name]) {
return references[def.id] = false;
Expand All @@ -5628,13 +5632,13 @@ merge(Compressor.prototype, {
refs.push(sym);
references[def.id] = refs;
if (!read) {
refs.start = segment;
refs.start = seg;
return first.push({
index: index++,
definition: def,
});
}
if (segment.block !== self) return references[def.id] = false;
if (seg.block !== self) return references[def.id] = false;
refs.start = root;
}
prev[def.id] = last.length;
Expand Down
8 changes: 4 additions & 4 deletions lib/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -1504,14 +1504,14 @@ function parse($TEXT, options) {
}

function export_default_decl() {
switch (S.token.value) {
case "async":
if (is("name", "async")) {
if (!is_token(peek(), "keyword", "function")) return;
next();
next();
if (!is("operator", "*")) return maybe_named(AST_AsyncDefun, function_(AST_AsyncFunction));
next();
return maybe_named(AST_AsyncGeneratorDefun, function_(AST_AsyncGeneratorFunction));
} else if (is("keyword")) switch (S.token.value) {
case "class":
next();
return maybe_named(AST_DefClass, class_(AST_ClassExpression));
Expand All @@ -1524,13 +1524,13 @@ function parse($TEXT, options) {
}

var export_decl = embed_tokens(function() {
switch (S.token.value) {
case "async":
if (is("name", "async")) {
next();
expect_token("keyword", "function");
if (!is("operator", "*")) return function_(AST_AsyncDefun);
next();
return function_(AST_AsyncGeneratorDefun);
} else if (is("keyword")) switch (S.token.value) {
case "class":
next();
return class_(AST_DefClass);
Expand Down
7 changes: 7 additions & 0 deletions test/compress/exports.js
Original file line number Diff line number Diff line change
Expand Up @@ -457,3 +457,10 @@ issue_4742_unused_2: {
a = "bar";
}
}

issue_4761: {
input: {
export default "function" == 42;
}
expect_exact: 'export default"function"==42;'
}
20 changes: 20 additions & 0 deletions test/compress/merge_vars.js
Original file line number Diff line number Diff line change
Expand Up @@ -3281,3 +3281,23 @@ issue_4759: {
}
expect_stdout: "undefined"
}

issue_4761: {
options = {
merge_vars: true,
toplevel: true,
}
input: {
var a = "FAIL", b;
try {
!a && --a && (b = 0)[console] || console.log(b);
} catch (e) {}
}
expect: {
var a = "FAIL", b;
try {
!a && --a && (b = 0)[console] || console.log(b);
} catch (e) {}
}
expect_stdout: "undefined"
}

0 comments on commit 862b1b7

Please sign in to comment.