use hard-coded TypeInfo instances for primitive types

This commit is contained in:
Dmitry Jemerov
2011-06-30 17:18:16 +02:00
parent 8a1b9933e4
commit 01a08ecd04
5 changed files with 48 additions and 1 deletions
@@ -61,6 +61,18 @@ public class ExpressionCodegen extends JetVisitor {
private final Stack<Label> myBreakTargets = new Stack<Label>();
private final Stack<StackValue> myStack = new Stack<StackValue>();
private static final String[] PRIMITIVE_TYPE_INFO_FIELDS = {
null,
"BOOL_TYPE_INFO",
"CHAR_TYPE_INFO",
"BYTE_TYPE_INFO",
"SHORT_TYPE_INFO",
"INT_TYPE_INFO",
"FLOAT_TYPE_INFO",
"LONG_TYPE_INFO",
"DOUBLE_TYPE_INFO"
};
private final InstructionAdapter v;
private final FrameMap myMap;
private final JetTypeMapper typeMapper;
@@ -1703,9 +1715,15 @@ public class ExpressionCodegen extends JetVisitor {
throw new UnsupportedOperationException("don't know what this type parameter resolves to");
}
final Type jvmType = typeMapper.mapType(jetType, OwnerKind.INTERFACE);
if (jvmType.getSort() <= Type.DOUBLE) {
v.getstatic("jet/typeinfo/TypeInfo", PRIMITIVE_TYPE_INFO_FIELDS[jvmType.getSort()], "Ljet/typeinfo/TypeInfo;");
return;
}
v.anew(JetTypeMapper.TYPE_TYPEINFO);
v.dup();
v.aconst(typeMapper.jvmType((ClassDescriptor) declarationDescriptor, OwnerKind.INTERFACE));
v.aconst(jvmType);
List<TypeProjection> arguments = jetType.getArguments();
if (arguments.size() > 0) {
v.iconst(arguments.size());
@@ -0,0 +1,13 @@
class Box<T>(t: T) {
var value = t
}
fun isIntBox(box: Box<out Any?>): Boolean {
return box is Box<Int>;
}
fun box(): String {
val box = Box<Int>(1)
return if (isIntBox(box)) "OK" else "fail"
}
@@ -75,6 +75,9 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase {
System.out.println(generateToText());
throw new RuntimeException(e);
}
if (!"OK".equals(actual)) {
System.out.println(generateToText());
}
assertEquals("OK", actual);
}
@@ -84,6 +84,10 @@ public class TypeInfoTest extends CodegenTestCase {
generateFunction(); // assert no exception
}
public void testPrimitiveTypeInfo() throws Exception {
blackBoxFile("typeInfo/primitiveTypeInfo.jet");
}
private Runnable newRunnable() {
return new Runnable() {
@Override
+9
View File
@@ -79,4 +79,13 @@ public class TypeInfo<T> implements JetObject {
result = 31 * result + (typeParameters != null ? Arrays.hashCode(typeParameters) : 0);
return result;
}
public static final TypeInfo<Byte> BYTE_TYPE_INFO = new TypeInfo<Byte>(Byte.class);
public static final TypeInfo<Short> SHORT_TYPE_INFO = new TypeInfo<Short>(Short.class);
public static final TypeInfo<Integer> INT_TYPE_INFO = new TypeInfo<Integer>(Integer.class);
public static final TypeInfo<Long> LONG_TYPE_INFO = new TypeInfo<Long>(Long.class);
public static final TypeInfo<Character> CHAR_TYPE_INFO = new TypeInfo<Character>(Character.class);
public static final TypeInfo<Boolean> BOOL_TYPE_INFO = new TypeInfo<Boolean>(Boolean.class);
public static final TypeInfo<Float> FLOAT_TYPE_INFO = new TypeInfo<Float>(Float.class);
public static final TypeInfo<Double> DOUBLE_TYPE_INFO = new TypeInfo<Double>(Double.class);
}