Skip to content

Commit

Permalink
Remove the folding of "if (x === null)" to "if (!x)"'
Browse files Browse the repository at this point in the history
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142057565
  • Loading branch information
Dominator008 authored and blickly committed Dec 15, 2016
1 parent 911fdc8 commit 048511a
Show file tree
Hide file tree
Showing 10 changed files with 20 additions and 59 deletions.
8 changes: 0 additions & 8 deletions src/com/google/javascript/jscomp/CommandLineRunner.java
Expand Up @@ -409,12 +409,6 @@ private static class Flags {
+ "may result in incorrect results.")
private boolean useTypesForOptimization = true;

@Option(name = "--assume_accurate_null_undefined_types",
handler = BooleanOptionHandler.class,
usage = "Enables optimizations which rely on accurate distinction between null and "
+ "undefined types.")
private boolean assumeAccurateNullUndefinedTypes = false;

@Option(name = "--assume_function_wrapper",
handler = BooleanOptionHandler.class,
usage = "Enable additional optimizations based on the assumption that the output will be "
Expand Down Expand Up @@ -1567,8 +1561,6 @@ protected CompilerOptions createOptions() {
level.setTypeBasedOptimizationOptions(options);
}

options.setAssumeAccurateNullUndefinedTypes(flags.assumeAccurateNullUndefinedTypes);

if (flags.assumeFunctionWrapper) {
level.setWrappedOutputOptimizations(options);
}
Expand Down
1 change: 0 additions & 1 deletion src/com/google/javascript/jscomp/Compiler.java
Expand Up @@ -337,7 +337,6 @@ public void initOptions(CompilerOptions options) {
options.setInlineProperties(false);
options.setUseTypesForLocalOptimization(false);
options.setUseTypesForOptimization(false);
options.setAssumeAccurateNullUndefinedTypes(false);
}

if (options.legacyCodeCompile) {
Expand Down
10 changes: 0 additions & 10 deletions src/com/google/javascript/jscomp/CompilerOptions.java
Expand Up @@ -525,12 +525,6 @@ public enum ExtractPrototypeMemberDeclarationsMode {
/** Use type information to enable additional optimization opportunities. */
boolean useTypesForLocalOptimization;

/**
* Assume accurate distinction between null and undefined to enable additional optimization
* opportunities.
*/
boolean assumeAccurateNullUndefinedTypes;

//--------------------------------
// Renaming
//--------------------------------
Expand Down Expand Up @@ -2194,10 +2188,6 @@ public void setUseTypesForLocalOptimization(boolean useTypesForLocalOptimization
this.useTypesForLocalOptimization = useTypesForLocalOptimization;
}

public void setAssumeAccurateNullUndefinedTypes(boolean assumeAccurateNullUndefinedTypes) {
this.assumeAccurateNullUndefinedTypes = assumeAccurateNullUndefinedTypes;
}

@Deprecated
public void setUseTypesForOptimization(boolean useTypesForOptimization) {
if (useTypesForOptimization) {
Expand Down
9 changes: 3 additions & 6 deletions src/com/google/javascript/jscomp/DefaultPassConfig.java
Expand Up @@ -1543,12 +1543,10 @@ protected CompilerPass create(AbstractCompiler compiler) {
/** Various peephole optimizations. */
private static CompilerPass createPeepholeOptimizationsPass(AbstractCompiler compiler) {
final boolean late = false;
CompilerOptions options = compiler.getOptions();
final boolean useTypesForOptimization = options.useTypesForLocalOptimization;
final boolean useTypesForOptimization = compiler.getOptions().useTypesForLocalOptimization;
return new PeepholeOptimizationsPass(compiler,
new MinimizeExitPoints(compiler),
new PeepholeMinimizeConditions(
late, useTypesForOptimization, options.assumeAccurateNullUndefinedTypes),
new PeepholeMinimizeConditions(late, useTypesForOptimization),
new PeepholeSubstituteAlternateSyntax(late),
new PeepholeReplaceKnownMethods(late, useTypesForOptimization),
new PeepholeRemoveDeadCode(),
Expand Down Expand Up @@ -1584,8 +1582,7 @@ protected CompilerPass create(AbstractCompiler compiler) {
return new PeepholeOptimizationsPass(compiler,
new StatementFusion(options.aggressiveFusion),
new PeepholeRemoveDeadCode(),
new PeepholeMinimizeConditions(
late, useTypesForOptimization, options.assumeAccurateNullUndefinedTypes),
new PeepholeMinimizeConditions(late, useTypesForOptimization),
new PeepholeSubstituteAlternateSyntax(late),
new PeepholeReplaceKnownMethods(late, useTypesForOptimization),
new PeepholeFoldConstants(late, useTypesForOptimization),
Expand Down
6 changes: 2 additions & 4 deletions src/com/google/javascript/jscomp/ExpandJqueryAliases.java
Expand Up @@ -83,11 +83,9 @@ class ExpandJqueryAliases extends AbstractPostOrderCallback
// These passes should make the code easier to analyze.
// Passes, such as StatementFusion, are omitted for this reason.
final boolean late = false;
CompilerOptions options = compiler.getOptions();
boolean useTypesForOptimization = options.useTypesForLocalOptimization;
boolean useTypesForOptimization = compiler.getOptions().useTypesForLocalOptimization;
this.peepholePasses = new PeepholeOptimizationsPass(compiler,
new PeepholeMinimizeConditions(
late, useTypesForOptimization, options.assumeAccurateNullUndefinedTypes),
new PeepholeMinimizeConditions(late, useTypesForOptimization),
new PeepholeSubstituteAlternateSyntax(late),
new PeepholeReplaceKnownMethods(late, useTypesForOptimization),
new PeepholeRemoveDeadCode(),
Expand Down
12 changes: 3 additions & 9 deletions src/com/google/javascript/jscomp/PeepholeMinimizeConditions.java
Expand Up @@ -40,7 +40,6 @@ class PeepholeMinimizeConditions

private final boolean late;
private final boolean useTypes;
private final boolean assumeAccurateNullUndefinedTypes;

/**
* @param late When late is false, this mean we are currently running before
Expand All @@ -49,11 +48,9 @@ class PeepholeMinimizeConditions
* merging statements with commas, etc). When this is true, we would
* do anything to minimize for size.
*/
PeepholeMinimizeConditions(boolean late, boolean useTypes,
boolean assumeAccurateNullUndefinedTypes) {
PeepholeMinimizeConditions(boolean late, boolean useTypes) {
this.late = late;
this.useTypes = useTypes;
this.assumeAccurateNullUndefinedTypes = assumeAccurateNullUndefinedTypes;
}

/**
Expand Down Expand Up @@ -1074,7 +1071,7 @@ private enum BooleanCoercability {
RIGHT
}

private BooleanCoercability canConvertComparisonToBooleanCoercion(
private static BooleanCoercability canConvertComparisonToBooleanCoercion(
Node left, Node right, Token op) {
// Convert null or undefined check of an object to coercion.
boolean leftIsNull = left.isNull();
Expand All @@ -1088,10 +1085,7 @@ private BooleanCoercability canConvertComparisonToBooleanCoercion(
boolean rightIsObjectType = isObjectType(right);
if (op == Token.SHEQ || op == Token.SHNE) {
if ((leftIsObjectType && !left.getJSType().isNullable() && rightIsUndefined)
|| (rightIsObjectType && !right.getJSType().isNullable() && leftIsUndefined)
|| (assumeAccurateNullUndefinedTypes
&& ((leftIsObjectType && !left.getJSType().isVoidable() && rightIsNull)
|| (rightIsObjectType && !right.getJSType().isVoidable() && leftIsNull)))) {
|| (rightIsObjectType && !right.getJSType().isNullable() && leftIsUndefined)) {
return leftIsNullOrUndefined ? BooleanCoercability.RIGHT : BooleanCoercability.LEFT;
}
} else {
Expand Down
Expand Up @@ -46,8 +46,7 @@ public void process(Node externs, Node js) {
new MinimizeExitPoints(compiler).asCompilerPass().process(externs, js);
new PeepholeOptimizationsPass(compiler,
new PeepholeRemoveDeadCode(),
new PeepholeMinimizeConditions(true /* late */, false /* useTypes */,
false /* assumeAccurateNullUndefinedTypes */),
new PeepholeMinimizeConditions(true /* late */, false /* useTypes */),
new PeepholeFoldConstants(true, false))
.process(externs, js);
new MinimizeExitPoints(compiler).asCompilerPass().process(externs, js);
Expand Down
3 changes: 1 addition & 2 deletions test/com/google/javascript/jscomp/MultiPassTest.java
Expand Up @@ -188,8 +188,7 @@ private void addPeephole() {
protected CompilerPass create(AbstractCompiler compiler) {
final boolean late = false;
return new PeepholeOptimizationsPass(compiler,
new PeepholeMinimizeConditions(
late, false /* useTypes */, false /* assumeAccurateNullUndefinedTypes */),
new PeepholeMinimizeConditions(late, false /* useTypes */),
new PeepholeSubstituteAlternateSyntax(late),
new PeepholeReplaceKnownMethods(late, false),
new PeepholeRemoveDeadCode(),
Expand Down
Expand Up @@ -33,8 +33,7 @@ public void setUp() throws Exception {
public CompilerPass getProcessor(final Compiler compiler) {
PeepholeOptimizationsPass peepholePass =
new PeepholeOptimizationsPass(compiler,
new PeepholeMinimizeConditions(
late, false /* useTypes */, false /* assumeAccurateNullUndefinedTypes */),
new PeepholeMinimizeConditions(late, false /* useTypes */),
new PeepholeSubstituteAlternateSyntax(late),
new PeepholeRemoveDeadCode(),
new PeepholeFoldConstants(late, false)
Expand Down
Expand Up @@ -25,20 +25,18 @@ public final class PeepholeMinimizeConditionsTest extends CompilerTestCase {

private boolean late = true;
private boolean useTypes = true;
private boolean assumeAccurateNullUndefinedTypes = true;

@Override
public void setUp() throws Exception {
super.setUp();
late = true;
useTypes = true;
assumeAccurateNullUndefinedTypes = true;
}

@Override
public CompilerPass getProcessor(final Compiler compiler) {
PeepholeOptimizationsPass peepholePass = new PeepholeOptimizationsPass(
compiler, new PeepholeMinimizeConditions(late, useTypes, assumeAccurateNullUndefinedTypes));
compiler, new PeepholeMinimizeConditions(late, useTypes));
peepholePass.setRetraverseOnChange(false);
return peepholePass;
}
Expand Down Expand Up @@ -755,9 +753,9 @@ public void testCoercionSubstitution_booleanResult() {
enableTypeCheck();
test("var x = {}; var y = x != null;", "var x = {}; var y = !!x;");
test("var x = {}; var y = x == null;", "var x = {}; var y = !x;");
test("var x = {}; var y = x !== null;", "var x = {}; var y = !!x;");
testSame("var x = {}; var y = x !== null;");
testSame("var x = undefined; var y = x !== null;");
test("var x = {}; var y = x === null;", "var x = {}; var y = !x;");
testSame("var x = {}; var y = x === null;");
testSame("var x = undefined; var y = x === null;");

test("var x = 1; var y = x != 0;", "var x = 1; var y = !!x;");
Expand All @@ -770,12 +768,12 @@ public void testCoercionSubstitution_if() {
enableTypeCheck();
test("var x = {};\nif (x != null) throw 'a';\n", "var x = {};\nif (x) throw 'a';\n");
test("var x = {};\nif (x == null) throw 'a';\n", "var x = {};\nif (!x) throw 'a';\n");
test("var x = {};\nif (x !== null) throw 'a';\n", "var x = {};\nif (x) throw 'a';\n");
test("var x = {};\nif (x === null) throw 'a';\n", "var x = {};\nif (!x) throw 'a';\n");
testSame("var x = {};\nif (x !== null) throw 'a';\n");
testSame("var x = {};\nif (x === null) throw 'a';\n");
test("var x = {};\nif (null != x) throw 'a';\n", "var x = {};\nif (x) throw 'a';\n");
test("var x = {};\nif (null == x) throw 'a';\n", "var x = {};\nif (!x) throw 'a';\n");
test("var x = {};\nif (null !== x) throw 'a';\n", "var x = {};\nif (x) throw 'a';\n");
test("var x = {};\nif (null === x) throw 'a';\n", "var x = {};\nif (!x) throw 'a';\n");
testSame("var x = {};\nif (null !== x) throw 'a';\n");
testSame("var x = {};\nif (null === x) throw 'a';\n");

test("var x = 1;\nif (x != 0) throw 'a';\n", "var x = 1;\nif (x) throw 'a';\n");
test("var x = 1;\nif (x == 0) throw 'a';\n", "var x = 1;\nif (!x) throw 'a';\n");
Expand Down Expand Up @@ -820,9 +818,8 @@ public void testCoercionSubstitution_nullableType() {
test(
"var x = /** @type {?Object} */ ({}); if (x != null) throw 'a';",
"var x = /** @type {?Object} */ ({}); if (x) throw 'a';");
test(
"var x = /** @type {?Object} */ ({}); if (x !== null) throw 'a';",
"var x = /** @type {?Object} */ ({}); if (x) throw 'a';");
// We back off on strict comparison against null.
testSame("var x = /** @type {?Object} */ ({}); if (x !== null) throw 'a';");
test(
"var x = /** @type {?Object} */ ({}); if (x != undefined) throw 'a';",
"var x = /** @type {?Object} */ ({}); if (x) throw 'a';");
Expand Down Expand Up @@ -868,9 +865,6 @@ public void testCoercionSubstitution_nullableType() {
"if (/** @type {Array|undefined} */ (window['c']) == null) {}",
"if (!/** @type {Array|undefined} */ (window['c'])) {}");
testSame("if (/** @type {Array|undefined} */ (window['c']) === null) {}");

assumeAccurateNullUndefinedTypes = false;
testSame("var x = /** @type {?Object} */ ({}); if (x !== null) throw 'a';");
}

public void testCoercionSubstitution_unknownType() {
Expand Down

0 comments on commit 048511a

Please sign in to comment.