From d3d1d11926de43fc1ec74ae3a4d24a884d80d91f Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Tue, 15 Oct 2019 07:27:02 +0800 Subject: fix corner case in `ie8` & `rename` (#3474) fixes #3473 --- lib/scope.js | 6 ++- test/compress/collapse_vars.js | 2 +- test/compress/functions.js | 2 +- test/compress/ie8.js | 108 +++++++++++++++++++++++++++++++++++++++++ test/exports.js | 1 + test/mocha/sourcemaps.js | 4 +- 6 files changed, 118 insertions(+), 5 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index 83df3fde..1b570515 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -192,7 +192,11 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) { // pass 3: fix up any scoping issue with IE8 if (options.ie8) self.walk(new TreeWalker(function(node) { if (node instanceof AST_SymbolCatch) { - redefine(node, node.thedef.defun); + var scope = node.thedef.defun; + if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) { + scope = scope.parent_scope; + } + redefine(node, scope); return true; } if (node instanceof AST_SymbolLambda) { diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 090f3cf8..2381333a 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -4388,7 +4388,7 @@ replace_all_var: { } replace_all_var_scope: { - rename = true; + rename = true options = { collapse_vars: true, unused: true, diff --git a/test/compress/functions.js b/test/compress/functions.js index f01a02e8..92a0f99c 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -1150,7 +1150,7 @@ issue_2620_3: { } issue_2620_4: { - rename = true, + rename = true options = { dead_code: true, evaluate: true, diff --git a/test/compress/ie8.js b/test/compress/ie8.js index 94b83de6..9fc2becd 100644 --- a/test/compress/ie8.js +++ b/test/compress/ie8.js @@ -1081,3 +1081,111 @@ issue_3471_ie8: { } expect_stdout: true } + +issue_3473: { + rename = true + mangle = { + ie8: false, + toplevel: false, + } + input: { + var d = 42, a = 100, b = 10, c = 0; + (function b() { + try { + c++; + } catch (b) {} + })(); + console.log(a, b, c); + } + expect: { + var d = 42, a = 100, b = 10, c = 0; + (function a() { + try { + c++; + } catch (a) {} + })(); + console.log(a, b, c); + } + expect_stdout: "100 10 1" +} + +issue_3473_ie8: { + rename = true + mangle = { + ie8: true, + toplevel: false, + } + input: { + var d = 42, a = 100, b = 10, c = 0; + (function b() { + try { + c++; + } catch (b) {} + })(); + console.log(a, b, c); + } + expect: { + var d = 42, a = 100, b = 10, c = 0; + (function b() { + try { + c++; + } catch (b) {} + })(); + console.log(a, b, c); + } + expect_stdout: "100 10 1" +} + +issue_3473_toplevel: { + rename = true + mangle = { + ie8: false, + toplevel: true, + } + input: { + var d = 42, a = 100, b = 10, c = 0; + (function b() { + try { + c++; + } catch (b) {} + })(); + console.log(a, b, c); + } + expect: { + var c = 42, o = 100, n = 10, t = 0; + (function c() { + try { + t++; + } catch (c) {} + })(); + console.log(o, n, t); + } + expect_stdout: "100 10 1" +} + +issue_3473_ie8_toplevel: { + rename = true + mangle = { + ie8: true, + toplevel: true, + } + input: { + var d = 42, a = 100, b = 10, c = 0; + (function b() { + try { + c++; + } catch (b) {} + })(); + console.log(a, b, c); + } + expect: { + var c = 42, o = 100, n = 10, t = 0; + (function n() { + try { + t++; + } catch (n) {} + })(); + console.log(o, n, t); + } + expect_stdout: "100 10 1" +} diff --git a/test/exports.js b/test/exports.js index 65a7362f..cb76d7e0 100644 --- a/test/exports.js +++ b/test/exports.js @@ -8,6 +8,7 @@ exports["parse"] = parse; exports["push_uniq"] = push_uniq; exports["reserve_quoted_keys"] = reserve_quoted_keys; exports["string_template"] = string_template; +exports["to_ascii"] = to_ascii; exports["tokenizer"] = tokenizer; exports["TreeTransformer"] = TreeTransformer; exports["TreeWalker"] = TreeWalker; diff --git a/test/mocha/sourcemaps.js b/test/mocha/sourcemaps.js index aff2b009..8457c865 100644 --- a/test/mocha/sourcemaps.js +++ b/test/mocha/sourcemaps.js @@ -1,7 +1,7 @@ var assert = require("assert"); var readFileSync = require("fs").readFileSync; var SourceMapConsumer = require("source-map").SourceMapConsumer; -var UglifyJS = require("../.."); +var UglifyJS = require("../node"); function read(path) { return readFileSync(path, "utf8"); @@ -244,7 +244,7 @@ describe("sourcemaps", function() { assert.strictEqual(map.sourcesContent.length, 1); assert.strictEqual(map.sourcesContent[0], code); var encoded = result.code.slice(result.code.lastIndexOf(",") + 1); - map = JSON.parse(new Buffer(encoded, "base64").toString()); + map = JSON.parse(UglifyJS.to_ascii(encoded)); assert.strictEqual(map.sourcesContent.length, 1); assert.strictEqual(map.sourcesContent[0], code); result = UglifyJS.minify(result.code, { -- cgit v1.2.3