diff --git a/lib/compress.js b/lib/compress.js index 5f1d63ff..f683e874 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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; })) { diff --git a/test/compress/merge_vars.js b/test/compress/merge_vars.js index 0494acfb..dc526c5f 100644 --- a/test/compress/merge_vars.js +++ b/test/compress/merge_vars.js @@ -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" +} diff --git a/test/sandbox.js b/test/sandbox.js index edebcabe..c0e9e09b 100644 --- a/test/sandbox.js +++ b/test/sandbox.js @@ -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);