diff --git a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java index aa3c004acfa..41be927b6a4 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -211,4 +211,10 @@ public class ClosureCodegen { signatureWriter.visitClassType(rawRetType.getInternalName()); signatureWriter.visitEnd(); } + + public static CallableMethod asCallableMethod(FunctionDescriptor fd) { + Method descriptor = erasedInvokeSignature(fd); + String owner = getInternalClassName(fd); + return new CallableMethod(owner, descriptor, Opcodes.INVOKEVIRTUAL, Arrays.asList(descriptor.getArgumentTypes())); + } } diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index c8c219b1fc1..8278a6534c0 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -780,6 +780,8 @@ public class ExpressionCodegen extends JetVisitor { if (declarationPsiElement == null) { throw new UnsupportedOperationException("couldn't find declaration for " + funDescriptor); } + + Method methodDescriptor; if (declarationPsiElement instanceof PsiMethod) { final PsiMethod psiMethod = (PsiMethod) declarationPsiElement; @@ -814,15 +816,14 @@ public class ExpressionCodegen extends JetVisitor { gen(callee, Type.getObjectType(ClosureCodegen.getInternalClassName(fd))); boolean isExtensionFunction = fd.getReceiverType() != null; - int paramCount = fd.getValueParameters().size(); if (isExtensionFunction) { ensureReceiverOnStack(expression, null); - paramCount++; } - methodDescriptor = ClosureCodegen.erasedInvokeSignature(fd); - pushMethodArguments(expression, methodDescriptor); - v.invokevirtual(ClosureCodegen.getInternalClassName(fd), "invoke", methodDescriptor.getDescriptor()); + CallableMethod callableMethod = ClosureCodegen.asCallableMethod(fd); + pushMethodArguments(expression, callableMethod.getValueParameterTypes()); + callableMethod.invoke(v); + methodDescriptor = callableMethod.getSignature(); } if (methodDescriptor.getReturnType() != Type.VOID_TYPE) {