introduce unsafe_proto
- `Array.prototype.slice` => `[].slice` closes #1491
This commit is contained in:
@@ -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
|
comparison are switching. Compression only works if both `comparisons` and
|
||||||
`unsafe_comps` are both set to true.
|
`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
|
- `conditionals` -- apply optimizations for `if`-s and conditional
|
||||||
expressions
|
expressions
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ function Compressor(options, false_by_default) {
|
|||||||
drop_debugger : !false_by_default,
|
drop_debugger : !false_by_default,
|
||||||
unsafe : false,
|
unsafe : false,
|
||||||
unsafe_comps : false,
|
unsafe_comps : false,
|
||||||
|
unsafe_proto : false,
|
||||||
conditionals : !false_by_default,
|
conditionals : !false_by_default,
|
||||||
comparisons : !false_by_default,
|
comparisons : !false_by_default,
|
||||||
evaluate : !false_by_default,
|
evaluate : !false_by_default,
|
||||||
@@ -3148,6 +3149,28 @@ merge(Compressor.prototype, {
|
|||||||
})
|
})
|
||||||
}).optimize(compressor);
|
}).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];
|
return self.evaluate(compressor)[0];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user