diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java index f6869377639..6c73cc6d6c2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; +import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import java.util.List; @@ -42,7 +43,13 @@ public class JavaClassFunction implements IntrinsicMethod { CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); Type type = state.getInjector().getJetTypeMapper().mapType( resultingDescriptor.getReturnType().getArguments().get(0).getType(), MapTypeMode.VALUE); - v.aconst(type); + JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(type); + if (primitiveType != null) { + v.getstatic(primitiveType.getWrapper().getAsmType().getInternalName(), "TYPE", "Ljava/lang/Class;"); + } + else { + v.aconst(type); + } return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java index 7ef1c4a1b9c..177f557030f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; +import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import java.util.List; @@ -36,33 +37,13 @@ public class JavaClassProperty implements IntrinsicMethod { @Override public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, @Nullable PsiElement element, @Nullable List arguments, StackValue receiver, @NotNull GenerationState state) { receiver.put(receiver.type, v); - switch (receiver.type.getSort()) { - case Type.BOOLEAN: - v.getstatic("java/lang/Boolean", "TYPE", "Ljava/lang/Class;"); - break; - case Type.BYTE: - v.getstatic("java/lang/Byte", "TYPE", "Ljava/lang/Class;"); - break; - case Type.SHORT: - v.getstatic("java/lang/Short", "TYPE", "Ljava/lang/Class;"); - break; - case Type.CHAR: - v.getstatic("java/lang/Character", "TYPE", "Ljava/lang/Class;"); - break; - case Type.INT: - v.getstatic("java/lang/Integer", "TYPE", "Ljava/lang/Class;"); - break; - case Type.LONG: - v.getstatic("java/lang/Long", "TYPE", "Ljava/lang/Class;"); - break; - case Type.FLOAT: - v.getstatic("java/lang/Float", "TYPE", "Ljava/lang/Class;"); - break; - case Type.DOUBLE: - v.getstatic("java/lang/Double", "TYPE", "Ljava/lang/Class;"); - break; - default: - v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;"); + JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(receiver.type); + if (primitiveType != null) { + v.pop(); + v.getstatic(primitiveType.getWrapper().getAsmType().getInternalName(), "TYPE", "Ljava/lang/Class;"); + } + else { + v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;"); } return StackValue.onStack(JetTypeMapper.JL_CLASS_TYPE); } diff --git a/compiler/testData/codegen/regressions/kt2318.kt b/compiler/testData/codegen/regressions/kt2318.kt new file mode 100644 index 00000000000..182774f7e0b --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2318.kt @@ -0,0 +1,11 @@ +fun box(): String { + javaClass() + javaClass() + javaClass() + javaClass() + javaClass() + javaClass() + javaClass() + javaClass() + return "OK" +} diff --git a/compiler/testData/codegen/regressions/kt2593.kt b/compiler/testData/codegen/regressions/kt2593.kt new file mode 100644 index 00000000000..790bf56ab49 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2593.kt @@ -0,0 +1,8 @@ +fun foo() { + if (1==1) { + 1.javaClass + } else { + } +} + +fun box() = "OK" diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index ff22171e551..0b721ee206c 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -361,4 +361,12 @@ public class StdlibTest extends CodegenTestCase { blackBoxFile("regressions/kt2210.kt"); // System.out.println(generateToText()); } + + public void testKt2593() { + blackBoxFile("regressions/kt2593.kt"); + } + + public void testKt2318() { + blackBoxFile("regressions/kt2318.kt"); + } }