diff options
-rw-r--r-- | lib/compress.js | 13 | ||||
-rw-r--r-- | test/compress/evaluate.js | 33 |
2 files changed, 44 insertions, 2 deletions
diff --git a/lib/compress.js b/lib/compress.js index 08248309..f8e9f916 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2232,6 +2232,7 @@ merge(Compressor.prototype, { "slice", ].concat(object_fns), Boolean: object_fns, + Function: object_fns, Number: [ "toExponential", "toFixed", @@ -2340,10 +2341,10 @@ merge(Compressor.prototype, { }); def(AST_Function, function(compressor) { if (compressor.option("unsafe")) { - var node = this; var fn = function() {}; + fn.node = this; fn.toString = function() { - return node.print_to_string(); + return this.node.print_to_string(); }; return fn; } @@ -2523,6 +2524,14 @@ merge(Compressor.prototype, { } else { val = exp._eval(compressor, depth + 1); if (!val || val === exp || !HOP(val, key)) return this; + if (typeof val == "function") switch (key) { + case "name": + return val.node.name ? val.node.name.name : ""; + case "length": + return val.node.argnames.length; + default: + return this; + } } return val[key]; } diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 2294ca01..614020ea 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -1502,3 +1502,36 @@ issue_2919: { console.log("function(){}"); } } + +issue_2926_1: { + options = { + evaluate: true, + reduce_vars: true, + unsafe: true, + } + input: { + (function f(a) { + console.log(f.name.length, f.length); + })(); + } + expect: { + (function f(a) { + console.log(1, 1); + })(); + } + expect_stdout: "1 1" +} + +issue_2926_2: { + options = { + evaluate: true, + unsafe: true, + } + input: { + console.log(typeof function() {}.valueOf()); + } + expect: { + console.log("function"); + } + expect_stdout: "function" +} |