diff --git a/CHANGELOG.md b/CHANGELOG.md index b62b291fc..aaf17d136 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ details about the cause of the failure - Fix incorrect dereference of wrapper object in `tp_repr`, which may result in a program crash - Fix incorrect dereference in params array handling +- Fix `object[]` parameters taking precedence when should not in overload resolution ## [2.5.0][] - 2020-06-14 diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index a3197093a..49bf5b171 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -203,6 +203,16 @@ internal static int ArgPrecedence(Type t) return 3000; } + if (t.IsArray) + { + Type e = t.GetElementType(); + if (e == objectType) + { + return 2500; + } + return 100 + ArgPrecedence(e); + } + TypeCode tc = Type.GetTypeCode(t); // TODO: Clean up switch (tc) @@ -250,16 +260,6 @@ internal static int ArgPrecedence(Type t) return 40; } - if (t.IsArray) - { - Type e = t.GetElementType(); - if (e == objectType) - { - return 2500; - } - return 100 + ArgPrecedence(e); - } - return 2000; } diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 91836b727..9a4c408d6 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Runtime.InteropServices; namespace Python.Test @@ -84,7 +85,7 @@ public Type[] TestNullArrayConversion(Type[] v) public static string[] TestStringParamsArg(params string[] args) { - return args; + return args.Concat(new []{"tail"}).ToArray(); } public static object[] TestObjectParamsArg(params object[] args) diff --git a/src/tests/test_method.py b/src/tests/test_method.py index d9c033802..c9fc89c7c 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -206,17 +206,20 @@ def test_null_array_conversion(): def test_string_params_args(): """Test use of string params.""" result = MethodTest.TestStringParamsArg('one', 'two', 'three') - assert result.Length == 3 - assert len(result) == 3, result + assert result.Length == 4 + assert len(result) == 4, result assert result[0] == 'one' assert result[1] == 'two' assert result[2] == 'three' + # ensures params string[] overload takes precedence over params object[] + assert result[3] == 'tail' result = MethodTest.TestStringParamsArg(['one', 'two', 'three']) - assert len(result) == 3 + assert len(result) == 4 assert result[0] == 'one' assert result[1] == 'two' assert result[2] == 'three' + assert result[3] == 'tail' def test_object_params_args():