diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 834c6dbbe83..ea691936476 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -57,7 +57,6 @@ import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalFun; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; -import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_ARRAY_GENERIC_TYPE; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; /** @@ -772,20 +771,13 @@ public class FunctionCodegen extends GenerationStateAware { Type[] argTypes = overridden.getArgumentTypes(); Type[] originalArgTypes = jvmSignature.getArgumentTypes(); + InstructionAdapter iv = new InstructionAdapter(mv); iv.load(0, OBJECT_TYPE); for (int i = 0, reg = 1; i < argTypes.length; i++) { - Type argType = argTypes[i]; - iv.load(reg, argType); - if (argType.getSort() == Type.OBJECT) { - StackValue.onStack(OBJECT_TYPE).put(originalArgTypes[i], iv); - } - else if (argType.getSort() == Type.ARRAY) { - StackValue.onStack(JAVA_ARRAY_GENERIC_TYPE).put(originalArgTypes[i], iv); - } - + StackValue.local(reg, argTypes[i]).put(originalArgTypes[i], iv); //noinspection AssignmentToForLoopParameter - reg += argType.getSize(); + reg += argTypes[i].getSize(); } iv.invokevirtual(state.getTypeMapper().mapType( @@ -828,22 +820,16 @@ public class FunctionCodegen extends GenerationStateAware { else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); - Type[] argTypes = overriddenMethod.getArgumentTypes(); + Type[] argTypes = delegateMethod.getArgumentTypes(); + Type[] originalArgTypes = overriddenMethod.getArgumentTypes(); + InstructionAdapter iv = new InstructionAdapter(mv); iv.load(0, OBJECT_TYPE); field.put(field.type, iv); for (int i = 0, reg = 1; i < argTypes.length; i++) { - Type argType = argTypes[i]; - iv.load(reg, argType); - if (argType.getSort() == Type.OBJECT) { - StackValue.onStack(OBJECT_TYPE).put(overriddenMethod.getArgumentTypes()[i], iv); - } - else if (argType.getSort() == Type.ARRAY) { - StackValue.onStack(JAVA_ARRAY_GENERIC_TYPE).put(overriddenMethod.getArgumentTypes()[i], iv); - } - + StackValue.local(reg, argTypes[i]).put(originalArgTypes[i], iv); //noinspection AssignmentToForLoopParameter - reg += argType.getSize(); + reg += argTypes[i].getSize(); } ClassDescriptor classDescriptor = (ClassDescriptor) overriddenDescriptor.getContainingDeclaration(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 26a482ee292..d821de5eee4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1273,14 +1273,13 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Type[] argTypes = function.getArgumentTypes(); List originalArgTypes = jvmSignature.getValueParameterTypes(); + InstructionAdapter iv = new InstructionAdapter(mv); iv.load(0, OBJECT_TYPE); for (int i = 0, reg = 1; i < argTypes.length; i++) { - Type argType = argTypes[i]; - iv.load(reg, argType); - StackValue.coerce(argType, originalArgTypes.get(i), iv); + StackValue.local(reg, argTypes[i]).put(originalArgTypes.get(i), iv); //noinspection AssignmentToForLoopParameter - reg += argType.getSize(); + reg += argTypes[i].getSize(); } JetType jetType = CodegenUtil.getSuperClass(declaration); diff --git a/compiler/testData/codegen/classes/delegationGenericArg.kt b/compiler/testData/codegen/classes/delegationGenericArg.kt new file mode 100644 index 00000000000..fed9f214dd8 --- /dev/null +++ b/compiler/testData/codegen/classes/delegationGenericArg.kt @@ -0,0 +1,12 @@ +trait A { + fun foo(t: T): String +} + +class Derived(a: A) : A by a + +fun box(): String { + val o = object : A { + override fun foo(t: Int) = if (t == 42) "OK" else "Fail $t" + } + return Derived(o).foo(42) +} diff --git a/compiler/testData/codegen/classes/delegationGenericArgUpperBound.kt b/compiler/testData/codegen/classes/delegationGenericArgUpperBound.kt new file mode 100644 index 00000000000..b5da8aaffee --- /dev/null +++ b/compiler/testData/codegen/classes/delegationGenericArgUpperBound.kt @@ -0,0 +1,12 @@ +trait A { + fun foo(t: T): String +} + +class Derived(a: A) : A by a + +fun box(): String { + val o = object : A { + override fun foo(t: Int) = if (t == 42) "OK" else "Fail $t" + } + return Derived(o).foo(42) +} diff --git a/compiler/testData/codegen/classes/delegationGenericLongArg.kt b/compiler/testData/codegen/classes/delegationGenericLongArg.kt new file mode 100644 index 00000000000..df80d1064e6 --- /dev/null +++ b/compiler/testData/codegen/classes/delegationGenericLongArg.kt @@ -0,0 +1,12 @@ +trait A { + fun foo(t: T, u: U): String +} + +class Derived(a: A) : A by a + +fun box(): String { + val o = object : A { + override fun foo(t: Long, u: Int) = if (t == u.toLong()) "OK" else "Fail $t $u" + } + return Derived(o).foo(42, 42) +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 104fb5f3fd9..999f8088b3b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -120,6 +120,21 @@ public class ClassGenTest extends CodegenTestCase { blackBoxFile("classes/delegationMethodsWithArgs.kt"); } + public void testDelegationGenericArg() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("classes/delegationGenericArg.kt"); + } + + public void testDelegationGenericLongArg() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("classes/delegationGenericLongArg.kt"); + } + + public void testDelegationGenericArgUpperBound() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("classes/delegationGenericArgUpperBound.kt"); + } + public void testFunDelegation() throws Exception { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("classes/funDelegation.jet");