diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmTypeConstants.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmTypeConstants.java index 61e8fe537eb..a721a90eb90 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmTypeConstants.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmTypeConstants.java @@ -16,29 +16,20 @@ package org.jetbrains.jet.codegen; +import com.google.common.collect.Maps; +import org.jetbrains.annotations.NotNull; import org.jetbrains.asm4.Type; -import java.lang.annotation.Annotation; -import java.util.Iterator; +import java.util.Map; /** * @author alex.tkachman */ public class AsmTypeConstants { public static final Type OBJECT_TYPE = Type.getType(Object.class); - public static final Type JAVA_NUMBER_TYPE = Type.getType(Number.class); - public static final Type JAVA_STRING_BUILDER_TYPE = Type.getType(StringBuilder.class); public static final Type JAVA_STRING_TYPE = Type.getType(String.class); public static final Type JAVA_THROWABLE_TYPE = Type.getType(Throwable.class); - public static final Type JAVA_CLASS_TYPE = Type.getType(Class.class); - public static final Type JAVA_BOOLEAN_TYPE = Type.getType(Boolean.class); public static final Type JAVA_ARRAY_GENERIC_TYPE = Type.getType(Object[].class); - public static final Type JAVA_CHAR_SEQUENCE_TYPE = Type.getType(CharSequence.class); - public static final Type JAVA_COMPARABLE_TYPE = Type.getType(Comparable.class); - public static final Type JAVA_ENUM_TYPE = Type.getType(Enum.class); - public static final Type JAVA_ANNOTATION_TYPE = Type.getType(Annotation.class); - public static final Type JAVA_ITERATOR_TYPE = Type.getType(Iterator.class); - public static final Type JAVA_ITERABLE_TYPE = Type.getType(Iterable.class); public static final Type JET_NOTHING_TYPE = Type.getObjectType("jet/Nothing"); public static final Type JET_TUPLE0_TYPE = Type.getObjectType("jet/Tuple0"); @@ -56,6 +47,17 @@ public class AsmTypeConstants { public static final Type JET_SHARED_LONG_TYPE = Type.getObjectType("jet/runtime/SharedVar$Long"); public static final Type JET_SHARED_BOOLEAN_TYPE = Type.getObjectType("jet/runtime/SharedVar$Boolean"); + private static final Map, Type> TYPES_MAP = Maps.newHashMap(); + + public static Type getType(@NotNull Class javaClass) { + Type type = TYPES_MAP.get(javaClass); + if (type == null) { + type = Type.getType(javaClass); + TYPES_MAP.put(javaClass, type); + } + return type; + } + private AsmTypeConstants() { } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index fa1f5fabc67..07c2a47d736 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2567,7 +2567,7 @@ public class ExpressionCodegen extends JetVisitor implem } public void generateStringBuilderConstructor() { - Type type = JAVA_STRING_BUILDER_TYPE; + Type type = getType(StringBuilder.class); v.anew(type); v.dup(); Method method = new Method("", Type.VOID_TYPE, new Type[0]); @@ -2596,7 +2596,7 @@ public class ExpressionCodegen extends JetVisitor implem } public void invokeAppendMethod(Type exprType) { - Method appendDescriptor = new Method("append", JAVA_STRING_BUILDER_TYPE, + Method appendDescriptor = new Method("append", getType(StringBuilder.class), new Type[] {exprType.getSort() == Type.OBJECT ? OBJECT_TYPE : exprType}); v.invokevirtual("java/lang/StringBuilder", "append", appendDescriptor.getDescriptor()); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/KotlinToJavaTypesMap.java b/compiler/backend/src/org/jetbrains/jet/codegen/KotlinToJavaTypesMap.java index 163663ed3fb..d6e0f00e3a1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/KotlinToJavaTypesMap.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/KotlinToJavaTypesMap.java @@ -121,6 +121,10 @@ public class KotlinToJavaTypesMap { return asmTypes.get(className); } + private void register(@NotNull ClassDescriptor kotlinDescriptor, @NotNull Class javaClass) { + register(kotlinDescriptor, AsmTypeConstants.getType(javaClass)); + } + private void register(@NotNull ClassDescriptor kotlinDescriptor, @NotNull Type javaType) { FqNameUnsafe fqName = DescriptorUtils.getFQName(kotlinDescriptor); ClassName className = new ClassName(fqName.toSafe(), kotlinDescriptor.getDefaultType().getArguments().size()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index cab3032d758..1c6affbf4f2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -293,7 +293,7 @@ public abstract class StackValue { v.checkcast(JvmPrimitiveType.CHAR.getWrapper().getAsmType()); } else { - v.checkcast(JAVA_NUMBER_TYPE); + v.checkcast(getType(Number.class)); } } unbox(toType, v); @@ -482,7 +482,7 @@ public abstract class StackValue { putTuple0Instance(v); return; } - if (type != Type.BOOLEAN_TYPE && !type.equals(OBJECT_TYPE) && !type.equals(JAVA_BOOLEAN_TYPE)) { + if (type != Type.BOOLEAN_TYPE && !type.equals(OBJECT_TYPE) && !type.equals(getType(Boolean.class))) { throw new UnsupportedOperationException("don't know how to put a compare as a non-boolean type " + type); } putAsBoolean(v); @@ -571,7 +571,7 @@ public abstract class StackValue { myOperand.put(type, v); // the operand will remove itself from the stack if needed return; } - if (type != Type.BOOLEAN_TYPE && !type.equals(OBJECT_TYPE) && !type.equals(JAVA_BOOLEAN_TYPE)) { + if (type != Type.BOOLEAN_TYPE && !type.equals(OBJECT_TYPE) && !type.equals(getType(Boolean.class))) { throw new UnsupportedOperationException("don't know how to put a compare as a non-boolean type"); } putAsBoolean(v); 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 29124e81ce2..0249b3fb571 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassFunction.java @@ -61,6 +61,6 @@ public class JavaClassFunction implements IntrinsicMethod { else { v.aconst(type); } - return StackValue.onStack(AsmTypeConstants.JAVA_CLASS_TYPE); + return StackValue.onStack(AsmTypeConstants.getType(Class.class)); } } 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 d39b9f0d57d..30a4b51e88a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/JavaClassProperty.java @@ -53,6 +53,6 @@ public class JavaClassProperty implements IntrinsicMethod { else { v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;"); } - return StackValue.onStack(AsmTypeConstants.JAVA_CLASS_TYPE); + return StackValue.onStack(AsmTypeConstants.getType(Class.class)); } }