functional list benchmark and part of rewrite of type info codegen for performance reasons

This commit is contained in:
Alex Tkachman
2011-12-12 10:40:42 +02:00
parent 182009ab61
commit 92d8d2de72
24 changed files with 371 additions and 158 deletions
@@ -57,26 +57,18 @@ public class CodegenUtil {
return (ClassDescriptor) outerDescriptor; return (ClassDescriptor) outerDescriptor;
} }
public static boolean hasOuterTypeInfo(ClassDescriptor descriptor) { public static boolean hasDerivedTypeInfoField(JetType type) {
ClassDescriptor outerClassDescriptor = getOuterClassDescriptor(descriptor); for (JetType jetType : type.getConstructor().getSupertypes()) {
if(outerClassDescriptor == null) if(hasTypeInfoField(jetType))
return false; return true;
if(outerClassDescriptor.getTypeConstructor().getParameters().size() > 0)
return true;
return hasOuterTypeInfo(outerClassDescriptor);
}
public static boolean hasDerivedTypeInfoField(JetType type, boolean exceptOwn) {
if(!exceptOwn) {
if(!isInterface(type))
if(hasTypeInfoField(type))
return true;
} }
for (JetType jetType : type.getConstructor().getSupertypes()) { return false;
if(hasDerivedTypeInfoField(jetType, false)) }
public static boolean requireTypeInfoConstructorArg(JetType type) {
for (TypeParameterDescriptor parameter : type.getConstructor().getParameters()) {
if(parameter.isReified())
return true; return true;
} }
@@ -87,22 +79,10 @@ public class CodegenUtil {
if(isInterface(type)) if(isInterface(type))
return false; return false;
List<TypeParameterDescriptor> parameters = type.getConstructor().getParameters(); if(requireTypeInfoConstructorArg(type))
for (TypeParameterDescriptor parameter : parameters) { return true;
if(parameter.isReified())
return true;
}
for (JetType jetType : type.getConstructor().getSupertypes()) { return hasDerivedTypeInfoField(type);
if(hasTypeInfoField(jetType))
return true;
}
ClassDescriptor outerClassDescriptor = getOuterClassDescriptor(type.getConstructor().getDeclarationDescriptor());
if(outerClassDescriptor == null || isClassObject(type.getConstructor().getDeclarationDescriptor()))
return false;
return hasTypeInfoField(outerClassDescriptor.getDefaultType());
} }
public static FunctionDescriptor createInvoke(ExpressionAsFunctionDescriptor fd) { public static FunctionDescriptor createInvoke(ExpressionAsFunctionDescriptor fd) {
@@ -12,11 +12,11 @@ import java.util.List;
/** /**
* @author yole * @author yole
* @author alex.tkachman
*/ */
public class ConstructorFrameMap extends FrameMap { public class ConstructorFrameMap extends FrameMap {
private int myOuterThisIndex = -1; private int myOuterThisIndex = -1;
private int myFirstTypeParameter = -1; private int myTypeInfoIndex = -1;
private int myTypeParameterCount = 0;
public ConstructorFrameMap(CallableMethod callableMethod, @Nullable ConstructorDescriptor descriptor, ClassDescriptor classDescriptor, OwnerKind kind) { public ConstructorFrameMap(CallableMethod callableMethod, @Nullable ConstructorDescriptor descriptor, ClassDescriptor classDescriptor, OwnerKind kind) {
enterTemp(); // this enterTemp(); // this
@@ -27,15 +27,8 @@ public class ConstructorFrameMap extends FrameMap {
} }
if (classDescriptor != null) { if (classDescriptor != null) {
List<TypeParameterDescriptor> parameters = classDescriptor.getTypeConstructor().getParameters(); if (CodegenUtil.requireTypeInfoConstructorArg(classDescriptor.getDefaultType())) {
for (TypeParameterDescriptor parameter : parameters) { myTypeInfoIndex = enterTemp();
if(parameter.isReified()) {
int index = enterTemp();
myTypeParameterCount++;
if(myFirstTypeParameter == -1) {
myFirstTypeParameter = index;
}
}
} }
} }
@@ -54,11 +47,7 @@ public class ConstructorFrameMap extends FrameMap {
return myOuterThisIndex; return myOuterThisIndex;
} }
public int getFirstTypeParameter() { public int getTypeInfoIndex() {
return myFirstTypeParameter; return myTypeInfoIndex;
}
public int getTypeParameterCount() {
return myTypeParameterCount;
} }
} }
@@ -979,7 +979,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
} }
else if (descriptor instanceof TypeParameterDescriptor) { else if (descriptor instanceof TypeParameterDescriptor) {
TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) descriptor; TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) descriptor;
loadTypeParameterTypeInfo(typeParameterDescriptor); loadTypeParameterTypeInfo(typeParameterDescriptor, null);
v.invokevirtual("jet/typeinfo/TypeInfo", "getClassObject", "()Ljava/lang/Object;"); v.invokevirtual("jet/typeinfo/TypeInfo", "getClassObject", "()Ljava/lang/Object;");
v.checkcast(asmType(typeParameterDescriptor.getClassObjectType())); v.checkcast(asmType(typeParameterDescriptor.getClassObjectType()));
@@ -2033,26 +2033,32 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
private void pushTypeArguments(ResolvedCall<? extends CallableDescriptor> resolvedCall) { private void pushTypeArguments(ResolvedCall<? extends CallableDescriptor> resolvedCall) {
if(resolvedCall != null) { if(resolvedCall != null) {
Map<TypeParameterDescriptor, JetType> typeArguments = resolvedCall.getTypeArguments(); if(resolvedCall.getResultingDescriptor() instanceof ConstructorDescriptor) {
CallableDescriptor resultingDescriptor = resolvedCall.getCandidateDescriptor(); ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) resolvedCall.getResultingDescriptor();
for (TypeParameterDescriptor typeParameterDescriptor : resultingDescriptor.getTypeParameters()) { ClassDescriptor containingDeclaration = constructorDescriptor.getContainingDeclaration();
if(typeParameterDescriptor.isReified()) { if(CodegenUtil.requireTypeInfoConstructorArg(containingDeclaration.getDefaultType())) {
JetType jetType = typeArguments.get(typeParameterDescriptor); generateTypeInfo(containingDeclaration.getDefaultType(), resolvedCall.getTypeArguments());
generateTypeInfo(jetType); }
}
else {
Map<TypeParameterDescriptor, JetType> typeArguments = resolvedCall.getTypeArguments();
CallableDescriptor resultingDescriptor = resolvedCall.getCandidateDescriptor();
for (TypeParameterDescriptor typeParameterDescriptor : resultingDescriptor.getTypeParameters()) {
if(typeParameterDescriptor.isReified()) {
JetType jetType = typeArguments.get(typeParameterDescriptor);
generateTypeInfo(jetType, typeArguments);
}
} }
} }
} }
else { else {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
// for (JetTypeProjection jetTypeArgument : expression.getTypeArguments()) {
// pushTypeArgument(jetTypeArgument);
// }
} }
} }
public void pushTypeArgument(JetTypeProjection jetTypeArgument) { public void pushTypeArgument(JetTypeProjection jetTypeArgument) {
JetType typeArgument = bindingContext.get(BindingContext.TYPE, jetTypeArgument.getTypeReference()); JetType typeArgument = bindingContext.get(BindingContext.TYPE, jetTypeArgument.getTypeReference());
generateTypeInfo(typeArgument); generateTypeInfo(typeArgument, null);
} }
private Type generateJavaConstructorCall(JetCallExpression expression) { private Type generateJavaConstructorCall(JetCallExpression expression) {
@@ -2091,7 +2097,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
if(isArray) { if(isArray) {
JetType elementType = typeMapper.getGenericsElementType(arrayType); JetType elementType = typeMapper.getGenericsElementType(arrayType);
if(elementType != null) { if(elementType != null) {
generateTypeInfo(elementType); generateTypeInfo(elementType, null);
gen(args.get(0).getArgumentExpression(), Type.INT_TYPE); gen(args.get(0).getArgumentExpression(), Type.INT_TYPE);
v.invokevirtual("jet/typeinfo/TypeInfo", "newArray", "(I)[Ljava/lang/Object;"); v.invokevirtual("jet/typeinfo/TypeInfo", "newArray", "(I)[Ljava/lang/Object;");
} }
@@ -2195,7 +2201,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
} }
for (TypeParameterDescriptor typeParameterDescriptor : getterDescriptor.getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : getterDescriptor.getTypeParameters()) {
if(typeParameterDescriptor.isReified()) { if(typeParameterDescriptor.isReified()) {
generateTypeInfo(resolvedGetCall.getTypeArguments().get(typeParameterDescriptor)); generateTypeInfo(resolvedGetCall.getTypeArguments().get(typeParameterDescriptor), null);
index++; index++;
} }
} }
@@ -2215,7 +2221,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
} }
for (TypeParameterDescriptor typeParameterDescriptor : setterDescriptor.getOriginal().getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : setterDescriptor.getOriginal().getTypeParameters()) {
if(typeParameterDescriptor.isReified()) { if(typeParameterDescriptor.isReified()) {
generateTypeInfo(resolvedSetCall.getTypeArguments().get(typeParameterDescriptor)); generateTypeInfo(resolvedSetCall.getTypeArguments().get(typeParameterDescriptor), null);
index++; index++;
} }
} }
@@ -2503,7 +2509,7 @@ If finally block is present, its last expression is the value of try expression.
} }
} }
else { else {
generateTypeInfo(jetType); generateTypeInfo(jetType, null);
expressionToGen.put(TYPE_OBJECT, v); expressionToGen.put(TYPE_OBJECT, v);
if (leaveExpressionOnStack) { if (leaveExpressionOnStack) {
v.dupX1(); v.dupX1();
@@ -2512,7 +2518,7 @@ If finally block is present, its last expression is the value of try expression.
} }
} }
public void generateTypeInfo(JetType jetType) { public void generateTypeInfo(JetType jetType, Map<TypeParameterDescriptor, JetType> typeArguments) {
String knownTypeInfo = typeMapper.isKnownTypeInfo(jetType); String knownTypeInfo = typeMapper.isKnownTypeInfo(jetType);
if(knownTypeInfo != null) { if(knownTypeInfo != null) {
v.getstatic("jet/typeinfo/TypeInfo", knownTypeInfo, "Ljet/typeinfo/TypeInfo;"); v.getstatic("jet/typeinfo/TypeInfo", knownTypeInfo, "Ljet/typeinfo/TypeInfo;");
@@ -2521,7 +2527,7 @@ If finally block is present, its last expression is the value of try expression.
DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor(); DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor();
if (declarationDescriptor instanceof TypeParameterDescriptor) { if (declarationDescriptor instanceof TypeParameterDescriptor) {
loadTypeParameterTypeInfo((TypeParameterDescriptor) declarationDescriptor); loadTypeParameterTypeInfo((TypeParameterDescriptor) declarationDescriptor, typeArguments);
return; return;
} }
@@ -2551,7 +2557,7 @@ If finally block is present, its last expression is the value of try expression.
TypeProjection argument = arguments.get(i); TypeProjection argument = arguments.get(i);
v.dup(); v.dup();
v.iconst(i); v.iconst(i);
generateTypeInfo(argument.getType()); generateTypeInfo(argument.getType(), typeArguments);
genTypeInfoToProjection(v, argument.getProjectionKind()); genTypeInfoToProjection(v, argument.getProjectionKind());
v.astore(TYPE_OBJECT); v.astore(TYPE_OBJECT);
} }
@@ -2573,12 +2579,21 @@ If finally block is present, its last expression is the value of try expression.
throw new UnsupportedOperationException(variance.toString()); throw new UnsupportedOperationException(variance.toString());
} }
private void loadTypeParameterTypeInfo(TypeParameterDescriptor typeParameterDescriptor) { private void loadTypeParameterTypeInfo(TypeParameterDescriptor typeParameterDescriptor, @Nullable Map<TypeParameterDescriptor, JetType> typeArguments) {
final StackValue value = typeParameterExpressions.get(typeParameterDescriptor); final StackValue value = typeParameterExpressions.get(typeParameterDescriptor);
if (value != null) { if (value != null) {
value.put(TYPE_TYPEINFO, v); value.put(TYPE_TYPEINFO, v);
return; return;
} }
if(typeArguments != null) {
JetType jetType = typeArguments.get(typeParameterDescriptor);
if(jetType != null && !jetType.equals(typeParameterDescriptor.getDefaultType())) {
generateTypeInfo(jetType, typeArguments);
return;
}
}
DeclarationDescriptor containingDeclaration = typeParameterDescriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = typeParameterDescriptor.getContainingDeclaration();
if (context.getThisDescriptor() != null) { if (context.getThisDescriptor() != null) {
ClassDescriptor descriptor = context.getThisDescriptor(); ClassDescriptor descriptor = context.getThisDescriptor();
@@ -2589,8 +2604,13 @@ If finally block is present, its last expression is the value of try expression.
if (containingDeclaration == context.getThisDescriptor()) { if (containingDeclaration == context.getThisDescriptor()) {
if(!CodegenUtil.isInterface(descriptor)) { if(!CodegenUtil.isInterface(descriptor)) {
if (CodegenUtil.hasTypeInfoField(defaultType)) { if (CodegenUtil.hasTypeInfoField(defaultType)) {
v.load(0, TYPE_OBJECT); if(!(context instanceof CodegenContext.ConstructorContext)) {
v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); v.load(0, TYPE_OBJECT);
v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;");
}
else {
v.load(1, TYPE_OBJECT);
}
} }
else { else {
v.getstatic(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); v.getstatic(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;");
@@ -2603,11 +2623,11 @@ If finally block is present, its last expression is the value of try expression.
} }
else { else {
v.load(0, TYPE_OBJECT); v.load(0, TYPE_OBJECT);
v.invokeinterface("jet/JetObject", "getTypeInfo", "()Ljet/typeinfo/TypeInfo;");
while(descriptor != containingDeclaration) { while(descriptor != containingDeclaration) {
descriptor = CodegenUtil.getOuterClassDescriptor(descriptor); descriptor = CodegenUtil.getOuterClassDescriptor(descriptor);
v.invokevirtual("jet/typeinfo/TypeInfo", "getOuterTypeInfo", "()Ljet/typeinfo/TypeInfo;"); v.invokeinterface("jet/JetObject", "getOuterObject", "()Ljet/JetObject;");
} }
v.invokeinterface("jet/JetObject", "getTypeInfo", "()Ljet/typeinfo/TypeInfo;");
} }
v.aconst(ownerType); v.aconst(ownerType);
v.iconst(typeParameterDescriptor.getIndex()); v.iconst(typeParameterDescriptor.getIndex());
@@ -2737,7 +2757,7 @@ If finally block is present, its last expression is the value of try expression.
v.anew(tupleType); v.anew(tupleType);
v.dup(); v.dup();
generateTypeInfo(new ProjectionErasingJetType(bindingContext.get(BindingContext.EXPRESSION_TYPE, expression))); generateTypeInfo(new ProjectionErasingJetType(bindingContext.get(BindingContext.EXPRESSION_TYPE, expression)), null);
for (JetExpression entry : entries) { for (JetExpression entry : entries) {
gen(entry, TYPE_OBJECT); gen(entry, TYPE_OBJECT);
} }
@@ -305,8 +305,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
parameterTypes.add(typeMapper.mapType(CodegenUtil.getOuterClassDescriptor(descriptor).getDefaultType(), OwnerKind.IMPLEMENTATION)); parameterTypes.add(typeMapper.mapType(CodegenUtil.getOuterClassDescriptor(descriptor).getDefaultType(), OwnerKind.IMPLEMENTATION));
} }
List<TypeParameterDescriptor> typeParameters = descriptor.getTypeConstructor().getParameters(); if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType())) {
for (int n = typeParameters.size(); n > 0; n--) {
parameterTypes.add(JetTypeMapper.TYPE_TYPEINFO); parameterTypes.add(JetTypeMapper.TYPE_TYPEINFO);
} }
@@ -365,12 +364,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
final InstructionAdapter iv = new InstructionAdapter(mv); final InstructionAdapter iv = new InstructionAdapter(mv);
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, constructorContext, state); ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, constructorContext, state);
for(int slot = 0; slot != frameMap.getTypeParameterCount(); ++slot) { // for(int slot = 0; slot != frameMap.getTypeParameterCount(); ++slot) {
if(constructorDescriptor != null) // if(constructorDescriptor != null)
codegen.addTypeParameter(constructorDescriptor.getTypeParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO)); // codegen.addTypeParameter(constructorDescriptor.getTypeParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO));
else // else
codegen.addTypeParameter(descriptor.getTypeConstructor().getParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO)); // codegen.addTypeParameter(descriptor.getTypeConstructor().getParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO));
} // }
String classname = typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName(); String classname = typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName();
final Type classType = Type.getType("L" + classname + ";"); final Type classType = Type.getType("L" + classname + ";");
@@ -399,7 +398,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
parameterTypes.add(typeMapper.mapType(CodegenUtil.getOuterClassDescriptor(descriptor).getDefaultType(), OwnerKind.IMPLEMENTATION)); parameterTypes.add(typeMapper.mapType(CodegenUtil.getOuterClassDescriptor(descriptor).getDefaultType(), OwnerKind.IMPLEMENTATION));
} }
for(TypeProjection typeParameterDescriptor : superType.getArguments()) { for(TypeProjection typeParameterDescriptor : superType.getArguments()) {
codegen.generateTypeInfo(typeParameterDescriptor.getType()); codegen.generateTypeInfo(typeParameterDescriptor.getType(), null);
parameterTypes.add(JetTypeMapper.TYPE_TYPEINFO); parameterTypes.add(JetTypeMapper.TYPE_TYPEINFO);
} }
Method superCallMethod = new Method("<init>", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()])); Method superCallMethod = new Method("<init>", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()]));
@@ -447,10 +446,21 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
iv.load(0, classType); iv.load(0, classType);
iv.load(frameMap.getOuterThisIndex(), type); iv.load(frameMap.getOuterThisIndex(), type);
iv.putfield(classname, fieldName, interfaceDesc); iv.putfield(classname, fieldName, interfaceDesc);
Type outerType = typeMapper.mapType(outerDescriptor.getDefaultType());
MethodVisitor outer = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getOuterObject", "()Ljet/JetObject;", null, null);
outer.visitCode();
outer.visitVarInsn(Opcodes.ALOAD, 0);
outer.visitFieldInsn(Opcodes.GETFIELD, classname, "this$0", outerType.getDescriptor());
outer.visitInsn(Opcodes.ARETURN);
outer.visitMaxs(0, 0);
outer.visitEnd();
} }
if (CodegenUtil.hasTypeInfoField(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) { if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) {
generateTypeInfoInitializer(frameMap.getFirstTypeParameter(), frameMap.getTypeParameterCount(), iv); iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(frameMap.getTypeInfoIndex(), JetTypeMapper.TYPE_OBJECT);
iv.invokevirtual(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$setTypeInfo", "(Ljet/typeinfo/TypeInfo;)V");
} }
if(closure != null) { if(closure != null) {
@@ -691,46 +701,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
} }
protected void generateTypeInfoInitializer(int firstTypeParameter, int typeParamCount, InstructionAdapter iv) {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.aconst(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION));
iv.iconst(0);
if(CodegenUtil.hasOuterTypeInfo(descriptor)) {
iv.load(1, JetTypeMapper.TYPE_OBJECT);
iv.invokeinterface("jet/JetObject", "getTypeInfo", "()Ljet/typeinfo/TypeInfo;");
}
if(typeParamCount != 0) {
iv.iconst(typeParamCount);
iv.newarray(JetTypeMapper.TYPE_TYPEINFOPROJECTION);
for (int i = 0; i < typeParamCount; i++) {
iv.dup();
iv.iconst(i);
iv.load(firstTypeParameter + i, JetTypeMapper.TYPE_OBJECT);
iv.checkcast(JetTypeMapper.TYPE_TYPEINFOPROJECTION);
iv.astore(JetTypeMapper.TYPE_OBJECT);
}
if(CodegenUtil.hasOuterTypeInfo(descriptor)) {
iv.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;ZLjet/typeinfo/TypeInfo;[Ljet/typeinfo/TypeInfoProjection;)Ljet/typeinfo/TypeInfo;");
}
else
iv.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z[Ljet/typeinfo/TypeInfoProjection;)Ljet/typeinfo/TypeInfo;");
}
else {
if(CodegenUtil.hasOuterTypeInfo(descriptor)) {
iv.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;ZLjet/typeinfo/TypeInfo;)Ljet/typeinfo/TypeInfo;");
}
else
iv.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/typeinfo/TypeInfo;");
}
iv.invokevirtual(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$setTypeInfo", "(Ljet/typeinfo/TypeInfo;)V");
}
protected void generateInitializers(ExpressionCodegen codegen, InstructionAdapter iv) { protected void generateInitializers(ExpressionCodegen codegen, InstructionAdapter iv) {
for (JetDeclaration declaration : myClass.getDeclarations()) { for (JetDeclaration declaration : myClass.getDeclarations()) {
if (declaration instanceof JetProperty) { if (declaration instanceof JetProperty) {
@@ -827,15 +797,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return; return;
JetType defaultType = descriptor.getDefaultType(); JetType defaultType = descriptor.getDefaultType();
if(CodegenUtil.hasTypeInfoField(defaultType)) { if(CodegenUtil.requireTypeInfoConstructorArg(defaultType)) {
if(!CodegenUtil.hasDerivedTypeInfoField(defaultType, true)) { if(!CodegenUtil.hasDerivedTypeInfoField(defaultType)) {
v.newField(myClass, Opcodes.ACC_PROTECTED, "$typeInfo", "Ljet/typeinfo/TypeInfo;", null, null); v.newField(myClass, Opcodes.ACC_PROTECTED, "$typeInfo", "Ljet/typeinfo/TypeInfo;", null, null);
MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/typeinfo/TypeInfo;", null, null); MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/typeinfo/TypeInfo;", null, null);
InstructionAdapter iv = null;
if (v.generateCode()) { if (v.generateCode()) {
mv.visitCode(); mv.visitCode();
iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.getfield(owner, "$typeInfo", "Ljet/typeinfo/TypeInfo;"); iv.getfield(owner, "$typeInfo", "Ljet/typeinfo/TypeInfo;");
@@ -847,7 +816,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
mv = v.newMethod(myClass, Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL, "$setTypeInfo", "(Ljet/typeinfo/TypeInfo;)V", null, null); mv = v.newMethod(myClass, Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL, "$setTypeInfo", "(Ljet/typeinfo/TypeInfo;)V", null, null);
if (v.generateCode()) { if (v.generateCode()) {
mv.visitCode(); mv.visitCode();
iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(1, JetTypeMapper.TYPE_OBJECT); iv.load(1, JetTypeMapper.TYPE_OBJECT);
@@ -884,14 +853,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
public void generate(InstructionAdapter v) { public void generate(InstructionAdapter v) {
v.aconst(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION)); v.aconst(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION));
v.iconst(0); v.iconst(0);
ClassDescriptor outerClassDescriptor = CodegenUtil.getOuterClassDescriptor(descriptor); v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/typeinfo/TypeInfo;");
if(outerClassDescriptor == null || CodegenUtil.isClassObject(descriptor)) {
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/typeinfo/TypeInfo;");
}
else {
v.getstatic(typeMapper.mapType(outerClassDescriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;");
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;ZLjet/typeinfo/TypeInfo;)Ljet/typeinfo/TypeInfo;");
}
v.putstatic(typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName(), "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;"); v.putstatic(typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName(), "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;");
} }
}); });
@@ -86,7 +86,11 @@ public class JetTypeMapper {
public static final Type TYPE_LONG_ITERATOR = Type.getObjectType("jet/LongIterator"); public static final Type TYPE_LONG_ITERATOR = Type.getObjectType("jet/LongIterator");
public static final Type TYPE_FLOAT_ITERATOR = Type.getObjectType("jet/FloatIterator"); public static final Type TYPE_FLOAT_ITERATOR = Type.getObjectType("jet/FloatIterator");
public static final Type TYPE_DOUBLE_ITERATOR = Type.getObjectType("jet/DoubleIterator"); public static final Type TYPE_DOUBLE_ITERATOR = Type.getObjectType("jet/DoubleIterator");
public JetStandardLibrary getStandardLibrary() {
return standardLibrary;
}
public JetTypeMapper(JetStandardLibrary standardLibrary, BindingContext bindingContext) { public JetTypeMapper(JetStandardLibrary standardLibrary, BindingContext bindingContext) {
this.standardLibrary = standardLibrary; this.standardLibrary = standardLibrary;
this.bindingContext = bindingContext; this.bindingContext = bindingContext;
@@ -575,10 +579,8 @@ public class JetTypeMapper {
parameterTypes.add(mapType(CodegenUtil.getOuterClassDescriptor(classDescriptor).getDefaultType(), OwnerKind.IMPLEMENTATION)); parameterTypes.add(mapType(CodegenUtil.getOuterClassDescriptor(classDescriptor).getDefaultType(), OwnerKind.IMPLEMENTATION));
} }
List<TypeParameterDescriptor> typeParameters = classDescriptor.getTypeConstructor().getParameters(); if (CodegenUtil.requireTypeInfoConstructorArg(classDescriptor.getDefaultType())) {
for (TypeParameterDescriptor typeParameter : typeParameters) { parameterTypes.add(TYPE_TYPEINFO);
if(typeParameter.isReified())
parameterTypes.add(TYPE_TYPEINFO);
} }
for (ValueParameterDescriptor parameter : parameters) { for (ValueParameterDescriptor parameter : parameters) {
@@ -6,6 +6,7 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor; import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor;
import org.jetbrains.jet.lang.types.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lang.types.TypeProjection;
import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.TypeUtils;
@@ -145,7 +146,7 @@ public class NamespaceCodegen {
} }
DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor(); DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor();
if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor)) { if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor) && !JetStandardClasses.getAny().equals(declarationDescriptor)) {
// TODO: we need some better checks here // TODO: we need some better checks here
v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;");
return; return;
@@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.lexer.JetTokens;
import org.objectweb.asm.Label; import org.objectweb.asm.Label;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
@@ -629,7 +630,7 @@ public abstract class StackValue {
for (TypeParameterDescriptor typeParameterDescriptor : setterDescriptor.getOriginal().getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : setterDescriptor.getOriginal().getTypeParameters()) {
if(typeParameterDescriptor.isReified()) { if(typeParameterDescriptor.isReified()) {
codegen.generateTypeInfo(resolvedSetCall.getTypeArguments().get(typeParameterDescriptor)); codegen.generateTypeInfo(resolvedSetCall.getTypeArguments().get(typeParameterDescriptor), null);
} }
} }
@@ -1010,7 +1011,8 @@ public abstract class StackValue {
return codegen.typeMapper.mapType(callableMethod.getReceiverClass()); return codegen.typeMapper.mapType(callableMethod.getReceiverClass());
} }
else { else {
return codegen.typeMapper.mapType(callableMethod.getThisType()); JetType thisType = callableMethod.getThisType();
return codegen.typeMapper.mapType(thisType);
} }
} }
else { else {
@@ -5,14 +5,12 @@ import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetCallExpression; import org.jetbrains.jet.lang.psi.JetCallExpression;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.jet.lang.types.JetType;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.InstructionAdapter;
@@ -30,7 +28,7 @@ public class ArrayIterator implements IntrinsicMethod {
ClassDescriptor containingDeclaration = (ClassDescriptor) funDescriptor.getContainingDeclaration().getOriginal(); ClassDescriptor containingDeclaration = (ClassDescriptor) funDescriptor.getContainingDeclaration().getOriginal();
JetStandardLibrary standardLibrary = codegen.getState().getStandardLibrary(); JetStandardLibrary standardLibrary = codegen.getState().getStandardLibrary();
if(containingDeclaration.equals(standardLibrary.getArray())) { if(containingDeclaration.equals(standardLibrary.getArray())) {
codegen.generateTypeInfo(funDescriptor.getReturnType().getArguments().get(0).getType()); codegen.generateTypeInfo(funDescriptor.getReturnType().getArguments().get(0).getType(), null);
v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;Ljet/typeinfo/TypeInfo;)Ljet/Iterator;"); v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;Ljet/typeinfo/TypeInfo;)Ljet/Iterator;");
return StackValue.onStack(JetTypeMapper.TYPE_ITERATOR); return StackValue.onStack(JetTypeMapper.TYPE_ITERATOR);
} }
@@ -1,4 +1,5 @@
class A() {} class A() {}
open class B<T>() { open class B<T>() {
fun isT (a : Any?) : Boolean { fun isT (a : Any?) : Boolean {
return a is T return a is T
@@ -167,7 +168,6 @@ fun t26 () : Boolean {
} }
fun box() : String { fun box() : String {
/*
if(!t1()) { if(!t1()) {
return "t1 failed" return "t1 failed"
} }
@@ -243,7 +243,6 @@ fun box() : String {
if(!t25()) { if(!t25()) {
return "t25 failed" return "t25 failed"
} }
*/
if(!t26()) { if(!t26()) {
return "t26 failed" return "t26 failed"
} }
@@ -0,0 +1,13 @@
class A() {
var x : Int = 0
var z = { () =>
x++
}
}
fun box() : String {
val a = A()
a.z() //problem is here
return if (a.x == 1) "OK" else "fail"
}
@@ -1,4 +1,4 @@
open class A<T> () { open class A<out T> () {
fun plus(e: T) = B<T> (e) fun plus(e: T) = B<T> (e)
} }
@@ -6,4 +6,6 @@ class B<T> (val e: T) : A<T>() {
fun add() = B<T> (e) fun add() = B<T> (e)
} }
fun box() = if( A<String>().plus("239").add().e == "239" ) "OK" else "fail" fun box() : String {
return if(A<String>().plus("239").add().e == "239" ) "OK" else "fail"
}
@@ -4,7 +4,6 @@ class Box<T>() {
} }
class Inner2() : Inner() { class Inner2() : Inner() {
} }
fun inner() = Inner2() fun inner() = Inner2()
@@ -24,7 +24,7 @@ public class ClassGenTest extends CodegenTestCase {
public void testArrayListInheritance() throws Exception { public void testArrayListInheritance() throws Exception {
loadFile("classes/inheritingFromArrayList.jet"); loadFile("classes/inheritingFromArrayList.jet");
System.out.println(generateToText());
final Class aClass = loadClass("Foo", generateClassesInFile()); final Class aClass = loadClass("Foo", generateClassesInFile());
assertInstanceOf(aClass.newInstance(), List.class); assertInstanceOf(aClass.newInstance(), List.class);
} }
@@ -81,6 +81,10 @@ public class FunctionGenTest extends CodegenTestCase {
blackBoxFile("regressions/kt395.jet"); blackBoxFile("regressions/kt395.jet");
} }
public void testKt785 () {
// blackBoxFile("regressions/kt785.jet");
}
public void testFunction () throws InvocationTargetException, IllegalAccessException { public void testFunction () throws InvocationTargetException, IllegalAccessException {
blackBoxFile("functions/functionExpression.jet"); blackBoxFile("functions/functionExpression.jet");
} }
@@ -140,7 +140,7 @@ public class TypeInfoTest extends CodegenTestCase {
public void testInner() throws Exception { public void testInner() throws Exception {
blackBoxFile("typeInfo/inner.jet"); blackBoxFile("typeInfo/inner.jet");
// System.out.println(generateToText()); System.out.println(generateToText());
} }
public void testInheritance() throws Exception { public void testInheritance() throws Exception {
@@ -148,4 +148,3 @@ public class TypeInfoTest extends CodegenTestCase {
System.out.println(generateToText()); System.out.println(generateToText());
} }
} }
+86
View File
@@ -0,0 +1,86 @@
import java.util.NoSuchElementException;
abstract public class FList<T> {
abstract T getHead();
abstract FList<T> getTail();
abstract FList<T> plus(T element);
static class Empty<T> extends FList<T> {
@Override
T getHead() {
throw new NoSuchElementException();
}
@Override
FList<T> getTail() {
throw new NoSuchElementException();
}
@Override
FList<T> plus(T element) {
return new OneElementList<T>(element);
}
}
static class OneElementList<T> extends FList<T> {
private T element;
public OneElementList(T element) {
super();
this.element = element;
}
@Override
T getHead() {
return element;
}
@Override
FList<T> getTail() {
return new Empty<T>();
}
@Override
FList<T> plus(T element) {
return new StandardList<T>(element, this);
}
}
private static class StandardList<T> extends FList<T> {
private T head;
private FList<T> tail;
public StandardList(T head, FList<T> tail) {
this.head = head;
this.tail = tail;
}
@Override
T getHead() {
return head;
}
@Override
FList<T> getTail() {
return tail;
}
@Override
FList<T> plus(T element) {
return new StandardList<T>(element, this);
}
}
public static void main(String[] args) {
for(int k = 0; k != 10; ++k) {
long start = System.currentTimeMillis();
FList<Integer> list = new Empty();
for(int i = 0; i != 5000000; ++i)
list = list.plus(i);
System.out.println(System.currentTimeMillis()-start);
}
}
}
+70
View File
@@ -0,0 +1,70 @@
namespace flist
abstract class FList<T> {
abstract val head : T
abstract val tail : FList<T>
abstract fun plus(element: T) : FList<T>
}
class EmptyFList<T>() : FList<T> {
override val head: T
get() = throw java.util.NoSuchElementException()
override val tail : EmptyFList<T>
get() = EmptyFList<T>()
override fun plus(element: T) : FList<T> = OneElementFList<T>(element)
}
class OneElementFList<T> (override val head: T): FList<T> {
override val tail : EmptyFList<T>
get() = EmptyFList<T>()
override fun plus(element: T) : FList<T> = StandardFList<T>(element, this)
}
class StandardFList<T> (override val head: T, override val tail: FList<T>) : FList<T> {
override fun plus(element: T) : FList<T> = StandardFList<T>(element, this)
}
fun <T> FList<T>.plus2(element: T): FList<T> =
when(this) {
is EmptyFList<T> => OneElementFList<T>(element)
else => StandardFList<T>(element, this)
}
fun <T> FList<T>.plus3(element: T) : FList<T> =
if(this is EmptyFList<*>)
OneElementFList<T>(element)
else
StandardFList<T>(element, this)
fun main(args: Array<String>) {
for(k in 0..3) {
val start0 = System.currentTimeMillis()
var flist0 : FList<Int> = EmptyFList<Int>()
for(i in 0..5000000)
flist0 = flist0 + i
System.out?.println(System.currentTimeMillis() - start0)
val start = System.currentTimeMillis()
var flist : FList<Int> = EmptyFList<Int>()
for(i in 0..5000000)
flist = flist.plus2(i)
System.out?.println(System.currentTimeMillis() - start)
val start2 = System.currentTimeMillis()
var flist2 : FList<Int> = EmptyFList<Int>()
for(i in 0..5000000)
flist2 = flist2.plus3(i)
System.out?.println(System.currentTimeMillis() - start2)
System.out?.println()
}
}
+5
View File
@@ -23,4 +23,9 @@ public class DefaultJetObject implements JetObject {
public final TypeInfo<?> getTypeInfo() { public final TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
+11 -1
View File
@@ -47,7 +47,12 @@ public final class IntRange implements Range<Integer>, Iterable<Integer>, JetObj
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
public static IntRange count(int length) { public static IntRange count(int length) {
return new IntRange(0, length); return new IntRange(0, length);
} }
@@ -95,5 +100,10 @@ public final class IntRange implements Range<Integer>, Iterable<Integer>, JetObj
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
} }
+2
View File
@@ -4,7 +4,9 @@ import jet.typeinfo.TypeInfo;
/** /**
* @author abreslav * @author abreslav
* @author alex.tkachman
*/ */
public interface JetObject { public interface JetObject {
TypeInfo<?> getTypeInfo(); TypeInfo<?> getTypeInfo();
JetObject getOuterObject();
} }
+10
View File
@@ -48,6 +48,11 @@ public final class LongRange implements Range<Long>, Iterable<Long>, JetObject {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
public static IntRange count(int length) { public static IntRange count(int length) {
return new IntRange(0, length); return new IntRange(0, length);
} }
@@ -95,5 +100,10 @@ public final class LongRange implements Range<Long>, Iterable<Long>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
} }
+5
View File
@@ -31,4 +31,9 @@ public class Tuple0 implements JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
+45
View File
@@ -39,6 +39,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return TypeInfo.getTypeInfo(GenericIterator.class, false, null, new TypeInfoProjection[] {(TypeInfoProjection) elementTypeInfo}); return TypeInfo.getTypeInfo(GenericIterator.class, false, null, new TypeInfoProjection[] {(TypeInfoProjection) elementTypeInfo});
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static <T> Iterator<T> iterator(T[] array, TypeInfo elementTypeInfo) { public static <T> Iterator<T> iterator(T[] array, TypeInfo elementTypeInfo) {
@@ -69,6 +74,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static ByteIterator iterator(byte[] array) { public static ByteIterator iterator(byte[] array) {
@@ -99,6 +109,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static ShortIterator iterator(short[] array) { public static ShortIterator iterator(short[] array) {
@@ -129,6 +144,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static IntIterator iterator(int[] array) { public static IntIterator iterator(int[] array) {
@@ -159,6 +179,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static LongIterator iterator(long[] array) { public static LongIterator iterator(long[] array) {
@@ -189,6 +214,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static FloatIterator iterator(float[] array) { public static FloatIterator iterator(float[] array) {
@@ -219,6 +249,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static DoubleIterator iterator(double[] array) { public static DoubleIterator iterator(double[] array) {
@@ -249,6 +284,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static CharIterator iterator(char[] array) { public static CharIterator iterator(char[] array) {
@@ -279,6 +319,11 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
public TypeInfo<?> getTypeInfo() { public TypeInfo<?> getTypeInfo() {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
} }
public static BooleanIterator iterator(boolean[] array) { public static BooleanIterator iterator(boolean[] array) {
+10
View File
@@ -181,6 +181,11 @@ public abstract class TypeInfo<T> implements JetObject {
throw new UnsupportedOperationException("Abstract TypeInfo"); throw new UnsupportedOperationException("Abstract TypeInfo");
} }
@Override
public JetObject getOuterObject() {
return null;
}
@Override @Override
public String toString() { public String toString() {
return "T:" + signature.klazz.getName() + ":" + varIndex; return "T:" + signature.klazz.getName() + ":" + varIndex;
@@ -388,6 +393,11 @@ public abstract class TypeInfo<T> implements JetObject {
return typeInfo; return typeInfo;
} }
@Override
public JetObject getOuterObject() {
return null;
}
public final boolean isSubtypeOf(TypeInfoImpl<?> superType) { public final boolean isSubtypeOf(TypeInfoImpl<?> superType) {
if (nullable && !superType.nullable) { if (nullable && !superType.nullable) {
return false; return false;