diff --git a/idea/src/org/jetbrains/jet/codegen/CallableMethod.java b/idea/src/org/jetbrains/jet/codegen/CallableMethod.java index 4e7a82ff6c7..df5dff3e859 100644 --- a/idea/src/org/jetbrains/jet/codegen/CallableMethod.java +++ b/idea/src/org/jetbrains/jet/codegen/CallableMethod.java @@ -1,8 +1,11 @@ package org.jetbrains.jet.codegen; +import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.Method; +import java.util.List; + /** * @author yole */ @@ -10,11 +13,13 @@ public class CallableMethod { private final String owner; private final Method descriptor; private final int invokeOpcode; + private final List valueParameterTypes; - public CallableMethod(String owner, Method descriptor, int invokeOpcode) { + public CallableMethod(String owner, Method descriptor, int invokeOpcode, List valueParameterTypes) { this.owner = owner; this.descriptor = descriptor; this.invokeOpcode = invokeOpcode; + this.valueParameterTypes = valueParameterTypes; } public String getOwner() { @@ -29,6 +34,10 @@ public class CallableMethod { return invokeOpcode; } + public List getValueParameterTypes() { + return valueParameterTypes; + } + void invoke(InstructionAdapter v) { v.visitMethodInsn(getInvokeOpcode(), getOwner(), getDescriptor().getName(), getDescriptor().getDescriptor()); } diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 11909c758c3..fdbfc9db56e 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -795,7 +795,7 @@ public class ExpressionCodegen extends JetVisitor { ensureReceiverOnStack(expression, (ClassDescriptor) functionParent); } - pushMethodArguments(expression, callableMethod.getDescriptor()); + pushMethodArguments(expression, callableMethod.getValueParameterTypes()); pushTypeArguments(expression); callableMethod.invoke(v); methodDescriptor = callableMethod.getDescriptor(); @@ -924,6 +924,14 @@ public class ExpressionCodegen extends JetVisitor { } } + private void pushMethodArguments(JetCall expression, List valueParameterTypes) { + List args = expression.getValueArguments(); + for (int i = 0, argsSize = args.size(); i < argsSize; i++) { + JetArgument arg = args.get(i); + gen(arg.getArgumentExpression(), valueParameterTypes.get(i)); + } + } + private static Method getMethodDescriptor(PsiMethod method) { Type returnType = method.isConstructor() ? Type.VOID_TYPE : psiTypeToAsm(method.getReturnType()); PsiParameter[] parameters = method.getParameterList().getParameters(); diff --git a/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 46486e24e29..940d5991961 100644 --- a/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -35,7 +35,7 @@ public class FunctionCodegen { public void gen(JetNamedFunction f, OwnerKind kind) { final JetTypeReference receiverTypeRef = f.getReceiverTypeRef(); final JetType receiverType = receiverTypeRef == null ? null : state.getBindingContext().resolveTypeReference(receiverTypeRef); - Method method = state.getTypeMapper().mapSignature(f); + Method method = state.getTypeMapper().mapToCallableMethod(f).getDescriptor(); final FunctionDescriptor functionDescriptor = state.getBindingContext().getFunctionDescriptor(f); generateMethod(f, kind, method, receiverType, functionDescriptor.getValueParameters(), functionDescriptor.getTypeParameters()); diff --git a/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java index c62c780460a..261ab98690b 100644 --- a/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -271,7 +271,7 @@ public class JetTypeMapper { return type; } - public Method mapSignature(JetNamedFunction f) { + private Method mapSignature(JetNamedFunction f, List valueParameterTypes) { final JetTypeReference receiverTypeRef = f.getReceiverTypeRef(); final JetType receiverType = receiverTypeRef == null ? null : bindingContext.resolveTypeReference(receiverTypeRef); final List parameters = f.getValueParameters(); @@ -280,7 +280,9 @@ public class JetTypeMapper { parameterTypes.add(mapType(receiverType)); } for (JetParameter parameter : parameters) { - parameterTypes.add(mapType(bindingContext.resolveTypeReference(parameter.getTypeReference()))); + final Type type = mapType(bindingContext.resolveTypeReference(parameter.getTypeReference())); + valueParameterTypes.add(type); + parameterTypes.add(type); } for (JetTypeParameter p: f.getTypeParameters()) { parameterTypes.add(TYPE_TYPEINFO); @@ -301,7 +303,8 @@ public class JetTypeMapper { public CallableMethod mapToCallableMethod(JetNamedFunction f) { final FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(f); final DeclarationDescriptor functionParent = functionDescriptor.getContainingDeclaration(); - Method descriptor = mapSignature(f); + final List valueParameterTypes = new ArrayList(); + Method descriptor = mapSignature(f, valueParameterTypes); String owner; int invokeOpcode; if (functionParent instanceof NamespaceDescriptor) { @@ -319,7 +322,7 @@ public class JetTypeMapper { throw new UnsupportedOperationException("unknown function parent"); } - return new CallableMethod(owner, descriptor, invokeOpcode); + return new CallableMethod(owner, descriptor, invokeOpcode, valueParameterTypes); } public Method mapSignature(String name, FunctionDescriptor f) {