diff --git a/idea/src/org/jetbrains/jet/codegen/CallableMethod.java b/idea/src/org/jetbrains/jet/codegen/CallableMethod.java index d246b6a6b3b..6dafc563594 100644 --- a/idea/src/org/jetbrains/jet/codegen/CallableMethod.java +++ b/idea/src/org/jetbrains/jet/codegen/CallableMethod.java @@ -20,6 +20,7 @@ public class CallableMethod { private boolean needsReceiverOnStack = false; private boolean ownerFromCall = false; private ClassDescriptor receiverClass = null; + private Type generateCalleeType = null; public CallableMethod(String owner, Method signature, int invokeOpcode, List valueParameterTypes) { this.owner = owner; @@ -80,4 +81,12 @@ public class CallableMethod { void invoke(InstructionAdapter v) { v.visitMethodInsn(getInvokeOpcode(), getOwner(), getSignature().getName(), getSignature().getDescriptor()); } + + public void requestGenerateCallee(Type objectType) { + generateCalleeType = objectType; + } + + public Type getGenerateCalleeType() { + return generateCalleeType; + } } diff --git a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java index f93ddd3b44f..a10d3804c82 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -251,6 +251,7 @@ public class ClosureCodegen { if (fd.getReceiverType() != null) { result.setNeedsReceiver(null); } + result.requestGenerateCallee(Type.getObjectType(getInternalClassName(fd))); return result; } } diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 3520c0a4b0f..ceecb6cd6fe 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -806,7 +806,6 @@ public class ExpressionCodegen extends JetVisitor { callableMethod = typeMapper.mapToCallableMethod((PsiNamedElement) declarationPsiElement); } else { - gen(callee, Type.getObjectType(ClosureCodegen.getInternalClassName(fd))); callableMethod = ClosureCodegen.asCallableMethod(fd); } @@ -861,6 +860,10 @@ public class ExpressionCodegen extends JetVisitor { } private void invokeMethodWithArguments(CallableMethod callableMethod, JetCall expression, final boolean haveReceiver) { + final Type calleeType = callableMethod.getGenerateCalleeType(); + if (calleeType != null && expression instanceof JetCallExpression) { + gen(((JetCallExpression) expression).getCalleeExpression(), calleeType); + } if (callableMethod.isOwnerFromCall()) { setOwnerFromCall(callableMethod, expression); }