diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index dc429ed0a6e..02b9ace57e7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -113,10 +113,8 @@ public class ClosureCodegen extends ParentCodegenAwareImpl { ); cv.visitSource(fun.getContainingFile().getName(), null); - - generateBridge(interfaceFunction, cv); - - JvmMethodSignature jvmMethodSignature = typeMapper.mapSignature(interfaceFunction.getName(), funDescriptor); + JvmMethodSignature jvmMethodSignature = typeMapper.mapSignature(funDescriptor).replaceName(interfaceFunction.getName().toString()); + generateBridge(cv, typeMapper.mapSignature(interfaceFunction).getAsmMethod(), jvmMethodSignature.getAsmMethod()); FunctionCodegen fc = new FunctionCodegen(context, cv, state, getParentCodegen()); fc.generateMethod(fun, jvmMethodSignature, funDescriptor, strategy); @@ -130,7 +128,7 @@ public class ClosureCodegen extends ParentCodegenAwareImpl { genClosureFields(closure, cv, typeMapper); fc.generateDefaultIfNeeded(context.intoFunction(funDescriptor), - typeMapper.mapSignature(Name.identifier("invoke"), funDescriptor), + typeMapper.mapSignature(funDescriptor), funDescriptor, context.getContextKind(), DefaultParameterValueLoader.DEFAULT); @@ -171,44 +169,38 @@ public class ClosureCodegen extends ParentCodegenAwareImpl { } } - private void generateBridge(@NotNull FunctionDescriptor interfaceFunction, @NotNull ClassBuilder cv) { - Method bridge = typeMapper.mapSignature(interfaceFunction).getAsmMethod(); + private void generateBridge(@NotNull ClassBuilder cv, @NotNull Method bridge, @NotNull Method delegate) { + if (bridge.equals(delegate)) return; - Method delegate = typeMapper.mapSignature(interfaceFunction.getName(), funDescriptor).getAsmMethod(); + MethodVisitor mv = + cv.newMethod(fun, ACC_PUBLIC | ACC_BRIDGE, bridge.getName(), bridge.getDescriptor(), null, ArrayUtil.EMPTY_STRING_ARRAY); - if (bridge.getDescriptor().equals(delegate.getDescriptor())) { - return; + if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; + + mv.visitCode(); + + InstructionAdapter iv = new InstructionAdapter(mv); + iv.load(0, asmType); + + ReceiverParameterDescriptor receiver = funDescriptor.getReceiverParameter(); + int count = 1; + if (receiver != null) { + StackValue.local(count, bridge.getArgumentTypes()[count - 1]).put(typeMapper.mapType(receiver.getType()), iv); + count++; } - MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC | ACC_BRIDGE, interfaceFunction.getName().asString(), - bridge.getDescriptor(), null, ArrayUtil.EMPTY_STRING_ARRAY); - if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { - mv.visitCode(); - - InstructionAdapter iv = new InstructionAdapter(mv); - - iv.load(0, asmType); - - ReceiverParameterDescriptor receiver = funDescriptor.getReceiverParameter(); - int count = 1; - if (receiver != null) { - StackValue.local(count, bridge.getArgumentTypes()[count - 1]).put(typeMapper.mapType(receiver.getType()), iv); - count++; - } - - List params = funDescriptor.getValueParameters(); - for (ValueParameterDescriptor param : params) { - StackValue.local(count, bridge.getArgumentTypes()[count - 1]).put(typeMapper.mapType(param.getType()), iv); - count++; - } - - iv.invokevirtual(asmType.getInternalName(), interfaceFunction.getName().asString(), delegate.getDescriptor()); - StackValue.onStack(delegate.getReturnType()).put(bridge.getReturnType(), iv); - - iv.areturn(bridge.getReturnType()); - - FunctionCodegen.endVisit(mv, "bridge", fun); + List params = funDescriptor.getValueParameters(); + for (ValueParameterDescriptor param : params) { + StackValue.local(count, bridge.getArgumentTypes()[count - 1]).put(typeMapper.mapType(param.getType()), iv); + count++; } + + iv.invokevirtual(asmType.getInternalName(), delegate.getName(), delegate.getDescriptor()); + StackValue.onStack(delegate.getReturnType()).put(bridge.getReturnType(), iv); + + iv.areturn(bridge.getReturnType()); + + FunctionCodegen.endVisit(mv, "bridge", fun); } @NotNull diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java index 82ef7c6fac9..d8037e125de 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java @@ -68,6 +68,13 @@ public class JvmMethodSignature { return r; } + @NotNull + public JvmMethodSignature replaceName(@NotNull String newName) { + return newName.equals(asmMethod.getName()) ? + this : + new JvmMethodSignature(new Method(newName, asmMethod.getDescriptor()), genericsSignature, kotlinParameterTypes); + } + @NotNull public String getName() { return asmMethod.getName(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 7bdb54acb5e..398f191a7dc 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -43,7 +43,6 @@ import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; -import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -433,7 +432,7 @@ public class JetTypeMapper extends BindingTraceAware { owner = asmTypeForAnonymousClass(bindingContext, functionDescriptor); ownerForDefaultImpl = ownerForDefaultParam = thisClass = owner; invokeOpcode = INVOKEVIRTUAL; - descriptor = mapSignature("invoke", functionDescriptor, kind); + descriptor = mapSignature(functionDescriptor, kind); calleeType = owner; } else if (functionParent instanceof PackageFragmentDescriptor) { @@ -563,23 +562,13 @@ public class JetTypeMapper extends BindingTraceAware { } } + @NotNull + public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor descriptor) { + return mapSignature(descriptor, OwnerKind.IMPLEMENTATION); + } + @NotNull public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind) { - return mapSignature(mapFunctionName(f), f, kind); - } - - @NotNull - public JvmMethodSignature mapSignature(@NotNull Name functionName, @NotNull FunctionDescriptor f) { - return mapSignature(functionName.asString(), f, OwnerKind.IMPLEMENTATION); - } - - @NotNull - public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f) { - return mapSignature(mapFunctionName(f), f, OwnerKind.IMPLEMENTATION); - } - - @NotNull - private JvmMethodSignature mapSignature(@NotNull String methodName, @NotNull FunctionDescriptor f, @NotNull OwnerKind kind) { BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); writeFormalTypeParameters(f.getTypeParameters(), signatureVisitor); @@ -603,7 +592,7 @@ public class JetTypeMapper extends BindingTraceAware { signatureVisitor.writeReturnTypeEnd(); } - return signatureVisitor.makeJvmMethodSignature(methodName); + return signatureVisitor.makeJvmMethodSignature(mapFunctionName(f)); } private static void writeVoidReturn(@NotNull BothSignatureWriter signatureVisitor) {