introduced static map for asm type constants
This commit is contained in:
@@ -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<Class<?>, 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() {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2567,7 +2567,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
}
|
||||
|
||||
public void generateStringBuilderConstructor() {
|
||||
Type type = JAVA_STRING_BUILDER_TYPE;
|
||||
Type type = getType(StringBuilder.class);
|
||||
v.anew(type);
|
||||
v.dup();
|
||||
Method method = new Method("<init>", Type.VOID_TYPE, new Type[0]);
|
||||
@@ -2596,7 +2596,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> 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());
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user