Minor refactoring in callable reference codegen

Don't store an extra field for functionDescriptor, since it's available from
the superclass as "callableDescriptor". Store a referenced function descriptor
instead
This commit is contained in:
Alexander Udalov
2013-12-19 18:18:39 +04:00
parent 00cad9df91
commit 07648583ed
@@ -2429,9 +2429,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return closureCodegen.putInstanceOnStack(v, this); return closureCodegen.putInstanceOnStack(v, this);
} }
private static class CallableReferenceGenerationStrategy extends FunctionGenerationStrategy.CodegenBased<CallableDescriptor> { private static class CallableReferenceGenerationStrategy extends FunctionGenerationStrategy.CodegenBased<FunctionDescriptor> {
private final FunctionDescriptor functionDescriptor;
private final ResolvedCall<? extends CallableDescriptor> resolvedCall; private final ResolvedCall<? extends CallableDescriptor> resolvedCall;
private final FunctionDescriptor referencedFunction;
public CallableReferenceGenerationStrategy( public CallableReferenceGenerationStrategy(
@NotNull GenerationState state, @NotNull GenerationState state,
@@ -2439,8 +2439,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@NotNull ResolvedCall<? extends CallableDescriptor> resolvedCall @NotNull ResolvedCall<? extends CallableDescriptor> resolvedCall
) { ) {
super(state, functionDescriptor); super(state, functionDescriptor);
this.functionDescriptor = functionDescriptor;
this.resolvedCall = resolvedCall; this.resolvedCall = resolvedCall;
this.referencedFunction = (FunctionDescriptor) resolvedCall.getResultingDescriptor();
} }
@Override @Override
@@ -2453,14 +2453,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
every argument boils down to calling LOAD with the corresponding index every argument boils down to calling LOAD with the corresponding index
*/ */
FunctionDescriptor referencedFunction = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); JetCallExpression fakeExpression = constructFakeFunctionCall();
JetCallExpression fakeExpression = constructFakeFunctionCall(referencedFunction);
final List<? extends ValueArgument> fakeArguments = fakeExpression.getValueArguments(); final List<? extends ValueArgument> fakeArguments = fakeExpression.getValueArguments();
final ReceiverValue thisObject = computeAndSaveReceiver(signature, codegen, referencedFunction.getExpectedThisObject()); final ReceiverValue thisObject = computeAndSaveReceiver(signature, codegen, referencedFunction.getExpectedThisObject());
final ReceiverValue extensionReceiver = computeAndSaveReceiver(signature, codegen, referencedFunction.getReceiverParameter()); final ReceiverValue extensionReceiver = computeAndSaveReceiver(signature, codegen, referencedFunction.getReceiverParameter());
computeAndSaveArguments(codegen.myFrameMap, fakeArguments, codegen); computeAndSaveArguments(fakeArguments, codegen);
ResolvedCall<CallableDescriptor> fakeResolvedCall = new DelegatingResolvedCall<CallableDescriptor>(resolvedCall) { ResolvedCall<CallableDescriptor> fakeResolvedCall = new DelegatingResolvedCall<CallableDescriptor>(resolvedCall) {
@NotNull @NotNull
@@ -2490,9 +2488,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type returnType = codegen.returnType; Type returnType = codegen.returnType;
if (referencedFunction instanceof ConstructorDescriptor) { if (referencedFunction instanceof ConstructorDescriptor) {
if (returnType.getSort() == Type.ARRAY) { if (returnType.getSort() == Type.ARRAY) {
JetType returnJetType = referencedFunction.getReturnType(); //noinspection ConstantConditions
assert returnJetType != null; codegen.generateNewArray(fakeExpression, referencedFunction.getReturnType());
codegen.generateNewArray(fakeExpression, returnJetType);
result = StackValue.onStack(returnType); result = StackValue.onStack(returnType);
} }
else { else {
@@ -2510,7 +2507,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
@NotNull @NotNull
private JetCallExpression constructFakeFunctionCall(@NotNull CallableDescriptor referencedFunction) { private JetCallExpression constructFakeFunctionCall() {
StringBuilder fakeFunctionCall = new StringBuilder("callableReferenceFakeCall("); StringBuilder fakeFunctionCall = new StringBuilder("callableReferenceFakeCall(");
for (Iterator<ValueParameterDescriptor> iterator = referencedFunction.getValueParameters().iterator(); iterator.hasNext(); ) { for (Iterator<ValueParameterDescriptor> iterator = referencedFunction.getValueParameters().iterator(); iterator.hasNext(); ) {
ValueParameterDescriptor descriptor = iterator.next(); ValueParameterDescriptor descriptor = iterator.next();
@@ -2523,15 +2520,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return (JetCallExpression) JetPsiFactory.createExpression(state.getProject(), fakeFunctionCall.toString()); return (JetCallExpression) JetPsiFactory.createExpression(state.getProject(), fakeFunctionCall.toString());
} }
private void computeAndSaveArguments( private void computeAndSaveArguments(@NotNull List<? extends ValueArgument> fakeArguments, @NotNull ExpressionCodegen codegen) {
@NotNull FrameMap frameMap, for (ValueParameterDescriptor parameter : callableDescriptor.getValueParameters()) {
@NotNull List<? extends ValueArgument> fakeArguments,
@NotNull ExpressionCodegen codegen
) {
for (ValueParameterDescriptor parameter : functionDescriptor.getValueParameters()) {
ValueArgument fakeArgument = fakeArguments.get(parameter.getIndex()); ValueArgument fakeArgument = fakeArguments.get(parameter.getIndex());
Type type = state.getTypeMapper().mapType(parameter); Type type = state.getTypeMapper().mapType(parameter);
int localIndex = frameMap.getIndex(parameter); int localIndex = codegen.myFrameMap.getIndex(parameter);
codegen.tempVariables.put(fakeArgument.getArgumentExpression(), StackValue.local(localIndex, type)); codegen.tempVariables.put(fakeArgument.getArgumentExpression(), StackValue.local(localIndex, type));
} }
} }