diff options
Diffstat (limited to 'lib/compress.js')
-rw-r--r-- | lib/compress.js | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/lib/compress.js b/lib/compress.js index a928d7b7..71cffcee 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1665,6 +1665,44 @@ merge(Compressor.prototype, { } throw def; }); + var object_fns = [ + 'constructor', + 'toString', + 'valueOf', + ]; + var native_fns = { + Array: makePredicate([ + 'indexOf', + 'join', + 'lastIndexOf', + 'slice', + ].concat(object_fns)), + Boolean: makePredicate(object_fns), + Number: makePredicate([ + 'toExponential', + 'toFixed', + 'toPrecision', + ].concat(object_fns)), + RegExp: makePredicate([ + 'test', + ].concat(object_fns)), + String: makePredicate([ + 'charAt', + 'charCodeAt', + 'concat', + 'indexOf', + 'italics', + 'lastIndexOf', + 'match', + 'replace', + 'search', + 'slice', + 'split', + 'substr', + 'substring', + 'trim', + ].concat(object_fns)), + }; def(AST_Call, function(compressor){ var exp = this.expression; if (compressor.option("unsafe") && exp instanceof AST_PropAccess) { @@ -1673,9 +1711,8 @@ merge(Compressor.prototype, { key = ev(key, compressor); } var val = ev(exp.expression, compressor); - var fn = val[key]; - if (typeof fn == "function") { - return fn.apply(val, this.args.map(function(arg) { + if ((val && native_fns[val.constructor.name] || return_false)(key)) { + return val[key].apply(val, this.args.map(function(arg) { return ev(arg, compressor); })); } |