diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index b3df8448f..f0c58f34f 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -375,7 +375,7 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth if (clrtype != null) { var typematch = false; - if (pi[n].ParameterType != clrtype) + if ((pi[n].ParameterType != typeof(object)) && (pi[n].ParameterType != clrtype)) { IntPtr pytype = Converter.GetPythonTypeByAlias(pi[n].ParameterType); pyoptype = Runtime.PyObject_Type(op); diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 7634c4839..e76348ab4 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -116,6 +116,71 @@ public static int[] TestOverloadedParams(int v, int[] args) return args; } + public static string TestOverloadedNoObject(int i) + { + return "Got int"; + } + + public static string TestOverloadedObject(int i) + { + return "Got int"; + } + + public static string TestOverloadedObject(object o) + { + return "Got object"; + } + + public static string TestOverloadedObjectTwo(int a, int b) + { + return "Got int-int"; + } + + public static string TestOverloadedObjectTwo(string a, string b) + { + return "Got string-string"; + } + + public static string TestOverloadedObjectTwo(string a, int b) + { + return "Got string-int"; + } + + public static string TestOverloadedObjectTwo(string a, object b) + { + return "Got string-object"; + } + + public static string TestOverloadedObjectTwo(int a, object b) + { + return "Got int-object"; + } + + public static string TestOverloadedObjectTwo(object a, int b) + { + return "Got object-int"; + } + + public static string TestOverloadedObjectTwo(object a, object b) + { + return "Got object-object"; + } + + public static string TestOverloadedObjectTwo(int a, string b) + { + return "Got int-string"; + } + + public static string TestOverloadedObjectThree(object a, int b) + { + return "Got object-int"; + } + + public static string TestOverloadedObjectThree(int a, object b) + { + return "Got int-object"; + } + public static bool TestStringOutParams(string s, out string s1) { s1 = "output string"; diff --git a/src/tests/test_method.py b/src/tests/test_method.py index e29986969..12c8cb13e 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -769,3 +769,53 @@ def test_wrong_overload(): res = System.Math.Max(System.Double(50.5), 50.1) assert res == 50.5 assert type(res) == float + + +def test_no_object_in_param(): + """Test that fix for #203 doesn't break behavior w/ no object overload""" + + res = MethodTest.TestOverloadedNoObject(5) + assert res == "Got int" + + with pytest.raises(TypeError): + MethodTest.TestOverloadedNoObject("test") + + +def test_object_in_param(): + """Test regression introduced by #151 in which Object method overloads + aren't being used. See #203 for issue.""" + + res = MethodTest.TestOverloadedObject(5) + assert res == "Got int" + + res = MethodTest.TestOverloadedObject("test") + assert res == "Got object" + + +def test_object_in_multiparam(): + """Test method with object multiparams behaves""" + + res = MethodTest.TestOverloadedObjectTwo(5, 5) + assert res == "Got int-int" + + res = MethodTest.TestOverloadedObjectTwo(5, "foo") + assert res == "Got int-string" + + res = MethodTest.TestOverloadedObjectTwo("foo", 7.24) + assert res == "Got string-object" + + res = MethodTest.TestOverloadedObjectTwo("foo", "bar") + assert res == "Got string-string" + + res = MethodTest.TestOverloadedObjectTwo("foo", 5) + assert res == "Got string-int" + + res = MethodTest.TestOverloadedObjectTwo(7.24, 7.24) + assert res == "Got object-object" + + +def test_object_in_multiparam_exception(): + """Test method with object multiparams behaves""" + + with pytest.raises(TypeError): + MethodTest.TestOverloadedObjectThree("foo", "bar")