aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-06-01 04:33:05 +0800
committerGitHub <noreply@github.com>2017-06-01 04:33:05 +0800
commitec095ed647691b3458ec9e65e89ff92d5151abc4 (patch)
tree60cf1f1d92938bbcbb3d02b9ea562ad259727755 /lib
parent17e73121fa641c14fd9f4cdd3310bf3e8ec037d0 (diff)
downloadtracifyjs-ec095ed647691b3458ec9e65e89ff92d5151abc4.tar.gz
tracifyjs-ec095ed647691b3458ec9e65e89ff92d5151abc4.zip
whitelist `unsafe` `evaluate` candidates (#2039)
- all arguments may accept constant values - return constant value - free of side effects - available & identical across locales and runtime environments
Diffstat (limited to 'lib')
-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);
}));
}