diff options
author | alexlamsl <alexlamsl@gmail.com> | 2017-02-18 19:34:54 +0800 |
---|---|---|
committer | alexlamsl <alexlamsl@gmail.com> | 2017-02-21 13:29:58 +0800 |
commit | ec64acd2c8d8573abd5b77f8f8946767444841bb (patch) | |
tree | 73f4bbbfe5298777ae1ef19ae711d2c9dacb60dd | |
parent | ac0b61ed6e1bce4794100c5bb83f6e5b22996d8a (diff) | |
download | tracifyjs-ec64acd2c8d8573abd5b77f8f8946767444841bb.tar.gz tracifyjs-ec64acd2c8d8573abd5b77f8f8946767444841bb.zip |
introduce `unsafe_proto`
- `Array.prototype.slice` => `[].slice`
closes #1491
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | lib/compress.js | 23 | ||||
-rw-r--r-- | test/compress/properties.js | 16 |
3 files changed, 42 insertions, 0 deletions
@@ -346,6 +346,9 @@ to set `true`; it's effectively a shortcut for `foo=true`). comparison are switching. Compression only works if both `comparisons` and `unsafe_comps` are both set to true. +- `unsafe_proto` (default: false) -- optimize expressions like + `Array.prototype.slice.call(a)` into `[].slice.call(a)` + - `conditionals` -- apply optimizations for `if`-s and conditional expressions diff --git a/lib/compress.js b/lib/compress.js index cb99a173..237af72c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -54,6 +54,7 @@ function Compressor(options, false_by_default) { drop_debugger : !false_by_default, unsafe : false, unsafe_comps : false, + unsafe_proto : false, conditionals : !false_by_default, comparisons : !false_by_default, evaluate : !false_by_default, @@ -3148,6 +3149,28 @@ merge(Compressor.prototype, { }) }).optimize(compressor); } + if (compressor.option("unsafe_proto") + && self.expression instanceof AST_Dot + && self.expression.property == "prototype") { + var exp = self.expression.expression; + if (exp instanceof AST_SymbolRef && exp.undeclared()) switch (exp.name) { + case "Array": + self.expression = make_node(AST_Array, self.expression, { + elements: [] + }); + break; + case "Object": + self.expression = make_node(AST_Object, self.expression, { + properties: [] + }); + break; + case "String": + self.expression = make_node(AST_String, self.expression, { + value: "" + }); + break; + } + } return self.evaluate(compressor)[0]; }); diff --git a/test/compress/properties.js b/test/compress/properties.js index 7ad54ebe..29bdfe2a 100644 --- a/test/compress/properties.js +++ b/test/compress/properties.js @@ -539,3 +539,19 @@ first_256_hex_chars_as_properties: { }; } } + +native_prototype: { + options = { + unsafe_proto: true, + } + input: { + Array.prototype.splice.apply(a, [1, 2, b, c]); + Object.prototype.hasOwnProperty.call(d, "foo"); + String.prototype.indexOf.call(e, "bar"); + } + expect: { + [].splice.apply(a, [1, 2, b, c]); + ({}).hasOwnProperty.call(d, "foo"); + "".indexOf.call(e, "bar"); + } +} |