Skip to content

Commit 5d07acf

Browse files
authored
Fix non generic method overload resolution (#113)
* Fix non generic method overload resolution * Add test case * Bump version to 2.0.53 * Bump version to 2.0.53
1 parent ff33baf commit 5d07acf

File tree

5 files changed

+61
-12
lines changed

5 files changed

+61
-12
lines changed

src/embed_tests/TestMethodBinder.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,6 +1402,35 @@ def call_method_with_enum():
14021402
Assert.AreEqual(DayOfWeek.Monday, CSharpModel.ProvidedArgument);
14031403
}
14041404

1405+
[TestCase("call_non_generic_method", "GenericOverloadTestMethod")]
1406+
[TestCase("call_generic_method", "GenericOverloadTestMethod<T>")]
1407+
[TestCase("call_generic_class_method", "GenericOverloadTestClass<T>.GenericOverloadTestMethod")]
1408+
public void ResolvesToGenericOnlyWhenExplicitlyCalled(string pythonFuncToCall, string expectedMethodCalled)
1409+
{
1410+
using var _ = Py.GIL();
1411+
1412+
var module = PyModule.FromString($"ResolvesToGenericOnlyWhenExplicitlyCalled_{pythonFuncToCall}", @$"
1413+
from clr import AddReference
1414+
AddReference(""System"")
1415+
from Python.EmbeddingTest import *
1416+
1417+
def call_non_generic_method():
1418+
return TestMethodBinder.CSharpModel.GenericOverloadTestMethod(TestMethodBinder.CSharpModel(), 'Test')
1419+
1420+
def call_generic_method():
1421+
return TestMethodBinder.CSharpModel.GenericOverloadTestMethod[TestMethodBinder.CSharpModel](TestMethodBinder.CSharpModel(), 'Test')
1422+
1423+
def call_generic_class_method():
1424+
return GenericOverloadTestClass[TestMethodBinder.CSharpModel].GenericOverloadTestMethod(TestMethodBinder.CSharpModel(), 'Test')
1425+
");
1426+
1427+
Assert.DoesNotThrow(() =>
1428+
{
1429+
using var result = module.GetAttr(pythonFuncToCall).Invoke();
1430+
});
1431+
Assert.AreEqual(expectedMethodCalled, CSharpModel.LastFuncCalled);
1432+
}
1433+
14051434
// Used to test that we match this function with Py DateTime & Date Objects
14061435
public static int GetMonth(DateTime test)
14071436
{
@@ -1636,6 +1665,18 @@ public static void TestAction3(CSharpModel model1, CSharpModel model2)
16361665
}
16371666
LastFuncCalled = "TestAction3";
16381667
}
1668+
1669+
public static string GenericOverloadTestMethod(CSharpModel testArg1, string testArg2, decimal testArgs3 = 0m)
1670+
{
1671+
LastFuncCalled = "GenericOverloadTestMethod";
1672+
return string.Empty;
1673+
}
1674+
1675+
public static T GenericOverloadTestMethod<T>(CSharpModel testArg1, string testArg2, decimal testArgs3 = 0m)
1676+
{
1677+
LastFuncCalled = "GenericOverloadTestMethod<T>";
1678+
return default;
1679+
}
16391680
}
16401681

16411682
public class TestImplicitConversion
@@ -1784,4 +1825,14 @@ public enum SomeEnu
17841825
B = 2,
17851826
}
17861827
}
1828+
1829+
public class GenericOverloadTestClass<T>
1830+
{
1831+
public static T GenericOverloadTestMethod(T testArg1, string testArg2, decimal testArgs3 = 0m)
1832+
{
1833+
TestMethodBinder.CSharpModel.LastFuncCalled = "GenericOverloadTestClass<T>.GenericOverloadTestMethod";
1834+
return default;
1835+
1836+
}
1837+
}
17871838
}

src/perf_tests/Python.PerformanceTests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1414
</PackageReference>
1515
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.*" />
16-
<PackageReference Include="quantconnect.pythonnet" Version="2.0.52" GeneratePathProperty="true">
16+
<PackageReference Include="quantconnect.pythonnet" Version="2.0.53" GeneratePathProperty="true">
1717
<IncludeAssets>compile</IncludeAssets>
1818
</PackageReference>
1919
</ItemGroup>
@@ -25,7 +25,7 @@
2525
</Target>
2626

2727
<Target Name="CopyBaseline" AfterTargets="Build">
28-
<Copy SourceFiles="$(NuGetPackageRoot)quantconnect.pythonnet\2.0.52\lib\net10.0\Python.Runtime.dll" DestinationFolder="$(OutDir)baseline" />
28+
<Copy SourceFiles="$(NuGetPackageRoot)quantconnect.pythonnet\2.0.53\lib\net10.0\Python.Runtime.dll" DestinationFolder="$(OutDir)baseline" />
2929
</Target>
3030

3131
<Target Name="CopyNewBuild" AfterTargets="Build">

src/runtime/MethodBinder.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -780,13 +780,11 @@ internal Binding Bind(BorrowedReference inst, BorrowedReference args, BorrowedRe
780780
else
781781
{
782782
bestMatch = matchesTouse
783-
.GroupBy(x => x.KwargsMatched)
784-
.OrderByDescending(x => x.Key)
785-
.First()
786-
.GroupBy(x => x.ImplicitOperations)
787-
.OrderBy(x => x.Key)
788-
.First()
789-
.MinBy(x => GetMatchedArgumentsPrecedence(x.MethodInformation, pyArgCount, kwArgDict?.Keys));
783+
.OrderBy(x => x.Method.IsGenericMethod)
784+
.ThenByDescending(x => x.KwargsMatched)
785+
.ThenBy(x => x.ImplicitOperations)
786+
.ThenBy(x => GetMatchedArgumentsPrecedence(x.MethodInformation, pyArgCount, kwArgDict?.Keys))
787+
.First();
790788
}
791789

792790
var margs = bestMatch.ManagedArgs;

src/runtime/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
[assembly: InternalsVisibleTo("Python.EmbeddingTest, PublicKey=00240000048000009400000006020000002400005253413100040000110000005ffd8f49fb44ab0641b3fd8d55e749f716e6dd901032295db641eb98ee46063cbe0d4a1d121ef0bc2af95f8a7438d7a80a3531316e6b75c2dae92fb05a99f03bf7e0c03980e1c3cfb74ba690aca2f3339ef329313bcc5dccced125a4ffdc4531dcef914602cd5878dc5fbb4d4c73ddfbc133f840231343e013762884d6143189")]
55
[assembly: InternalsVisibleTo("Python.Test, PublicKey=00240000048000009400000006020000002400005253413100040000110000005ffd8f49fb44ab0641b3fd8d55e749f716e6dd901032295db641eb98ee46063cbe0d4a1d121ef0bc2af95f8a7438d7a80a3531316e6b75c2dae92fb05a99f03bf7e0c03980e1c3cfb74ba690aca2f3339ef329313bcc5dccced125a4ffdc4531dcef914602cd5878dc5fbb4d4c73ddfbc133f840231343e013762884d6143189")]
66

7-
[assembly: AssemblyVersion("2.0.52")]
8-
[assembly: AssemblyFileVersion("2.0.52")]
7+
[assembly: AssemblyVersion("2.0.53")]
8+
[assembly: AssemblyFileVersion("2.0.53")]

src/runtime/Python.Runtime.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<RootNamespace>Python.Runtime</RootNamespace>
66
<AssemblyName>Python.Runtime</AssemblyName>
77
<PackageId>QuantConnect.pythonnet</PackageId>
8-
<Version>2.0.52</Version>
8+
<Version>2.0.53</Version>
99
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
1010
<PackageLicenseFile>LICENSE</PackageLicenseFile>
1111
<RepositoryUrl>https://github.com/pythonnet/pythonnet</RepositoryUrl>

0 commit comments

Comments
 (0)