diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-06-01 04:33:05 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-01 04:33:05 +0800 |
commit | ec095ed647691b3458ec9e65e89ff92d5151abc4 (patch) | |
tree | 60cf1f1d92938bbcbb3d02b9ea562ad259727755 /lib | |
parent | 17e73121fa641c14fd9f4cdd3310bf3e8ec037d0 (diff) | |
download | tracifyjs-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.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); })); } |