introduce unsafe_proto

- `Array.prototype.slice` => `[].slice`

closes #1491
This commit is contained in:
alexlamsl
2017-02-18 19:34:54 +08:00
parent ac0b61ed6e
commit ec64acd2c8
3 changed files with 42 additions and 0 deletions

View File

@@ -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

View File

@@ -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];
});

View File

@@ -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");
}
}