aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js19
-rw-r--r--test/compress/evaluate.js13
-rw-r--r--test/compress/reduce_vars.js18
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"
+}