Search in sources :

Example 6 with ValueType

use of com.google.javascript.jscomp.NodeUtil.ValueType in project closure-compiler by google.

the class PeepholeFoldConstants method tryAbstractEqualityComparison.

/**
 * http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
 */
private static Tri tryAbstractEqualityComparison(AbstractPeepholeOptimization peepholeOptimization, Node left, Node right) {
    // Evaluate based on the general type.
    ValueType leftValueType = NodeUtil.getKnownValueType(left);
    ValueType rightValueType = NodeUtil.getKnownValueType(right);
    if (leftValueType != ValueType.UNDETERMINED && rightValueType != ValueType.UNDETERMINED) {
        // Delegate to strict equality comparison for values of the same type.
        if (leftValueType == rightValueType) {
            return tryStrictEqualityComparison(peepholeOptimization, left, right);
        }
        if ((leftValueType == ValueType.NULL && rightValueType == ValueType.VOID) || (leftValueType == ValueType.VOID && rightValueType == ValueType.NULL)) {
            return Tri.TRUE;
        }
        if ((leftValueType == ValueType.NUMBER && rightValueType == ValueType.STRING) || rightValueType == ValueType.BOOLEAN) {
            Double rv = peepholeOptimization.getSideEffectFreeNumberValue(right);
            return rv == null ? Tri.UNKNOWN : tryAbstractEqualityComparison(peepholeOptimization, left, NodeUtil.numberNode(rv, right));
        }
        if ((leftValueType == ValueType.STRING && rightValueType == ValueType.NUMBER) || leftValueType == ValueType.BOOLEAN) {
            Double lv = peepholeOptimization.getSideEffectFreeNumberValue(left);
            return lv == null ? Tri.UNKNOWN : tryAbstractEqualityComparison(peepholeOptimization, NodeUtil.numberNode(lv, left), right);
        }
        if (leftValueType == ValueType.BIGINT || rightValueType == ValueType.BIGINT) {
            BigInteger lv = peepholeOptimization.getSideEffectFreeBigIntValue(left);
            BigInteger rv = peepholeOptimization.getSideEffectFreeBigIntValue(right);
            if (lv != null && rv != null) {
                return Tri.forBoolean(lv.equals(rv));
            }
        }
        if ((leftValueType == ValueType.STRING || leftValueType == ValueType.NUMBER) && rightValueType == ValueType.OBJECT) {
            return Tri.UNKNOWN;
        }
        if (leftValueType == ValueType.OBJECT && (rightValueType == ValueType.STRING || rightValueType == ValueType.NUMBER)) {
            return Tri.UNKNOWN;
        }
        return Tri.FALSE;
    }
    // In general, the rest of the cases cannot be folded.
    return Tri.UNKNOWN;
}
Also used : ValueType(com.google.javascript.jscomp.NodeUtil.ValueType) BigInteger(java.math.BigInteger)

Aggregations

ValueType (com.google.javascript.jscomp.NodeUtil.ValueType)6 BigInteger (java.math.BigInteger)3 Tri (com.google.javascript.jscomp.base.Tri)1 TernaryValue (com.google.javascript.rhino.jstype.TernaryValue)1