diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ValueTypeInfo.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ValueTypeInfo.java index 8d38bd3b528..0755187084c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ValueTypeInfo.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ValueTypeInfo.java @@ -1,12 +1,18 @@ package org.jetbrains.jet.codegen.intrinsics; import com.intellij.psi.PsiElement; +import org.jetbrains.jet.codegen.CodegenUtil; import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.StackValue; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.jetbrains.jet.lang.types.JetStandardClasses; +import org.jetbrains.jet.lang.types.JetType; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; @@ -18,8 +24,21 @@ import java.util.List; public class ValueTypeInfo implements IntrinsicMethod { @Override public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List arguments, StackValue receiver) { - codegen.gen(arguments.get(0), JetTypeMapper.TYPE_JET_OBJECT); - v.invokeinterface(JetTypeMapper.TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;"); + JetExpression expr = arguments.get(0); + BindingContext bindingContext = codegen.getBindingContext(); + JetType jetType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expr); + DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor(); + PsiElement psiElement = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declarationDescriptor.getOriginal()); + if(psiElement instanceof JetClassOrObject) { + codegen.gen(expr, JetTypeMapper.TYPE_JET_OBJECT); + v.invokeinterface(JetTypeMapper.TYPE_JET_OBJECT.getInternalName(), JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD, "()Ljet/TypeInfo;"); + } + else { + codegen.gen(expr, JetTypeMapper.TYPE_OBJECT); + v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;"); + v.iconst(jetType.isNullable() ? 1 : 0); + v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/TypeInfo;"); + } return StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO); } } diff --git a/compiler/testData/codegen/regressions/kt1113.kt b/compiler/testData/codegen/regressions/kt1113.kt new file mode 100644 index 00000000000..dc75494b435 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1113.kt @@ -0,0 +1,7 @@ +class A + +fun box():String { + System.out?.println(typeinfo("foo" as String?)) + System.out?.println(typeinfo("foo")) + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index 05a950fba5a..f5139823337 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -152,4 +152,9 @@ public class TypeInfoTest extends CodegenTestCase { blackBoxFile("typeInfo/inheritance.jet"); System.out.println(generateToText()); } + + public void testkt1113() throws Exception { + blackBoxFile("regressions/kt1113.kt"); + System.out.println(generateToText()); + } }