From a2a9459684462224a93710631dcc29624d010e21 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 16 Feb 2018 17:21:46 +0800 Subject: [PATCH] fix `unsafe` `evaluate` of `AST_Function` (#2920) fixes #2919 --- lib/compress.js | 19 ++++++++++++++----- test/compress/evaluate.js | 13 +++++++++++++ test/compress/reduce_vars.js | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index c9fe8a14..65895bb7 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2313,7 +2313,9 @@ merge(Compressor.prototype, { AST_Node.DEFMETHOD("evaluate", function(compressor){ if (!compressor.option("evaluate")) return this; var val = this._eval(compressor, 1); - return !val || val instanceof RegExp || typeof val != "object" ? val : this; + if (!val || val instanceof RegExp) return val; + if (typeof val == "function" || typeof val == "object") return this; + return val; }); var unaryPrefix = makePredicate("! ~ - + void"); AST_Node.DEFMETHOD("is_constant", function(){ @@ -2335,15 +2337,22 @@ merge(Compressor.prototype, { def(AST_Constant, function(){ return this.getValue(); }); + def(AST_Function, function(compressor) { + if (compressor.option("unsafe")) { + var node = this; + var fn = function() {}; + fn.toString = function() { + return node.print_to_string(); + }; + return fn; + } + return this; + }); def(AST_Array, function(compressor, depth) { if (compressor.option("unsafe")) { var elements = []; for (var i = 0, len = this.elements.length; i < len; i++) { var element = this.elements[i]; - if (element instanceof AST_Function) { - elements.push(element); - continue; - } var value = element._eval(compressor, depth); if (element === value) return this; elements.push(value); diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 3ac62ef5..2294ca01 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -1489,3 +1489,16 @@ issue_2916_2: { } expect_stdout: "PASS" } + +issue_2919: { + options = { + evaluate: true, + unsafe: true, + } + input: { + console.log([ function() {} ].toString()); + } + expect: { + console.log("function(){}"); + } +} diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index f916e54b..836d7fe2 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -5527,3 +5527,21 @@ issue_2869: { } expect_stdout: "PASS" } + +issue_2919: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + unsafe: true, + unused: true, + } + input: { + var arr = [ function() {} ]; + console.log(typeof arr[0]); + } + expect: { + console.log("function"); + } + expect_stdout: "function" +} -- 2.34.1