aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralexlamsl <alexlamsl@gmail.com>2017-02-18 19:34:54 +0800
committeralexlamsl <alexlamsl@gmail.com>2017-02-21 13:29:58 +0800
commitec64acd2c8d8573abd5b77f8f8946767444841bb (patch)
tree73f4bbbfe5298777ae1ef19ae711d2c9dacb60dd
parentac0b61ed6e1bce4794100c5bb83f6e5b22996d8a (diff)
downloadtracifyjs-ec64acd2c8d8573abd5b77f8f8946767444841bb.tar.gz
tracifyjs-ec64acd2c8d8573abd5b77f8f8946767444841bb.zip
introduce `unsafe_proto`
- `Array.prototype.slice` => `[].slice` closes #1491
-rw-r--r--README.md3
-rw-r--r--lib/compress.js23
-rw-r--r--test/compress/properties.js16
3 files changed, 42 insertions, 0 deletions
diff --git a/README.md b/README.md
index 1d1f2fcb..06ffa0e8 100644
--- a/README.md
+++ b/README.md
@@ -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");
+ }
+}