From c0cc97063d0f78fd493b2afe4069c162cd00d9f8 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Thu, 24 Nov 2011 18:02:44 +0200 Subject: [PATCH] optimized bytecode of is --- .../jet/codegen/ExpressionCodegen.java | 38 ++++++++++++++----- .../jet/lang/types/JetStandardLibrary.java | 2 +- .../jetbrains/jet/codegen/ArrayGenTest.java | 1 + 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index ea4c1848f16..e2d0adf8eeb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2445,18 +2445,28 @@ If finally block is present, its last expression is the value of try expression. return StackValue.onStack(Type.BOOLEAN_TYPE); } + public boolean hasTypeInfoForInstanceOf(JetType type) { + DeclarationDescriptor declarationDescriptor = type.getConstructor().getDeclarationDescriptor(); + if(declarationDescriptor instanceof TypeParameterDescriptor) + return true; + + ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor.getOriginal(); + if(classDescriptor.equals(state.getStandardLibrary().getArray())) { + return hasTypeInfoForInstanceOf(type.getArguments().get(0).getType()); + } + + for(TypeParameterDescriptor proj : classDescriptor.getTypeConstructor().getParameters()) { + if(proj.isReified()) { + return true; + } + } + + return false; + } + private void generateInstanceOf(StackValue expressionToGen, JetType jetType, boolean leaveExpressionOnStack) { DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); - boolean javaClass = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor) instanceof PsiClass; - if (!javaClass && (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor))) { - generateTypeInfo(jetType); - expressionToGen.put(OBJECT_TYPE, v); - if (leaveExpressionOnStack) { - v.dupX1(); - } - v.invokevirtual("jet/typeinfo/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z"); - } - else { + if (!hasTypeInfoForInstanceOf(jetType)) { expressionToGen.put(OBJECT_TYPE, v); if (leaveExpressionOnStack) { v.dup(); @@ -2479,6 +2489,14 @@ If finally block is present, its last expression is the value of try expression. v.instanceOf(type); } } + else { + generateTypeInfo(jetType); + expressionToGen.put(OBJECT_TYPE, v); + if (leaveExpressionOnStack) { + v.dupX1(); + } + v.invokevirtual("jet/typeinfo/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z"); + } } public void generateTypeInfo(JetType jetType) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java index 62923713125..c095764a3ab 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java @@ -284,7 +284,7 @@ public class JetStandardLibrary { } @NotNull - public ClassDescriptor getArray() { + public ClassDescriptor getArray() { initStdClasses(); return arrayClass; } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index c40d7cffb60..703f73fa95f 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -278,6 +278,7 @@ public class ArrayGenTest extends CodegenTestCase { public void testKt602() { blackBoxFile("regressions/kt602.jet"); + System.out.println(generateToText()); } public void testKt594() throws Exception {