From 57c1b05684d7f6d1a817f6a4c16466055a6f3aaf Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 10 Jul 2012 19:59:33 +0200 Subject: [PATCH] generate correct cast for arguments of bridge methods (KT-2390) --- .../jet/codegen/FunctionCodegen.java | 7 ++-- .../testData/codegen/regressions/kt2390.kt | 36 +++++++++++++++++++ .../jetbrains/jet/codegen/ClassGenTest.java | 5 +++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2390.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 8afadc62fc2..65cdcd1ce2d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -541,17 +541,18 @@ public class FunctionCodegen { Type argType = argTypes[i]; iv.load(reg, argType); if (argType.getSort() == Type.OBJECT) { - StackValue.onStack(JetTypeMapper.TYPE_OBJECT).put(method.getArgumentTypes()[i], iv); + StackValue.onStack(JetTypeMapper.TYPE_OBJECT).put(jvmSignature.getArgumentTypes()[i], iv); } else if (argType.getSort() == Type.ARRAY) { - StackValue.onStack(JetTypeMapper.ARRAY_GENERIC_TYPE).put(method.getArgumentTypes()[i], iv); + StackValue.onStack(JetTypeMapper.ARRAY_GENERIC_TYPE).put(jvmSignature.getArgumentTypes()[i], iv); } //noinspection AssignmentToForLoopParameter reg += argType.getSize(); } - iv.invokevirtual(state.getInjector().getJetTypeMapper().mapType(((ClassDescriptor) owner.getContextDescriptor()).getDefaultType(), MapTypeMode.VALUE).getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor()); + iv.invokevirtual(state.getInjector().getJetTypeMapper().mapType(((ClassDescriptor) owner.getContextDescriptor()).getDefaultType(), MapTypeMode.VALUE).getInternalName(), + jvmSignature.getName(), jvmSignature.getDescriptor()); if (JetTypeMapper.isPrimitive(jvmSignature.getReturnType()) && !JetTypeMapper.isPrimitive(overridden.getReturnType())) StackValue.valueOf(iv, jvmSignature.getReturnType()); if (jvmSignature.getReturnType() == Type.VOID_TYPE) diff --git a/compiler/testData/codegen/regressions/kt2390.kt b/compiler/testData/codegen/regressions/kt2390.kt new file mode 100644 index 00000000000..eb76ee84747 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2390.kt @@ -0,0 +1,36 @@ +import java.util.Collection + +class JsonObject() { +} + +class JsonArray() { +} + +public trait Formatter { + public fun format(source: IN?): OUT +} + +public trait MultiFormatter { + public fun format(source: Collection): OUT +} + +public class Project() { +} + +public trait JsonFormatter: Formatter, MultiFormatter { + public override fun format(source: Collection): JsonArray { + return JsonArray(); + } +} + +public class ProjectJsonFormatter(): JsonFormatter { + public override fun format(source: Project?): JsonObject { + return JsonObject() + } +} + + +fun box(): String { + val formatter = ProjectJsonFormatter() + return if (formatter.format(Project()) != null) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 50e2b3ce13e..da89c2271e3 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -456,4 +456,9 @@ public class ClassGenTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt2384.kt"); } + + public void testKt2390() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2390.kt"); + } }