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
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,
})
}).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];
});
};
}
}
+
+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");
+ }
+}