Simplify ExpressionCodegen#generateConstructorCall

Don't go through StackValue.CallReceiver because it handles a variety of cases
when a callable descriptor has a receiver argument, an expected this object, or
both. Constructors can't have receiver arguments, so the resulting code is
greatly simplified
This commit is contained in:
Alexander Udalov
2014-07-09 18:29:31 +04:00
parent 62ce4a034b
commit 04b54e9cb7
@@ -1937,7 +1937,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
funDescriptor = accessibleFunctionDescriptor((FunctionDescriptor) funDescriptor); funDescriptor = accessibleFunctionDescriptor((FunctionDescriptor) funDescriptor);
if (funDescriptor instanceof ConstructorDescriptor) { if (funDescriptor instanceof ConstructorDescriptor) {
return generateNewCall(expression, resolvedCall, receiver); return generateNewCall(expression, resolvedCall);
} }
if (funDescriptor.getOriginal() instanceof SamConstructorDescriptor) { if (funDescriptor.getOriginal() instanceof SamConstructorDescriptor) {
@@ -2537,7 +2537,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
result = StackValue.onStack(returnType); result = StackValue.onStack(returnType);
} }
else { else {
result = codegen.generateConstructorCall(fakeResolvedCall, StackValue.none(), returnType); result = codegen.generateConstructorCall(fakeResolvedCall, returnType);
} }
} }
else { else {
@@ -3233,39 +3233,37 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
@NotNull @NotNull
private StackValue generateNewCall( private StackValue generateNewCall(@NotNull JetCallExpression expression, @NotNull ResolvedCall<?> resolvedCall) {
@NotNull JetCallExpression expression,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull StackValue receiver
) {
Type type = expressionType(expression); Type type = expressionType(expression);
if (type.getSort() == Type.ARRAY) { if (type.getSort() == Type.ARRAY) {
generateNewArray(expression); generateNewArray(expression);
return StackValue.onStack(type); return StackValue.onStack(type);
} }
return generateConstructorCall(resolvedCall, receiver, type); return generateConstructorCall(resolvedCall, type);
} }
@NotNull @NotNull
private StackValue generateConstructorCall(@NotNull ResolvedCall<?> resolvedCall, @NotNull StackValue receiver, @NotNull Type type) { private StackValue generateConstructorCall(@NotNull ResolvedCall<?> resolvedCall, @NotNull Type type) {
v.anew(type); v.anew(type);
v.dup(); v.dup();
receiver = StackValue.receiver(resolvedCall, receiver, this, null); ConstructorDescriptor constructor = (ConstructorDescriptor) resolvedCall.getResultingDescriptor();
receiver.put(receiver.type, v);
ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) resolvedCall.getResultingDescriptor(); ReceiverParameterDescriptor expectedThisObject = constructor.getExpectedThisObject();
MutableClosure closure = bindingContext.get(CLOSURE, constructorDescriptor.getContainingDeclaration()); if (expectedThisObject != null) {
Type receiverType = typeMapper.mapType(expectedThisObject.getType());
generateReceiverValue(resolvedCall.getThisObject(), receiverType);
}
//Resolved call to local class constructor doesn't have resolvedCall.getThisObject() and resolvedCall.getReceiverArgument() MutableClosure closure = bindingContext.get(CLOSURE, constructor.getContainingDeclaration());
//so we need generate closure on stack
//See StackValue.receiver for more info
pushClosureOnStack(closure, resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists(),
defaultCallGenerator);
ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(constructorDescriptor); // Resolved call to local class constructor doesn't have expectedThisObject, so we need to generate closure on stack
CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructorDescriptor : originalOfSamAdapter); // See StackValue.receiver for more info
pushClosureOnStack(closure, expectedThisObject != null, defaultCallGenerator);
ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(constructor);
CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructor : originalOfSamAdapter);
invokeMethodWithArguments(null, method, resolvedCall, StackValue.none()); invokeMethodWithArguments(null, method, resolvedCall, StackValue.none());
return StackValue.onStack(type); return StackValue.onStack(type);