Skip to content

Commit 2c675ce

Browse files
authored
Merge pull request #94 from jhonabreul/bug-managed-comparison
Try comparison against manafged or python object
2 parents a685c20 + d83c4d2 commit 2c675ce

File tree

4 files changed

+43
-17
lines changed

4 files changed

+43
-17
lines changed

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.38" GeneratePathProperty="true">
16+
<PackageReference Include="quantconnect.pythonnet" Version="2.0.39" 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.38\lib\net6.0\Python.Runtime.dll" DestinationFolder="$(OutDir)baseline" />
28+
<Copy SourceFiles="$(NuGetPackageRoot)quantconnect.pythonnet\2.0.39\lib\net6.0\Python.Runtime.dll" DestinationFolder="$(OutDir)baseline" />
2929
</Target>
3030

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

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.38")]
8-
[assembly: AssemblyFileVersion("2.0.38")]
7+
[assembly: AssemblyVersion("2.0.39")]
8+
[assembly: AssemblyFileVersion("2.0.39")]

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.38</Version>
8+
<Version>2.0.39</Version>
99
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
1010
<PackageLicenseFile>LICENSE</PackageLicenseFile>
1111
<RepositoryUrl>https://github.com/pythonnet/pythonnet</RepositoryUrl>

src/runtime/Types/ClassBase.cs

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public virtual NewReference type_subscript(BorrowedReference idx)
9494
public static NewReference tp_richcompare(BorrowedReference ob, BorrowedReference other, int op)
9595
{
9696
CLRObject co1;
97-
CLRObject? co2;
97+
object co2Inst;
9898
BorrowedReference tp = Runtime.PyObject_TYPE(ob);
9999
var cls = (ClassBase)GetManagedObject(tp)!;
100100
// C# operator methods take precedence over IComparable.
@@ -127,17 +127,12 @@ public static NewReference tp_richcompare(BorrowedReference ob, BorrowedReferenc
127127
return new NewReference(pytrue);
128128
}
129129

130-
co1 = (CLRObject)GetManagedObject(ob)!;
131-
co2 = GetManagedObject(other) as CLRObject;
132-
if (null == co2)
130+
if (!TryGetSecondCompareOperandInstance(ob, other, out co1, out co2Inst))
133131
{
134132
return new NewReference(pyfalse);
135133
}
136134

137-
object o1 = co1.inst;
138-
object o2 = co2.inst;
139-
140-
if (Equals(o1, o2))
135+
if (Equals(co1.inst, co2Inst))
141136
{
142137
return new NewReference(pytrue);
143138
}
@@ -147,12 +142,11 @@ public static NewReference tp_richcompare(BorrowedReference ob, BorrowedReferenc
147142
case Runtime.Py_LE:
148143
case Runtime.Py_GT:
149144
case Runtime.Py_GE:
150-
co1 = (CLRObject)GetManagedObject(ob)!;
151-
co2 = GetManagedObject(other) as CLRObject;
152-
if (co1 == null || co2 == null)
145+
if (!TryGetSecondCompareOperandInstance(ob, other, out co1, out co2Inst))
153146
{
154147
return Exceptions.RaiseTypeError("Cannot get managed object");
155148
}
149+
156150
var co1Comp = co1.inst as IComparable;
157151
if (co1Comp == null)
158152
{
@@ -161,7 +155,7 @@ public static NewReference tp_richcompare(BorrowedReference ob, BorrowedReferenc
161155
}
162156
try
163157
{
164-
int cmp = co1Comp.CompareTo(co2.inst);
158+
int cmp = co1Comp.CompareTo(co2Inst);
165159

166160
BorrowedReference pyCmp;
167161
if (cmp < 0)
@@ -208,6 +202,38 @@ public static NewReference tp_richcompare(BorrowedReference ob, BorrowedReferenc
208202
}
209203
}
210204

205+
private static bool TryGetSecondCompareOperandInstance(BorrowedReference left, BorrowedReference right, out CLRObject co1, out object co2Inst)
206+
{
207+
co2Inst = null;
208+
209+
co1 = (CLRObject)GetManagedObject(left)!;
210+
if (co1 == null)
211+
{
212+
return false;
213+
}
214+
215+
var co2 = GetManagedObject(right) as CLRObject;
216+
217+
// The object comparing against is not a managed object. It could still be a Python object
218+
// that can be compared against (e.g. comparing against a Python string)
219+
if (co2 == null)
220+
{
221+
if (right != null)
222+
{
223+
using var pyCo2 = new PyObject(right);
224+
if (Converter.ToManagedValue(pyCo2, typeof(object), out var result, false))
225+
{
226+
co2Inst = result;
227+
return true;
228+
}
229+
}
230+
return false;
231+
}
232+
233+
co2Inst = co2.inst;
234+
return true;
235+
}
236+
211237
/// <summary>
212238
/// Standard iteration support for instances of reflected types. This
213239
/// allows natural iteration over objects that either are IEnumerable

0 commit comments

Comments
 (0)