From 0e9c530567347e14d4ca7a274e276152ab36a8fa Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 9 Dec 2013 22:46:11 +0400 Subject: [PATCH] Simplify function invocation in ExpressionCodegen Callee is now generated only when it could be non-trivial, which is only the case when generating function call in invokeFunction() --- .../jet/codegen/ExpressionCodegen.java | 55 +++++++------------ .../codegen/ImplementationBodyCodegen.java | 4 +- 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 2fccb59ef90..87251573a11 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1971,17 +1971,15 @@ public class ExpressionCodegen extends JetVisitor implem ResolvedCall resolvedCall ) { if (resolvedCall instanceof VariableAsFunctionResolvedCall) { - VariableAsFunctionResolvedCall variableAsFunctionResolvedCall = (VariableAsFunctionResolvedCall) resolvedCall; - ResolvedCallWithTrace functionCall = variableAsFunctionResolvedCall.getFunctionCall(); - return invokeFunction(call, receiver, functionCall); + return invokeFunction(call, receiver, ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall()); } FunctionDescriptor fd = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); - boolean superCall = isSuperCall(call); + JetSuperExpression superCallExpression = getSuperCallExpression(call); + boolean superCall = superCallExpression != null; if (superCall && !isInterface(fd.getContainingDeclaration())) { - JetSuperExpression expression = getSuperCallExpression(call); - ClassDescriptor owner = getSuperCallLabelTarget(expression); + ClassDescriptor owner = getSuperCallLabelTarget(superCallExpression); CodegenContext c = context.findParentContextWithDescriptor(owner); assert c != null : "Couldn't find a context for a super-call: " + fd; if (c != context.getParentContext()) { @@ -1994,15 +1992,26 @@ public class ExpressionCodegen extends JetVisitor implem Callable callable = resolveToCallable(fd, superCall); if (callable instanceof CallableMethod) { CallableMethod callableMethod = (CallableMethod) callable; - invokeMethodWithArguments(callableMethod, resolvedCall, call, receiver); + Type calleeType = callableMethod.getGenerateCalleeType(); + if (calleeType != null) { + assert !callableMethod.isNeedsThis() : "Method should have a receiver: " + resolvedCall.getResultingDescriptor(); + gen(call.getCalleeExpression(), calleeType); + } + + invokeMethodWithArguments(callableMethod, resolvedCall, receiver); Type callReturnType = callableMethod.getSignature().getAsmMethod().getReturnType(); - return returnValueAsStackValue(fd, callReturnType); + if (callReturnType == Type.VOID_TYPE) return StackValue.none(); + + JetType type = fd.getReturnType(); + assert type != null; + Type retType = typeMapper.mapReturnType(type); + StackValue.coerce(callReturnType, retType, v); + return StackValue.onStack(retType); } else { receiver = StackValue.receiver(resolvedCall, receiver, this, null); - IntrinsicMethod intrinsic = (IntrinsicMethod) callable; List args = new ArrayList(); for (ValueArgument argument : call.getValueArguments()) { args.add(argument.getArgumentExpression()); @@ -2010,7 +2019,7 @@ public class ExpressionCodegen extends JetVisitor implem Type returnType = typeMapper.mapType(resolvedCall.getResultingDescriptor()); - intrinsic.generate(this, v, returnType, call.getCallElement(), args, receiver); + ((IntrinsicMethod) callable).generate(this, v, returnType, call.getCallElement(), args, receiver); return StackValue.onStack(returnType); } } @@ -2027,10 +2036,6 @@ public class ExpressionCodegen extends JetVisitor implem return null; } - private static boolean isSuperCall(@NotNull Call call) { - return getSuperCallExpression(call) != null; - } - // Find the first parent of the current context which corresponds to a subclass of a given class @NotNull private static CodegenContext getParentContextSubclassOf(ClassDescriptor descriptor, CodegenContext context) { @@ -2044,18 +2049,6 @@ public class ExpressionCodegen extends JetVisitor implem } } - @NotNull - private StackValue returnValueAsStackValue(FunctionDescriptor fd, Type callReturnType) { - if (callReturnType != Type.VOID_TYPE) { - JetType type = fd.getReturnType(); - assert type != null; - Type retType = typeMapper.mapReturnType(type); - StackValue.coerce(callReturnType, retType, v); - return StackValue.onStack(retType); - } - return StackValue.none(); - } - @NotNull Callable resolveToCallable(@NotNull FunctionDescriptor fd, boolean superCall) { IntrinsicMethod intrinsic = state.getIntrinsics().getIntrinsic(fd); @@ -2092,16 +2085,8 @@ public class ExpressionCodegen extends JetVisitor implem public void invokeMethodWithArguments( @NotNull CallableMethod callableMethod, @NotNull ResolvedCall resolvedCall, - @Nullable Call callToGenerateCallee, @NotNull StackValue receiver ) { - Type calleeType = callableMethod.getGenerateCalleeType(); - if (calleeType != null) { - assert !callableMethod.isNeedsThis(); - assert callToGenerateCallee != null : "Call can't be null when generating callee: " + resolvedCall.getResultingDescriptor(); - gen(callToGenerateCallee.getCalleeExpression(), calleeType); - } - if (resolvedCall instanceof VariableAsFunctionResolvedCall) { resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall(); } @@ -3254,7 +3239,7 @@ public class ExpressionCodegen extends JetVisitor implem ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(constructorDescriptor); CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructorDescriptor : originalOfSamAdapter); - invokeMethodWithArguments(method, resolvedCall, null, StackValue.none()); + invokeMethodWithArguments(method, resolvedCall, StackValue.none()); return StackValue.onStack(type); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index b36e8e2efff..b5cf715755d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1563,7 +1563,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { superCallable.invokeWithNotNullAssertion(codegen.v, state, resolvedCall); } else { - codegen.invokeMethodWithArguments(superCallable, resolvedCall, null, StackValue.none()); + codegen.invokeMethodWithArguments(superCallable, resolvedCall, StackValue.none()); } } @@ -1650,7 +1650,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { CallableMethod method = typeMapper.mapToCallableMethod((ConstructorDescriptor) resolvedCall.getResultingDescriptor()); - codegen.invokeMethodWithArguments(method, resolvedCall, null, StackValue.none()); + codegen.invokeMethodWithArguments(method, resolvedCall, StackValue.none()); } else { iv.invokespecial(implClass.getInternalName(), "", "(Ljava/lang/String;I)V");