From: Alex Lam S.L Date: Sat, 11 May 2019 10:55:45 +0000 (+0800) Subject: fix corner case in `functions` (#3403) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=9fc8cd40763467d8b256be00380965268b7afcfd;p=UglifyJS.git fix corner case in `functions` (#3403) fixes #3402 --- diff --git a/lib/compress.js b/lib/compress.js index 418b1d54..b63c0512 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3682,6 +3682,7 @@ merge(Compressor.prototype, { } else if (compressor.option("functions") && def.value === def.name.fixed_value() && def.value instanceof AST_Function + && !(def.value.name && def.value.name.definition().assignments) && can_rename(def.value, def.name.name) && (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) { AST_Node.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name)); @@ -6301,6 +6302,13 @@ merge(Compressor.prototype, { expression: self.left }); } + if (!compressor.option("ie8") && self.left instanceof AST_Symbol && self.left.is_immutable()) { + return (self.operator == "=" ? self.right : make_node(AST_Binary, self, { + operator: self.operator.slice(0, -1), + left: self.left, + right: self.right + })).optimize(compressor); + } return self; function in_try(level, node) { diff --git a/test/compress/assignment.js b/test/compress/assignment.js index ece0185d..191b892e 100644 --- a/test/compress/assignment.js +++ b/test/compress/assignment.js @@ -311,3 +311,39 @@ issue_3375: { } expect_stdout: "string" } + +issue_3402: { + options = { + assignments: true, + evaluate: true, + functions: true, + passes: 2, + reduce_vars: true, + side_effects: true, + toplevel: true, + typeofs: true, + unused: true, + } + input: { + var f = function f() { + f = 42; + console.log(typeof f); + }; + "function" == typeof f && f(); + "function" == typeof f && f(); + console.log(typeof f); + } + expect: { + function f() { + console.log(typeof f); + } + f(); + f(); + console.log(typeof f); + } + expect_stdout: [ + "function", + "function", + "function", + ] +} diff --git a/test/compress/functions.js b/test/compress/functions.js index 21146457..82295383 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -3113,3 +3113,38 @@ issue_3400: { "42", ] } + +issue_3402: { + options = { + evaluate: true, + functions: true, + reduce_vars: true, + side_effects: true, + toplevel: true, + typeofs: true, + unused: true, + } + input: { + var f = function f() { + f = 42; + console.log(typeof f); + }; + "function" == typeof f && f(); + "function" == typeof f && f(); + console.log(typeof f); + } + expect: { + var f = function f() { + f = 42; + console.log(typeof f); + }; + f(); + f(); + console.log(typeof f); + } + expect_stdout: [ + "function", + "function", + "function", + ] +}