From 6768ae02c3e015a568f773c49ce3ef194623b998 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 21 Dec 2018 17:47:15 +0300 Subject: [PATCH] Support inline classes in javaObjectType/javaPrimitiveType #KT-28290 Fixed Target versions 1.3.30 --- .../kotlin/codegen/ExpressionCodegen.java | 5 +++++ .../intrinsics/KClassJavaObjectTypeProperty.kt | 2 +- .../KClassJavaPrimitiveTypeProperty.kt | 18 +++++++++++++----- .../inlineClasses/kt28920_javaObjectType.kt | 11 +++++++++++ .../inlineClasses/kt28920_javaPrimitiveType.kt | 7 +++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 10 ++++++++++ .../LightAnalysisModeTestGenerated.java | 10 ++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 10 ++++++++++ 8 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt create mode 100644 compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 90bb9ccf007..26889498793 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -454,6 +454,11 @@ public class ExpressionCodegen extends KtVisitor impleme return typeMapper.mapType(type); } + @NotNull + public Type mapTypeAsDeclaration(@NotNull KotlinType type) { + return typeMapper.mapTypeAsDeclaration(type); + } + @NotNull public Type expressionType(@Nullable KtExpression expression) { return CodegenUtilKt.asmType(expression, typeMapper, bindingContext); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt index a4d1cc08189..9ecc31dc71f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaObjectTypeProperty.kt @@ -49,7 +49,7 @@ class KClassJavaObjectTypeProperty : IntrinsicPropertyGetter() { } codegen.putReifiedOperationMarkerIfTypeIsReifiedParameter(lhs.type, ReifiedTypeInliner.OperationKind.JAVA_CLASS) } - iv.aconst(AsmUtil.boxType(codegen.asmType(lhs.type))) + iv.aconst(AsmUtil.boxType(codegen.mapTypeAsDeclaration(lhs.type))) } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt index 7806db91048..64ae4c1bee5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/KClassJavaPrimitiveTypeProperty.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.psi.KtClassLiteralExpression import org.jetbrains.kotlin.resolve.BindingContext.DOUBLE_COLON_LHS import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.isInlineClassType import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.types.TypeUtils @@ -32,21 +33,28 @@ class KClassJavaPrimitiveTypeProperty : IntrinsicPropertyGetter() { val receiverType = codegen.bindingContext.getType(receiverExpression) ?: return null if (!KotlinBuiltIns.isPrimitiveTypeOrNullablePrimitiveType(receiverType)) return null } + val lhsType = codegen.asmType(lhs.type) return StackValue.operation(returnType) { iv -> when { lhs is DoubleColonLHS.Expression && !lhs.isObjectQualifier -> { codegen.gen(receiverExpression).put(lhsType, iv) AsmUtil.pop(iv, lhsType) + if (lhs.type.isInlineClassType()) + iv.aconst(null) + else + iv.getstatic(AsmUtil.boxType(lhsType).internalName, "TYPE", "Ljava/lang/Class;") + } + + !lhs.type.isInlineClassType() && isPrimitiveOrWrapper(lhsType) -> { iv.getstatic(AsmUtil.boxType(lhsType).internalName, "TYPE", "Ljava/lang/Class;") } - AsmUtil.isPrimitive(lhsType) || - AsmUtil.unboxPrimitiveTypeOrNull(lhsType) != null || - AsmTypes.VOID_WRAPPER_TYPE == lhsType -> { - iv.getstatic(AsmUtil.boxType(lhsType).internalName, "TYPE", "Ljava/lang/Class;") - } + else -> iv.aconst(null) } } } + + private fun isPrimitiveOrWrapper(lhsType: Type) = + AsmUtil.isPrimitive(lhsType) || AsmUtil.unboxPrimitiveTypeOrNull(lhsType) != null || AsmTypes.VOID_WRAPPER_TYPE == lhsType } diff --git a/compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt b/compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt new file mode 100644 index 00000000000..a1fbadb8b68 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt @@ -0,0 +1,11 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +fun box(): String { + val c = UInt::class.javaObjectType + val x = c.cast(123u) + + if (x != 123u) throw AssertionError() + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt b/compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt new file mode 100644 index 00000000000..666d1a8664f --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt @@ -0,0 +1,7 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +fun box(): String { + if (UInt::class.javaPrimitiveType != null) throw AssertionError() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 8d7e4494fd7..52860956ffc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12160,6 +12160,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt28879.kt"); } + @TestMetadata("kt28920_javaObjectType.kt") + public void testKt28920_javaObjectType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt"); + } + + @TestMetadata("kt28920_javaPrimitiveType.kt") + public void testKt28920_javaPrimitiveType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 41c92fd54c7..358c1464229 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12160,6 +12160,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt28879.kt"); } + @TestMetadata("kt28920_javaObjectType.kt") + public void testKt28920_javaObjectType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt"); + } + + @TestMetadata("kt28920_javaPrimitiveType.kt") + public void testKt28920_javaPrimitiveType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index c8285d8bf0e..749234abd1e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12165,6 +12165,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt28879.kt"); } + @TestMetadata("kt28920_javaObjectType.kt") + public void testKt28920_javaObjectType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaObjectType.kt"); + } + + @TestMetadata("kt28920_javaPrimitiveType.kt") + public void testKt28920_javaPrimitiveType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28920_javaPrimitiveType.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt");