aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-02-18 18:04:33 +0000
committerGitHub <noreply@github.com>2021-02-19 02:04:33 +0800
commit10de27ca3d2010f45a1fb86b2707fa82e73b36b2 (patch)
tree71622ee56844fba68a0b57f52ea263f3092b39e2
parent7b4fd858ba23e6c1402ad33d8cc4a8a8e7966614 (diff)
downloadtracifyjs-10de27ca3d2010f45a1fb86b2707fa82e73b36b2.tar.gz
tracifyjs-10de27ca3d2010f45a1fb86b2707fa82e73b36b2.zip
fix corner case in `reduce_vars` (#4665)
fixes #4664
-rwxr-xr-xbin/uglifyjs8
-rw-r--r--lib/compress.js6
-rw-r--r--test/compress/exponentiation.js28
3 files changed, 36 insertions, 6 deletions
diff --git a/bin/uglifyjs b/bin/uglifyjs
index c2576ba0..60335426 100755
--- a/bin/uglifyjs
+++ b/bin/uglifyjs
@@ -10,7 +10,7 @@ var info = require("../package.json");
var path = require("path");
var UglifyJS = require("../tools/node");
-var skip_keys = [ "cname", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
+var skip_keys = [ "cname", "fixed", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
var files = {};
var options = {};
var short_forms = {
@@ -360,14 +360,14 @@ function run() {
}
print(JSON.stringify(result.ast, function(key, value) {
if (value) switch (key) {
- case "thedef":
- return symdef(value);
case "enclosed":
return value.length ? value.map(symdef) : undefined;
- case "variables":
case "functions":
case "globals":
+ case "variables":
return value.size() ? value.map(symdef) : undefined;
+ case "thedef":
+ return symdef(value);
}
if (skip_key(key)) return;
if (value instanceof UglifyJS.AST_Token) return;
diff --git a/lib/compress.js b/lib/compress.js
index a58e2816..325c0cd0 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -757,7 +757,9 @@ merge(Compressor.prototype, {
var value = iife.args[i];
scan_declaration(tw, compressor, arg, function() {
var j = fn.argnames.indexOf(arg);
- return (j < 0 ? value : iife.args[j]) || make_node(AST_Undefined, iife);
+ var arg = j < 0 ? value : iife.args[j];
+ if (arg instanceof AST_Sequence && arg.expressions.length < 2) arg = arg.expressions[0];
+ return arg || make_node(AST_Undefined, iife);
}, visit);
});
if (fn.rest) scan_declaration(tw, compressor, fn.rest, compressor.option("rests") && function() {
@@ -3644,7 +3646,7 @@ merge(Compressor.prototype, {
// methods to determine if an expression has a numeric result type
(function(def) {
def(AST_Node, return_false);
- var binary = makePredicate("- * / % & | ^ << >> >>>");
+ var binary = makePredicate("- * / % ** & | ^ << >> >>>");
def(AST_Assign, function(compressor) {
return binary[this.operator.slice(0, -1)]
|| this.operator == "=" && this.right.is_number(compressor);
diff --git a/test/compress/exponentiation.js b/test/compress/exponentiation.js
index 008d5871..b6cfde51 100644
--- a/test/compress/exponentiation.js
+++ b/test/compress/exponentiation.js
@@ -56,3 +56,31 @@ evaluate: {
expect_stdout: "5"
node_version: ">=8"
}
+
+issue_4664: {
+ options = {
+ collapse_vars: true,
+ evaluate: true,
+ reduce_vars: true,
+ side_effects: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ function f() {
+ new function(a) {
+ console.log(typeof f, a, typeof this);
+ }((A = 0, (NaN ^ 1) * 2 ** 30), 0);
+ }
+ f();
+ }
+ expect: {
+ (function f() {
+ new function(a) {
+ console.log(typeof f, 2 ** 30, typeof this);
+ }(0, A = 0);
+ })();
+ }
+ expect_stdout: "function 1073741824 object"
+ node_version: ">=8"
+}