Merge remote branch 'origin/master'

This commit is contained in:
Andrey Breslav
2011-12-12 20:50:11 +04:00
8 changed files with 28 additions and 9 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
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.StdlibNames;
import org.jetbrains.jet.lang.resolve.calls.*; import org.jetbrains.jet.lang.resolve.calls.*;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor; import org.jetbrains.jet.lang.resolve.java.JavaClassDescriptor;
@@ -2199,7 +2200,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
if(getterDescriptor.getReceiverParameter().exists()) { if(getterDescriptor.getReceiverParameter().exists()) {
index++; index++;
} }
for (TypeParameterDescriptor typeParameterDescriptor : getterDescriptor.getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : resolvedGetCall.getCandidateDescriptor().getTypeParameters()) {
if(typeParameterDescriptor.isReified()) { if(typeParameterDescriptor.isReified()) {
generateTypeInfo(resolvedGetCall.getTypeArguments().get(typeParameterDescriptor), null); generateTypeInfo(resolvedGetCall.getTypeArguments().get(typeParameterDescriptor), null);
index++; index++;
@@ -2618,16 +2619,16 @@ 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;"); v.invokeinterface(StdlibNames.JET_OBJECT_TYPE.getInternalName(), "getTypeInfo", "()Ljet/typeinfo/TypeInfo;");
} }
} }
else { else {
v.load(0, TYPE_OBJECT); v.load(0, TYPE_OBJECT);
while(descriptor != containingDeclaration) { while(descriptor != containingDeclaration) {
descriptor = CodegenUtil.getOuterClassDescriptor(descriptor); descriptor = CodegenUtil.getOuterClassDescriptor(descriptor);
v.invokeinterface("jet/JetObject", "getOuterObject", "()Ljet/JetObject;"); v.invokeinterface(StdlibNames.JET_OBJECT_TYPE.getInternalName(), "getOuterObject", "()Ljet/JetObject;");
} }
v.invokeinterface("jet/JetObject", "getTypeInfo", "()Ljet/typeinfo/TypeInfo;"); v.invokeinterface(StdlibNames.JET_OBJECT_TYPE.getInternalName(), "getTypeInfo", "()Ljet/typeinfo/TypeInfo;");
} }
v.aconst(ownerType); v.aconst(ownerType);
v.iconst(typeParameterDescriptor.getIndex()); v.iconst(typeParameterDescriptor.getIndex());
@@ -6,6 +6,7 @@ import org.jetbrains.jet.lang.descriptors.*;
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.OverridingUtil; import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.StdlibNames;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
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;
@@ -59,7 +60,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
getSuperClass(); getSuperClass();
List<String> interfaces = new ArrayList<String>(); List<String> interfaces = new ArrayList<String>();
interfaces.add("jet/JetObject"); interfaces.add(StdlibNames.JET_OBJECT_TYPE.getInternalName());
interfaces.addAll(getSuperInterfaces(myClass)); interfaces.addAll(getSuperInterfaces(myClass));
boolean isAbstract = false; boolean isAbstract = false;
@@ -5,6 +5,7 @@ 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.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.StdlibNames;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.InstructionAdapter;
@@ -17,7 +18,7 @@ public class ValueTypeInfo implements IntrinsicMethod {
@Override @Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) { public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) {
codegen.gen(arguments.get(0), JetTypeMapper.TYPE_JET_OBJECT); codegen.gen(arguments.get(0), JetTypeMapper.TYPE_JET_OBJECT);
v.invokeinterface("jet/JetObject", "getTypeInfo", "()Ljet/typeinfo/TypeInfo;"); v.invokeinterface(StdlibNames.JET_OBJECT_TYPE.getInternalName(), "getTypeInfo", "()Ljet/typeinfo/TypeInfo;");
return StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO); return StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO);
} }
} }
@@ -29,4 +29,8 @@ public class StdlibNames {
public static final String JET_METHOD_NULLABLE_RETURN_TYPE_FIELD = "nullableReturnType"; public static final String JET_METHOD_NULLABLE_RETURN_TYPE_FIELD = "nullableReturnType";
public static final Type JET_OBJECT_TYPE = Type.getObjectType("jet/JetObject");
public static final String JET_OBJECT_CLASS = "jet.JetObject";
public static final String JET_OBJECT_DESCRIPTOR = "Ljet/JetObject;";
} }
@@ -13,11 +13,11 @@ import java.util.Map;
* @author abreslav * @author abreslav
*/ */
public interface ResolvedCall<D extends CallableDescriptor> { public interface ResolvedCall<D extends CallableDescriptor> {
/** A target callable descriptor as it was accessible in the corresponding scope, i.e. with type parameters not substituted */ /** A target callable descriptor as it was accessible in the corresponding scope, i.e. with type arguments not substituted */
@NotNull @NotNull
D getCandidateDescriptor(); D getCandidateDescriptor();
/** Type parameters are substituted */ /** Type arguments are substituted. This descriptor is guaranteed to have NO declared type parameters */
@NotNull @NotNull
D getResultingDescriptor(); D getResultingDescriptor();
@@ -203,7 +203,7 @@ public class ErrorUtils {
} }
public static boolean isError(@NotNull DeclarationDescriptor candidate) { public static boolean isError(@NotNull DeclarationDescriptor candidate) {
return candidate.getContainingDeclaration() == getErrorClass() || candidate == ERROR_MODULE; return candidate == getErrorClass() || candidate.getContainingDeclaration() == getErrorClass() || candidate == ERROR_MODULE;
} }
private static class ErrorTypeImpl implements JetType { private static class ErrorTypeImpl implements JetType {
@@ -0,0 +1,8 @@
fun <T> Array<T>?.get(i : Int?) = this.sure().get(i.sure())
fun <T> array(vararg t : T) : Array<T> = t
fun box() : String {
val a : Array<String>? = array<String>("Str", "Str2")
val i : Int? = 1
return if(a[i] == "Str2") "OK" else "fail"
}
@@ -74,4 +74,8 @@ public class VarArgTest extends CodegenTestCase {
createEnvironmentWithFullJdk(); createEnvironmentWithFullJdk();
blackBoxFile("regressions/kt581.jet"); blackBoxFile("regressions/kt581.jet");
} }
public void testKt797() {
blackBoxFile("regressions/kt796_797.jet");
}
} }