Simplify JvmPrimitiveType, PrimitiveType

Delete utility methods from interfaces, move once-used methods to where they're
used
This commit is contained in:
Alexander Udalov
2013-09-10 17:15:10 +04:00
committed by Alexander Udalov
parent 1578d891cb
commit 73b867d1e5
12 changed files with 89 additions and 167 deletions
@@ -82,16 +82,37 @@ public class AsmUtil {
private static final String STUB_EXCEPTION = "java/lang/RuntimeException";
private static final String STUB_EXCEPTION_MESSAGE = "Stubs are for compiler only, do not add them to runtime classpath";
private static final ImmutableMap<Integer, JvmPrimitiveType> primitiveTypeByAsmSort;
private static final ImmutableMap<Type, JvmPrimitiveType> primitiveTypeByBoxedType;
static {
ImmutableMap.Builder<Integer, JvmPrimitiveType> typeBySortBuilder = ImmutableMap.builder();
ImmutableMap.Builder<Type, JvmPrimitiveType> typeByWrapperBuilder = ImmutableMap.builder();
for (JvmPrimitiveType type : JvmPrimitiveType.values()) {
typeBySortBuilder.put(type.getAsmType().getSort(), type);
typeByWrapperBuilder.put(type.getWrapper().getAsmType(), type);
}
primitiveTypeByAsmSort = typeBySortBuilder.build();
primitiveTypeByBoxedType = typeByWrapperBuilder.build();
}
private AsmUtil() {
}
public static Type boxType(Type asmType) {
JvmPrimitiveType jvmPrimitiveType = JvmPrimitiveType.getByAsmType(asmType);
@NotNull
public static Type boxType(@NotNull Type type) {
JvmPrimitiveType jvmPrimitiveType = primitiveTypeByAsmSort.get(type.getSort());
return jvmPrimitiveType != null ? jvmPrimitiveType.getWrapper().getAsmType() : type;
}
@NotNull
public static Type unboxType(@NotNull Type type) {
JvmPrimitiveType jvmPrimitiveType = primitiveTypeByBoxedType.get(type);
if (jvmPrimitiveType != null) {
return jvmPrimitiveType.getWrapper().getAsmType();
return jvmPrimitiveType.getAsmType();
}
else {
return asmType;
throw new UnsupportedOperationException("Unboxing: " + type);
}
}
@@ -120,16 +141,6 @@ public class AsmUtil {
return Type.getType(internalName.substring(1));
}
public static Type unboxType(Type type) {
JvmPrimitiveType jvmPrimitiveType = JvmPrimitiveType.getByWrapperAsmType(type);
if (jvmPrimitiveType != null) {
return jvmPrimitiveType.getAsmType();
}
else {
throw new UnsupportedOperationException("Unboxing: " + type);
}
}
public static boolean isAbstractMethod(FunctionDescriptor functionDescriptor, OwnerKind kind) {
return (functionDescriptor.getModality() == Modality.ABSTRACT
|| isInterface(functionDescriptor.getContainingDeclaration()))
@@ -54,7 +54,6 @@ import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -673,12 +672,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
// This method consumes range/progression from stack
// The result is stored to local variable
protected void generateRangeOrProgressionProperty(Type loopRangeType, String getterName, Type elementType, int varToStore) {
JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(elementType);
assert primitiveType != null : elementType;
Type asmWrapperType = primitiveType.getWrapper().getAsmType();
v.invokevirtual(loopRangeType.getInternalName(), getterName, "()" + asmWrapperType.getDescriptor());
StackValue.coerce(asmWrapperType, elementType, v);
Type boxedType = boxType(elementType);
v.invokevirtual(loopRangeType.getInternalName(), getterName, "()" + boxedType.getDescriptor());
StackValue.coerce(boxedType, elementType, v);
v.store(varToStore, elementType);
}
}
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
@@ -40,8 +41,8 @@ public class RangeCodegenUtil {
ImmutableMap.Builder<FqName, PrimitiveType> rangeBuilder = ImmutableMap.builder();
ImmutableMap.Builder<FqName, PrimitiveType> progressionBuilder = ImmutableMap.builder();
for (PrimitiveType primitiveType : PrimitiveType.values()) {
rangeBuilder.put(primitiveType.getRangeClassName(), primitiveType);
progressionBuilder.put(primitiveType.getProgressionClassName(), primitiveType);
rangeBuilder.put(getRangeClassFqName(primitiveType), primitiveType);
progressionBuilder.put(getProgressionClassFqName(primitiveType), primitiveType);
}
RANGE_TO_ELEMENT_TYPE = rangeBuilder.build();
PROGRESSION_TO_ELEMENT_TYPE = progressionBuilder.build();
@@ -120,6 +121,16 @@ public class RangeCodegenUtil {
return false;
}
@NotNull
public static FqName getRangeClassFqName(@NotNull PrimitiveType type) {
return KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier(type.getTypeName() + "Range"));
}
@NotNull
public static FqName getProgressionClassFqName(@NotNull PrimitiveType type) {
return KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier(type.getTypeName() + "Progression"));
}
public static class BinaryCall {
public final JetExpression left;
public final JetExpression op;
@@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.state.GenerationState;
@@ -30,6 +29,8 @@ import org.jetbrains.jet.lang.psi.JetCallExpression;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
@@ -62,9 +63,10 @@ public class ArrayIterator implements IntrinsicMethod {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
ClassDescriptor arrayClass = KotlinBuiltIns.getInstance().getPrimitiveArrayClassDescriptor(primitiveType);
if (containingDeclaration.equals(arrayClass)) {
String methodSignature = "([" + jvmPrimitiveType.getJvmLetter() + ")" + jvmPrimitiveType.getIterator().getDescriptor();
JvmClassName iterator = JvmClassName.byFqNameWithoutInnerClasses("jet." + primitiveType.getTypeName() + "Iterator");
String methodSignature = "([" + jvmPrimitiveType.getAsmType() + ")" + iterator.getDescriptor();
v.invokestatic("jet/runtime/ArrayIterator", "iterator", methodSignature);
return StackValue.onStack(jvmPrimitiveType.getIterator().getAsmType());
return StackValue.onStack(iterator.getAsmType());
}
}
throw new UnsupportedOperationException(containingDeclaration.toString());
@@ -19,6 +19,7 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.google.common.collect.ImmutableList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.RangeCodegenUtil;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
@@ -152,16 +153,17 @@ public class IntrinsicMethods {
registerStaticField(getFQName(KotlinBuiltIns.getInstance().getUnit()).toSafe(), Name.identifier("VALUE"));
for (PrimitiveType type : PrimitiveType.NUMBER_TYPES) {
registerStaticField(type.getRangeClassName(), Name.identifier("EMPTY"));
}
FqName rangeClassFqName = RangeCodegenUtil.getRangeClassFqName(type);
FqName progressionClassFqName = RangeCodegenUtil.getProgressionClassFqName(type);
for (PrimitiveType type : PrimitiveType.NUMBER_TYPES) {
registerRangeOrProgressionProperty(type.getRangeClassName(), Name.identifier("start"));
registerRangeOrProgressionProperty(type.getRangeClassName(), Name.identifier("end"));
registerStaticField(rangeClassFqName, Name.identifier("EMPTY"));
registerRangeOrProgressionProperty(type.getProgressionClassName(), Name.identifier("start"));
registerRangeOrProgressionProperty(type.getProgressionClassName(), Name.identifier("end"));
registerRangeOrProgressionProperty(type.getProgressionClassName(), Name.identifier("increment"));
registerRangeOrProgressionProperty(rangeClassFqName, Name.identifier("start"));
registerRangeOrProgressionProperty(rangeClassFqName, Name.identifier("end"));
registerRangeOrProgressionProperty(progressionClassFqName, Name.identifier("start"));
registerRangeOrProgressionProperty(progressionClassFqName, Name.identifier("end"));
registerRangeOrProgressionProperty(progressionClassFqName, Name.identifier("increment"));
}
declareArrayMethods();
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.state.GenerationState;
@@ -30,11 +29,14 @@ import org.jetbrains.jet.lang.psi.JetCallExpression;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.lang.types.JetType;
import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
public class JavaClassFunction implements IntrinsicMethod {
@Override
public StackValue generate(
@@ -49,9 +51,8 @@ public class JavaClassFunction implements IntrinsicMethod {
JetType returnType = resultingDescriptor.getReturnType();
assert returnType != null;
Type type = state.getTypeMapper().mapType(returnType.getArguments().get(0).getType());
JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(type);
if (primitiveType != null) {
v.getstatic(primitiveType.getWrapper().getAsmType().getInternalName(), "TYPE", "Ljava/lang/Class;");
if (isPrimitive(type)) {
v.getstatic(boxType(type).getInternalName(), "TYPE", "Ljava/lang/Class;");
}
else {
v.aconst(type);
@@ -21,15 +21,17 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
public class JavaClassProperty implements IntrinsicMethod {
@Override
public StackValue generate(
@@ -41,12 +43,12 @@ public class JavaClassProperty implements IntrinsicMethod {
StackValue receiver,
@NotNull GenerationState state
) {
JvmPrimitiveType primitiveType = JvmPrimitiveType.getByAsmType(receiver.type);
if (primitiveType != null) {
v.getstatic(primitiveType.getWrapper().getAsmType().getInternalName(), "TYPE", "Ljava/lang/Class;");
Type type = receiver.type;
if (isPrimitive(type)) {
v.getstatic(boxType(type).getInternalName(), "TYPE", "Ljava/lang/Class;");
}
else {
receiver.put(receiver.type, v);
receiver.put(type, v);
v.invokevirtual("java/lang/Object", "getClass", "()Ljava/lang/Class;");
}
return StackValue.onStack(AsmTypeConstants.getType(Class.class));
@@ -25,14 +25,14 @@ import org.jetbrains.jet.codegen.PropertyCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
public class PropertyOfProgressionOrRange implements IntrinsicMethod {
private final FqName ownerClass;
private final Name propertyName;
@@ -53,12 +53,12 @@ public class PropertyOfProgressionOrRange implements IntrinsicMethod {
@NotNull GenerationState state
) {
String ownerInternalName = JvmClassName.byFqNameWithoutInnerClasses(this.ownerClass).getInternalName();
JvmClassName wrapperClass = JvmPrimitiveType.getByAsmType(expectedType).getWrapper();
Type boxedType = boxType(expectedType);
String getterName = PropertyCodegen.getterName(propertyName);
receiver.put(receiver.type, v);
v.invokevirtual(ownerInternalName, getterName, "()" + wrapperClass.getDescriptor());
StackValue.coerce(wrapperClass.getAsmType(), expectedType, v);
v.invokevirtual(ownerInternalName, getterName, "()" + boxedType.getDescriptor());
StackValue.coerce(boxedType, expectedType, v);
return StackValue.onStack(expectedType);
}
}