Skip to content

Commit 8e26f3b

Browse files
committed
Try to be strict around non-copyability
1 parent ea059ca commit 8e26f3b

15 files changed

+494
-18
lines changed

Directory.Build.props

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@
1111
<VersionSuffix Condition="$(FullVersion.Contains('-'))">$(FullVersion.Split('-', 2)[1])</VersionSuffix>
1212
</PropertyGroup>
1313
<ItemGroup>
14-
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
15-
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="4.0.1">
14+
<PackageReference Include="Microsoft.CSharp" Version="4.*" />
15+
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="4.*">
1616
<PrivateAssets>all</PrivateAssets>
1717
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
1818
</PackageReference>
19-
<PackageReference Include="NonCopyableAnalyzer" Version="0.7.0">
20-
<PrivateAssets>all</PrivateAssets>
21-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
22-
</PackageReference>
2319
</ItemGroup>
2420
</Project>

pythonnet.sln

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{142A6752
4848
Directory.Build.props = Directory.Build.props
4949
EndProjectSection
5050
EndProject
51+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NonCopyableAnalyzer", "tools\NonCopyableAnalyzer\NonCopyableAnalyzer.csproj", "{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}"
52+
EndProject
5153
Global
5254
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5355
Debug|Any CPU = Debug|Any CPU
@@ -187,11 +189,32 @@ Global
187189
{35CBBDEB-FC07-4D04-9D3E-F88FC180110B}.TraceAlloc|x64.Build.0 = Debug|Any CPU
188190
{35CBBDEB-FC07-4D04-9D3E-F88FC180110B}.TraceAlloc|x86.ActiveCfg = Debug|Any CPU
189191
{35CBBDEB-FC07-4D04-9D3E-F88FC180110B}.TraceAlloc|x86.Build.0 = Debug|Any CPU
192+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
193+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
194+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Debug|x64.ActiveCfg = Debug|Any CPU
195+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Debug|x64.Build.0 = Debug|Any CPU
196+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Debug|x86.ActiveCfg = Debug|Any CPU
197+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Debug|x86.Build.0 = Debug|Any CPU
198+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
199+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Release|Any CPU.Build.0 = Release|Any CPU
200+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Release|x64.ActiveCfg = Release|Any CPU
201+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Release|x64.Build.0 = Release|Any CPU
202+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Release|x86.ActiveCfg = Release|Any CPU
203+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.Release|x86.Build.0 = Release|Any CPU
204+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.TraceAlloc|Any CPU.ActiveCfg = Debug|Any CPU
205+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.TraceAlloc|Any CPU.Build.0 = Debug|Any CPU
206+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.TraceAlloc|x64.ActiveCfg = Debug|Any CPU
207+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.TraceAlloc|x64.Build.0 = Debug|Any CPU
208+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.TraceAlloc|x86.ActiveCfg = Debug|Any CPU
209+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF}.TraceAlloc|x86.Build.0 = Debug|Any CPU
190210
EndGlobalSection
191211
GlobalSection(SolutionProperties) = preSolution
192212
HideSolutionNode = FALSE
193213
EndGlobalSection
194214
GlobalSection(ExtensibilityGlobals) = postSolution
195215
SolutionGuid = {C8845072-C642-4858-8627-27E862AD21BB}
196216
EndGlobalSection
217+
GlobalSection(NestedProjects) = preSolution
218+
{FE20DBEA-F4F9-4280-AD5E-82B82AE32DDF} = {BC426F42-8494-4AA5-82C9-5109ACD97BD1}
219+
EndGlobalSection
197220
EndGlobal

src/runtime/Native/NativeCall.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23

34
namespace Python.Runtime
45
{
@@ -9,12 +10,13 @@ namespace Python.Runtime
910
/// situations (specifically, calling functions through Python
1011
/// type structures) where we need to call functions indirectly.
1112
/// </summary>
13+
[ExcludeFromCodeCoverage]
1214
internal unsafe class NativeCall
1315
{
1416
public static void CallDealloc(IntPtr fp, StolenReference a1)
1517
{
16-
var d = (delegate* unmanaged[Cdecl]<StolenReference, void>)fp;
17-
d(a1);
18+
var d = (delegate* unmanaged[Cdecl]<IntPtr, void>)fp;
19+
d(a1.DangerousGetAddress());
1820
}
1921

2022
public static NewReference Call_3(IntPtr fp, BorrowedReference a1, BorrowedReference a2, BorrowedReference a3)

src/runtime/Native/NewReference.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public void Dispose()
124124
/// </summary>
125125
[Pure]
126126
public static NewReference DangerousFromPointer(IntPtr pointer)
127-
=> new() { pointer = pointer};
127+
=> new NewReference { pointer = pointer };
128128

129129
[Pure]
130130
internal static IntPtr DangerousGetAddressOrNull(in NewReference reference) => reference.pointer;

src/runtime/Python.Runtime.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,9 @@
6565
<PackageReference Include="Lost.Compat.NullabilityAttributes" Version="0.0.4" PrivateAssets="All" />
6666
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
6767
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
68+
<ProjectReference Include="..\..\tools\NonCopyableAnalyzer\NonCopyableAnalyzer.csproj">
69+
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
70+
<OutputItemType>Analyzer</OutputItemType>
71+
</ProjectReference>
6872
</ItemGroup>
6973
</Project>

src/runtime/PythonTypes/PyFloat.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,6 @@ public static PyFloat AsFloat(PyObject value)
103103
public double ToDouble() => Runtime.PyFloat_AsDouble(obj);
104104

105105
public override TypeCode GetTypeCode() => TypeCode.Double;
106+
public override int GetHashCode() => ((PyObject)this).GetHashCode();
106107
}
107108
}

src/runtime/PythonTypes/PyInt.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,5 +232,6 @@ public string ToString(string format, IFormatProvider formatProvider)
232232
}
233233

234234
public override TypeCode GetTypeCode() => TypeCode.Int64;
235+
public override int GetHashCode() => ((PyObject)this).GetHashCode();
235236
}
236237
}

src/runtime/Runtime.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ internal static T TryUsingDll<T>(Func<T> op)
678678
/// </summary>
679679
/// <param name="ob">PyObject Ptr</param>
680680

681-
internal static void Py_DecRef(StolenReference ob) => Delegates.Py_DecRef(ob);
681+
internal static void Py_DecRef(StolenReference ob) => Delegates.Py_DecRef(ob.AnalyzerWorkaround());
682682

683683

684684
internal static void Py_Initialize() => Delegates.Py_Initialize();
@@ -1459,7 +1459,7 @@ internal static bool PyList_Check(BorrowedReference ob)
14591459

14601460
internal static BorrowedReference PyList_GetItem(BorrowedReference pointer, nint index) => Delegates.PyList_GetItem(pointer, index);
14611461

1462-
internal static int PyList_SetItem(BorrowedReference pointer, nint index, StolenReference value) => Delegates.PyList_SetItem(pointer, index, value);
1462+
internal static int PyList_SetItem(BorrowedReference pointer, nint index, StolenReference value) => Delegates.PyList_SetItem(pointer, index, value.AnalyzerWorkaround());
14631463

14641464
internal static int PyList_Insert(BorrowedReference pointer, nint index, BorrowedReference value) => Delegates.PyList_Insert(pointer, index, value);
14651465

@@ -1497,7 +1497,7 @@ internal static int PyTuple_SetItem(BorrowedReference pointer, nint index, Borro
14971497
return PyTuple_SetItem(pointer, index, newRef.Steal());
14981498
}
14991499

1500-
internal static int PyTuple_SetItem(BorrowedReference pointer, nint index, StolenReference value) => Delegates.PyTuple_SetItem(pointer, index, value);
1500+
internal static int PyTuple_SetItem(BorrowedReference pointer, nint index, StolenReference value) => Delegates.PyTuple_SetItem(pointer, index, value.AnalyzerWorkaround());
15011501

15021502
internal static NewReference PyTuple_GetSlice(BorrowedReference pointer, nint start, nint end) => Delegates.PyTuple_GetSlice(pointer, start, end);
15031503

@@ -1657,7 +1657,7 @@ internal static bool PyType_IsSameAsOrSubtype(BorrowedReference type, BorrowedRe
16571657
internal static NewReference PyObject_GenericGetDict(BorrowedReference o) => PyObject_GenericGetDict(o, IntPtr.Zero);
16581658
internal static NewReference PyObject_GenericGetDict(BorrowedReference o, IntPtr context) => Delegates.PyObject_GenericGetDict(o, context);
16591659

1660-
internal static void PyObject_GC_Del(StolenReference ob) => Delegates.PyObject_GC_Del(ob);
1660+
internal static void PyObject_GC_Del(StolenReference ob) => Delegates.PyObject_GC_Del(ob.AnalyzerWorkaround());
16611661

16621662

16631663
internal static bool PyObject_GC_IsTracked(BorrowedReference ob)
@@ -1720,7 +1720,7 @@ internal static void PyErr_SetString(BorrowedReference ob, string message)
17201720
internal static void PyErr_Fetch(out NewReference type, out NewReference val, out NewReference tb) => Delegates.PyErr_Fetch(out type, out val, out tb);
17211721

17221722

1723-
internal static void PyErr_Restore(StolenReference type, StolenReference val, StolenReference tb) => Delegates.PyErr_Restore(type, val, tb);
1723+
internal static void PyErr_Restore(StolenReference type, StolenReference val, StolenReference tb) => Delegates.PyErr_Restore(type.AnalyzerWorkaround(), val.AnalyzerWorkaround(), tb.AnalyzerWorkaround());
17241724

17251725

17261726
internal static void PyErr_Clear() => Delegates.PyErr_Clear();
@@ -1738,7 +1738,7 @@ internal static NewReference PyException_GetTraceback(BorrowedReference ex)
17381738
/// Set the cause associated with the exception to cause. Use NULL to clear it. There is no type check to make sure that cause is either an exception instance or None. This steals a reference to cause.
17391739
/// </summary>
17401740
internal static void PyException_SetCause(BorrowedReference ex, StolenReference cause)
1741-
=> Delegates.PyException_SetCause(ex, cause);
1741+
=> Delegates.PyException_SetCause(ex, cause.AnalyzerWorkaround());
17421742
internal static int PyException_SetTraceback(BorrowedReference ex, BorrowedReference tb)
17431743
=> Delegates.PyException_SetTraceback(ex, tb);
17441744

src/runtime/Types/Iterator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ public static NewReference tp_iternext(BorrowedReference ob)
4646
return Converter.ToPython(item, self.elemType);
4747
}
4848

49-
public static NewReference tp_iter(BorrowedReference ob) => new (ob);
49+
public static NewReference tp_iter(BorrowedReference ob) => new NewReference(ob);
5050
}
5151
}

src/runtime/Types/ManagedType.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ internal static unsafe void DecrefTypeAndFree(StolenReference ob)
8383

8484
var freePtr = Util.ReadIntPtr(type, TypeOffset.tp_free);
8585
Debug.Assert(freePtr != IntPtr.Zero);
86-
var free = (delegate* unmanaged[Cdecl]<StolenReference, void>)freePtr;
87-
free(ob);
86+
var free = (delegate* unmanaged[Cdecl]<ref StolenReference, void>)freePtr;
87+
free(ref ob);
8888

8989
Runtime.XDecref(StolenReference.DangerousFromPointer(type.DangerousGetAddress()));
9090
}

0 commit comments

Comments
 (0)