introduce "strict" to pure_getters (#1795)

This commit is contained in:
Alex Lam S.L
2017-04-07 13:31:58 +08:00
committed by GitHub
parent 281e882d27
commit 0f4cd73dcc
4 changed files with 59 additions and 16 deletions

View File

@@ -411,6 +411,8 @@ to set `true`; it's effectively a shortcut for `foo=true`).
- `pure_getters` -- the default is `false`. If you pass `true` for - `pure_getters` -- the default is `false`. If you pass `true` for
this, UglifyJS will assume that object property access this, UglifyJS will assume that object property access
(e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects. (e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
`foo` is certain to not throw, i.e. not `null` or `undefined`.
- `pure_funcs` -- default `null`. You can pass an array of names and - `pure_funcs` -- default `null`. You can pass an array of names and
UglifyJS will assume that those functions do not produce side UglifyJS will assume that those functions do not produce side

View File

@@ -71,7 +71,7 @@ function Compressor(options, false_by_default) {
negate_iife : !false_by_default, negate_iife : !false_by_default,
passes : 1, passes : 1,
properties : !false_by_default, properties : !false_by_default,
pure_getters : false, pure_getters : !false_by_default && "strict",
pure_funcs : null, pure_funcs : null,
reduce_vars : !false_by_default, reduce_vars : !false_by_default,
screw_ie8 : true, screw_ie8 : true,
@@ -1165,7 +1165,13 @@ merge(Compressor.prototype, {
// may_eq_null() // may_eq_null()
// returns true if this node may evaluate to null or undefined // returns true if this node may evaluate to null or undefined
(function(def) { (function(def) {
def(AST_Node, return_true); function is_strict(compressor) {
return /strict/.test(compressor.option("pure_getters"));
}
def(AST_Node, function(compressor) {
return !is_strict(compressor);
});
def(AST_Null, return_true); def(AST_Null, return_true);
def(AST_Undefined, return_true); def(AST_Undefined, return_true);
def(AST_Constant, return_false); def(AST_Constant, return_false);
@@ -1198,12 +1204,9 @@ merge(Compressor.prototype, {
def(AST_Seq, function(compressor) { def(AST_Seq, function(compressor) {
return this.cdr.may_eq_null(compressor); return this.cdr.may_eq_null(compressor);
}); });
def(AST_PropAccess, function(compressor) {
return !compressor.option("unsafe");
});
def(AST_SymbolRef, function(compressor) { def(AST_SymbolRef, function(compressor) {
if (this.is_undefined) return true; if (this.is_undefined) return true;
if (compressor.option("unsafe")) return false; if (!is_strict(compressor)) return false;
var fixed = this.fixed_value(); var fixed = this.fixed_value();
return !fixed || fixed.may_eq_null(compressor); return !fixed || fixed.may_eq_null(compressor);
}); });

View File

@@ -1,10 +1,9 @@
side_effects: { strict: {
options = { options = {
pure_getters: true, pure_getters: "strict",
reduce_vars: false, reduce_vars: false,
side_effects: true, side_effects: true,
toplevel: true, toplevel: true,
unsafe: false,
} }
input: { input: {
var a, b = null, c = {}; var a, b = null, c = {};
@@ -28,13 +27,12 @@ side_effects: {
} }
} }
side_effects_reduce_vars: { strict_reduce_vars: {
options = { options = {
pure_getters: true, pure_getters: "strict",
reduce_vars: true, reduce_vars: true,
side_effects: true, side_effects: true,
toplevel: true, toplevel: true,
unsafe: false,
} }
input: { input: {
var a, b = null, c = {}; var a, b = null, c = {};
@@ -57,13 +55,38 @@ side_effects_reduce_vars: {
} }
} }
side_effects_unsafe: { unsafe: {
options = { options = {
pure_getters: true, pure_getters: true,
reduce_vars: false, reduce_vars: false,
side_effects: true, side_effects: true,
toplevel: true, toplevel: true,
unsafe: true, }
input: {
var a, b = null, c = {};
a.prop;
b.prop;
c.prop;
d.prop;
null.prop;
(void 0).prop;
undefined.prop;
}
expect: {
var a, b = null, c = {};
d;
null.prop;
(void 0).prop;
(void 0).prop;
}
}
unsafe_reduce_vars: {
options = {
pure_getters: true,
reduce_vars: true,
side_effects: true,
toplevel: true,
} }
input: { input: {
var a, b = null, c = {}; var a, b = null, c = {};

View File

@@ -1919,7 +1919,7 @@ side_effects_assign: {
pure_getters_1: { pure_getters_1: {
options = { options = {
pure_getters: true, pure_getters: "strict",
reduce_vars: true, reduce_vars: true,
side_effects: true, side_effects: true,
toplevel: true, toplevel: true,
@@ -1941,7 +1941,7 @@ pure_getters_1: {
pure_getters_2: { pure_getters_2: {
options = { options = {
pure_getters: true, pure_getters: "strict",
reduce_vars: true, reduce_vars: true,
toplevel: true, toplevel: true,
unused: true, unused: true,
@@ -1956,6 +1956,21 @@ pure_getters_2: {
} }
} }
pure_getters_3: {
options = {
pure_getters: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
var a;
var a = a && a.b;
}
expect: {
}
}
catch_var: { catch_var: {
options = { options = {
booleans: true, booleans: true,