aboutsummaryrefslogtreecommitdiff
path: root/lib/compress.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compress.js')
-rw-r--r--lib/compress.js43
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);
}));
}