Fix for local closures

This commit is contained in:
Mikhael Bogdanov
2013-03-26 14:30:32 +04:00
parent 9091becbea
commit 932c1444a2
6 changed files with 67 additions and 1 deletions
@@ -40,6 +40,7 @@ import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.codegen.state.JetTypeMapperMode;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
@@ -1232,6 +1233,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
}
constructorContext.lookupInContext(descriptor, null, state, true);
} else if (descriptor instanceof CallableMemberDescriptor) {
MutableClassDescriptor classDescriptor =
(MutableClassDescriptor) constructorContext.getParentContext().getContextDescriptor();
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getAllCallableMembers()) {
if (descriptor.equals(memberDescriptor)) {
return;
}
}
constructorContext.lookupInContext(descriptor, null, state, true);
}
}
@@ -16,6 +16,8 @@
package org.jetbrains.jet.codegen.context;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.OwnerKind;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
@@ -29,7 +31,7 @@ public class ConstructorContext extends MethodContext {
public ConstructorContext(
ConstructorDescriptor contextDescriptor,
OwnerKind kind,
CodegenContext parent
@NotNull CodegenContext parent
) {
super(contextDescriptor, kind, parent);
@@ -46,4 +48,11 @@ public class ConstructorContext extends MethodContext {
public String toString() {
return "Constructor: " + getContextDescriptor().getName();
}
@NotNull
@Override
public CodegenContext getParentContext() {
//noinspection ConstantConditions
return super.getParentContext();
}
}
@@ -816,6 +816,16 @@ public class JetTypeMapper extends BindingTraceAware {
signatureWriter.writeAsmType(sharedVarType, false);
signatureWriter.writeParameterTypeEnd();
}
else if (isLocalNamedFun(bindingContext, variableDescriptor)) {
Type type = classNameForAnonymousClass(
bindingContext,
(JetElement) BindingContextUtils.descriptorToDeclaration(bindingContext, variableDescriptor)
).getAsmType();
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE);
signatureWriter.writeAsmType(type, false);
signatureWriter.writeParameterTypeEnd();
}
}
JetDelegatorToSuperCall superCall = closure.getSuperCall();