diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index f5375b206fd..852620a056b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.codegen; import com.google.common.collect.Lists; import com.intellij.util.ArrayUtil; +import kotlin.KotlinPackage; import kotlin.Unit; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; @@ -268,17 +269,18 @@ public class ClosureCodegen extends MemberCodegen { iv.load(0, asmType); - ReceiverParameterDescriptor receiver = funDescriptor.getExtensionReceiverParameter(); - int count = 1; - if (receiver != null) { - StackValue.local(count, bridge.getArgumentTypes()[count - 1]).put(typeMapper.mapType(receiver.getType()), iv); - count++; - } + Type[] myParameterTypes = bridge.getArgumentTypes(); - List params = funDescriptor.getValueParameters(); - for (ValueParameterDescriptor param : params) { - StackValue.local(count, bridge.getArgumentTypes()[count - 1]).put(typeMapper.mapType(param.getType()), iv); - count++; + List calleeParameters = KotlinPackage.plus( + UtilsPackage.singletonOrEmptyList(funDescriptor.getExtensionReceiverParameter()), + funDescriptor.getValueParameters() + ); + + int slot = 1; + for (int i = 0; i < calleeParameters.size(); i++) { + Type type = myParameterTypes[i]; + StackValue.local(slot, type).put(typeMapper.mapType(calleeParameters.get(i)), iv); + slot += type.getSize(); } iv.invokevirtual(asmType.getInternalName(), delegate.getName(), delegate.getDescriptor(), false); diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.java b/compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.java new file mode 100644 index 00000000000..66fd53063de --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.java @@ -0,0 +1,3 @@ +interface GenericInterface { + public T foo(double d, int i, long j, short s); +} diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.kt b/compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.kt new file mode 100644 index 00000000000..2f350b4dbad --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.kt @@ -0,0 +1,9 @@ +fun getInterface(): GenericInterface { + return GenericInterface { d, i, j, s -> + "OK" + } +} + +fun box(): String { + return getInterface().foo(0.0, 0, 0, 0) +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index e1eb33ee306..91cad226b8d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -597,6 +597,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod doTestAgainstJava(fileName); } + @TestMetadata("doubleLongParameters.kt") + public void testDoubleLongParameters() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/doubleLongParameters.kt"); + doTestAgainstJava(fileName); + } + @TestMetadata("fileFilter.kt") public void testFileFilter() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/fileFilter.kt");