Refactor ClosureCodegen

- make several commonly used parameters ClosureCodegen's fields
- take an arbitrary strategy for closure function body codegen
- don't make extra binding context lookups
This commit is contained in:
Alexander Udalov
2013-04-15 19:38:35 +04:00
parent 80b78f0f6d
commit db65237989
2 changed files with 6 additions and 21 deletions
@@ -35,7 +35,6 @@ import org.jetbrains.jet.codegen.state.GenerationStateAware;
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.psi.JetDeclarationWithBody;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
@@ -291,7 +290,6 @@ public class ClosureCodegen extends GenerationStateAware {
@NotNull
private String getGenericSignature() {
// TODO: obtain the correct funDescriptor and use BothSignatureWriter instead of this code
SignatureWriter signatureWriter = new SignatureWriter();
JvmClassName funClass = getFunctionImplClassName(funDescriptor);
signatureWriter.visitClassType(funClass.getInternalName());
@@ -53,7 +53,6 @@ import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor;
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.sam.SingleAbstractMethodUtils;
@@ -1250,27 +1249,15 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
private StackValue genClosure(JetDeclarationWithBody declaration, @Nullable ClassDescriptor samInterfaceClass) {
FunctionDescriptor descriptor = bindingContext.get(BindingContext.FUNCTION, declaration);
assert descriptor != null : "Function is not resolved to descriptor: " + declaration.getText();
ClassDescriptor classDescriptor = anonymousClassForFunction(bindingContext, descriptor);
CalculatedClosure closure = bindingContext.get(CLOSURE, classDescriptor);
assert closure != null : "Closure must be calculated for class: " + classDescriptor;
ClosureCodegen closureCodegen = new ClosureCodegen(state, (MutableClosure) closure, samInterfaceClass, declaration, context, this);
JvmClassName closureSuperClass = samInterfaceClass == null ? getFunctionImplClassName(descriptor) : JvmClassName.byType(OBJECT_TYPE);
ClosureCodegen closureCodegen = new ClosureCodegen(state, declaration, descriptor, samInterfaceClass, closureSuperClass, context,
this, new FunctionGenerationStrategy.Default(state, declaration));
closureCodegen.gen();
JvmClassName className = closureCodegen.getGeneratedClassName();
Type asmType = className.getAsmType();
if (isConst(closure)) {
v.getstatic(className.getInternalName(), JvmAbi.INSTANCE_FIELD, className.getDescriptor());
}
else {
v.anew(asmType);
v.dup();
Method cons = closureCodegen.getGeneratedConstructor();
pushClosureOnStack(closure, false);
v.invokespecial(className.getInternalName(), "<init>", cons.getDescriptor());
}
return StackValue.onStack(asmType);
return closureCodegen.putInstanceOnStack(v, this);
}
@Override