receiver first

This commit is contained in:
Maxim Shafirov
2011-05-09 18:29:42 +04:00
parent 7082646585
commit a8d6c80588
@@ -557,13 +557,12 @@ public class ExpressionCodegen extends JetVisitor {
if (declarationPsiElement instanceof PsiMethod) { if (declarationPsiElement instanceof PsiMethod) {
PsiMethod psiMethod = (PsiMethod) declarationPsiElement; PsiMethod psiMethod = (PsiMethod) declarationPsiElement;
methodDescriptor = getMethodDescriptor(psiMethod); methodDescriptor = getMethodDescriptor(psiMethod);
pushMethodArguments(expression, methodDescriptor);
final boolean isStatic = psiMethod.hasModifierProperty(PsiModifier.STATIC); final boolean isStatic = psiMethod.hasModifierProperty(PsiModifier.STATIC);
if (!isStatic) { if (!isStatic) {
ensureReceiverOnStack(expression); ensureReceiverOnStack(expression);
} }
pushMethodArguments(expression, methodDescriptor);
v.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : Opcodes.INVOKEVIRTUAL, v.visitMethodInsn(isStatic ? Opcodes.INVOKESTATIC : Opcodes.INVOKEVIRTUAL,
JetTypeMapper.jvmName(psiMethod.getContainingClass()), JetTypeMapper.jvmName(psiMethod.getContainingClass()),
@@ -572,13 +571,14 @@ public class ExpressionCodegen extends JetVisitor {
} }
else { else {
methodDescriptor = typeMapper.mapSignature((JetFunction) declarationPsiElement); methodDescriptor = typeMapper.mapSignature((JetFunction) declarationPsiElement);
pushMethodArguments(expression, methodDescriptor);
if (functionParent instanceof NamespaceDescriptor && declarationPsiElement instanceof JetFunction) { if (functionParent instanceof NamespaceDescriptor && declarationPsiElement instanceof JetFunction) {
pushMethodArguments(expression, methodDescriptor);
final String owner = NamespaceCodegen.getJVMClassName(DescriptorUtil.getFQName(functionParent)); final String owner = NamespaceCodegen.getJVMClassName(DescriptorUtil.getFQName(functionParent));
v.invokestatic(owner, methodDescriptor.getName(), methodDescriptor.getDescriptor()); v.invokestatic(owner, methodDescriptor.getName(), methodDescriptor.getDescriptor());
} }
else if (functionParent instanceof ClassDescriptor && declarationPsiElement instanceof JetFunction) { else if (functionParent instanceof ClassDescriptor && declarationPsiElement instanceof JetFunction) {
ensureReceiverOnStack(expression); ensureReceiverOnStack(expression);
pushMethodArguments(expression, methodDescriptor);
final String owner = JetTypeMapper.jvmNameForInterface((ClassDescriptor) functionParent); final String owner = JetTypeMapper.jvmNameForInterface((ClassDescriptor) functionParent);
v.invokeinterface(owner, methodDescriptor.getName(), methodDescriptor.getDescriptor()); v.invokeinterface(owner, methodDescriptor.getName(), methodDescriptor.getDescriptor());
} }