From d3ccbe8172c82aa82abc0b1c17ec0a0b3e672992 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 17 Nov 2016 11:21:49 +0100 Subject: [PATCH] Generate correct varargs flag for @JvmOverloads-generated methods #KT-14186 Fixed --- .../org/jetbrains/kotlin/codegen/AsmUtil.java | 2 +- .../codegen/DefaultParameterValueSubstitutor.kt | 2 +- .../testData/codegen/box/jvmOverloads/varargs.kt | 16 ++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../semantics/JsCodegenBoxTestGenerated.java | 12 ++++++++++++ 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/jvmOverloads/varargs.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 88a4147a173..e4d604e4d18 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -228,7 +228,7 @@ public class AsmUtil { return flags; } - private static int getCommonCallableFlags(FunctionDescriptor functionDescriptor) { + public static int getCommonCallableFlags(FunctionDescriptor functionDescriptor) { int flags = getVisibilityAccessFlag(functionDescriptor); flags |= getVarargsFlag(functionDescriptor); flags |= getDeprecatedAccessFlag(functionDescriptor); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index d8f32cf7f36..a26b65787a8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -123,7 +123,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { ) { val typeMapper = state.typeMapper val isStatic = AsmUtil.isStaticMethod(contextKind, functionDescriptor) - val flags = AsmUtil.getVisibilityAccessFlag(functionDescriptor) or (if (isStatic) Opcodes.ACC_STATIC else 0) + val flags = AsmUtil.getCommonCallableFlags(functionDescriptor) or (if (isStatic) Opcodes.ACC_STATIC else 0) val remainingParameters = getRemainingParameters(functionDescriptor.original, substituteCount) val signature = typeMapper.mapSignature(functionDescriptor, contextKind, remainingParameters, false) val mv = classBuilder.newMethod(OtherOrigin(methodElement, functionDescriptor), flags, diff --git a/compiler/testData/codegen/box/jvmOverloads/varargs.kt b/compiler/testData/codegen/box/jvmOverloads/varargs.kt new file mode 100644 index 00000000000..38ad4a6fec7 --- /dev/null +++ b/compiler/testData/codegen/box/jvmOverloads/varargs.kt @@ -0,0 +1,16 @@ +// IGNORE_BACKEND: JS + +// WITH_RUNTIME + +class C { + @JvmOverloads + fun foo(bar: Int = 0, vararg status: String) { + + } +} + +fun box(): String { + val c = C() + val m = c.javaClass.getMethod("foo", Array::class.java) + return if (m.isVarArgs) "OK" else "fail" +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 47fab28c4b4..35969ed4628 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -8638,6 +8638,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); doTest(fileName); } + + @TestMetadata("varargs.kt") + public void testVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmOverloads/varargs.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/jvmStatic") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 3a17caba346..1a7e66d27e2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -8638,6 +8638,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); doTest(fileName); } + + @TestMetadata("varargs.kt") + public void testVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmOverloads/varargs.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/jvmStatic") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 8d1c8bcd24e..97811184785 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -10468,6 +10468,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { } throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + + @TestMetadata("varargs.kt") + public void testVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmOverloads/varargs.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } } @TestMetadata("compiler/testData/codegen/box/jvmStatic")