KT-18731 Use reference equality to compare enums

Fix of https://youtrack.jetbrains.com/issue/KT-18731
This commit is contained in:
Mikaël Peltier
2018-02-05 11:35:17 +01:00
committed by Dmitry Petrov
parent bc54c95bc3
commit a2a3043607
8 changed files with 81 additions and 0 deletions
@@ -99,6 +99,7 @@ import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.*;
import static org.jetbrains.kotlin.resolve.BindingContext.*;
import static org.jetbrains.kotlin.resolve.BindingContextUtils.getDelegationConstructorCall;
import static org.jetbrains.kotlin.resolve.BindingContextUtils.isVarCapturedInClosure;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumClass;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isObject;
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*;
@@ -3107,6 +3108,18 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
);
}
if ((opToken == KtTokens.EQEQ || opToken == KtTokens.EXCLEQ) &&
(isEnumClass(bindingContext.getType(left).getConstructor().getDeclarationDescriptor()) ||
isEnumClass(bindingContext.getType(right).getConstructor().getDeclarationDescriptor()))) {
// Reference equality can be used for enums.
return StackValue.cmp(
opToken == KtTokens.EQEQ ? KtTokens.EQEQEQ : KtTokens.EXCLEQEQEQ,
OBJECT_TYPE,
genLazyUnlessProvided(pregeneratedLeft, left, leftType),
genLazy(right, rightType)
);
}
return genEqualsForExpressionsPreferIEEE754Arithmetic(left, right, opToken, leftType, rightType, pregeneratedLeft);
}