Skip to content

Commit

Permalink
fix corner case in merge_vars (#4957)
Browse files Browse the repository at this point in the history
fixes #4956
  • Loading branch information
alexlamsl committed May 24, 2021
1 parent 8b0c836 commit eb08fed
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -5789,7 +5789,7 @@ merge(Compressor.prototype, {
if (!tail_refs) continue;
if (head_refs.start.block !== tail_refs.start.block
|| !mergeable(head_refs, tail_refs)
|| head_refs.start.loop && !mergeable(tail_refs, head_refs)
|| (head_refs.start.loop || !same_scope(def)) && !mergeable(tail_refs, head_refs)
|| !all(tail_refs, function(sym) {
return sym.scope.find_variable(def.name) === def;
})) {
Expand Down
77 changes: 77 additions & 0 deletions test/compress/merge_vars.js
Original file line number Diff line number Diff line change
Expand Up @@ -3301,3 +3301,80 @@ issue_4761: {
}
expect_stdout: "undefined"
}

issue_4956_1: {
options = {
merge_vars: true,
toplevel: true,
}
input: {
var a, b;
function f(c) {
switch (c) {
case 0:
a = { p: 42 };

case 1:
b = a.p;
console.log(b);
}
}
f(0);
f(1);
}
expect: {
var a, b;
function f(c) {
switch (c) {
case 0:
a = { p: 42 };

case 1:
b = a.p;
console.log(b);
}
}
f(0);
f(1);
}
expect_stdout: [
"42",
"42",
]
}

issue_4956_2: {
options = {
merge_vars: true,
toplevel: true,
}
input: {
var a, b;
function f(c) {
if (0 == c) {
console;
a = { p: 42 };
}
b = a.p;
if (1 == c)
console.log(b);
}
f(0);
f(1);
}
expect: {
var a, b;
function f(c) {
if (0 == c) {
console;
a = { p: 42 };
}
b = a.p;
if (1 == c)
console.log(b);
}
f(0);
f(1);
}
expect_stdout: "42"
}
2 changes: 1 addition & 1 deletion test/sandbox.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ exports.run_code = semver.satisfies(process.version, "0.8") ? function(code, top
} : semver.satisfies(process.version, "<0.12") ? run_code_vm : function(code, toplevel, timeout) {
if ([
/\basync[ \t]*\([\s\S]*?\)[ \t]*=>/,
/\b(async[ \t]+function|setImmediate|setInterval|setTimeout)\b/,
/\b(async[ \t]+function|Promise|setImmediate|setInterval|setTimeout)\b/,
/\basync([ \t]+|[ \t]*#|[ \t]*\*[ \t]*)[^\s()[\]{},.&|!~=*%/+-]+(\s*\(|[ \t]*=>)/,
].some(function(pattern) {
return pattern.test(code);
Expand Down

0 comments on commit eb08fed

Please sign in to comment.