fix unsafe evaluate of function property (#2927)

fixes #2926
This commit is contained in:
Alex Lam S.L
2018-02-17 21:33:36 +08:00
committed by GitHub
parent 7fdd2082a6
commit 82d1ef0242
2 changed files with 44 additions and 2 deletions

View File

@@ -2232,6 +2232,7 @@ merge(Compressor.prototype, {
"slice", "slice",
].concat(object_fns), ].concat(object_fns),
Boolean: object_fns, Boolean: object_fns,
Function: object_fns,
Number: [ Number: [
"toExponential", "toExponential",
"toFixed", "toFixed",
@@ -2340,10 +2341,10 @@ merge(Compressor.prototype, {
}); });
def(AST_Function, function(compressor) { def(AST_Function, function(compressor) {
if (compressor.option("unsafe")) { if (compressor.option("unsafe")) {
var node = this;
var fn = function() {}; var fn = function() {};
fn.node = this;
fn.toString = function() { fn.toString = function() {
return node.print_to_string(); return this.node.print_to_string();
}; };
return fn; return fn;
} }
@@ -2523,6 +2524,14 @@ merge(Compressor.prototype, {
} else { } else {
val = exp._eval(compressor, depth + 1); val = exp._eval(compressor, depth + 1);
if (!val || val === exp || !HOP(val, key)) return this; 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]; return val[key];
} }

View File

@@ -1502,3 +1502,36 @@ issue_2919: {
console.log("function(){}"); 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"
}