Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4909d4

Browse files
committed
workaround for analyzer not permitting copying a reference as the last access to it
1 parent 672aef6 commit c4909d4

File tree

7 files changed

+18
-8
lines changed

7 files changed

+18
-8
lines changed

src/runtime/NewReference.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,9 @@ public static BorrowedReference Borrow(this in NewReference reference)
145145
[Pure]
146146
public static BorrowedReference BorrowOrThrow(this in NewReference reference)
147147
=> reference.IsNull() ? throw PythonException.ThrowLastAsClrException() : reference.BorrowNullable();
148+
149+
[Obsolete]
150+
public static NewReference AnalyzerWorkaround(this in NewReference reference)
151+
=> NewReference.DangerousFromPointer(reference.DangerousGetAddress());
148152
}
149153
}

src/runtime/StolenReference.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,11 @@ public static IntPtr DangerousGetAddressOrNull(this in StolenReference reference
6767
[Pure]
6868
public static IntPtr DangerousGetAddress(this in StolenReference reference)
6969
=> reference.Pointer == IntPtr.Zero ? throw new NullReferenceException() : reference.Pointer;
70+
71+
public static StolenReference AnalyzerWorkaround(this in StolenReference reference)
72+
{
73+
IntPtr ptr = reference.DangerousGetAddressOrNull();
74+
return StolenReference.TakeNullable(ref ptr);
75+
}
7076
}
7177
}

src/runtime/classderived.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ internal static NewReference ToPython(IPythonDerivedType obj)
114114
Runtime.PyObject_GC_Track(self.pyHandle);
115115
}
116116

117-
return result;
117+
return result.AnalyzerWorkaround();
118118
}
119119

120120
/// <summary>

src/runtime/indexer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ internal NewReference GetDefaultArgs(BorrowedReference args)
113113
using var arg = Converter.ToPython(pi[i + pynargs].DefaultValue, pi[i + pynargs].ParameterType);
114114
Runtime.PyTuple_SetItem(defaultArgs.Borrow(), i, arg.Steal());
115115
}
116-
return defaultArgs;
116+
return defaultArgs.AnalyzerWorkaround();
117117
}
118118
}
119119
}

src/runtime/managedtype.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,14 +259,14 @@ protected static BorrowedReference GetObjectDict(BorrowedReference ob)
259259
protected static void SetObjectDict(BorrowedReference ob, StolenReference value)
260260
{
261261
if (value.Pointer == IntPtr.Zero) throw new ArgumentNullException(nameof(value));
262-
SetObjectDictNullable(ob, value);
262+
SetObjectDictNullable(ob, value.AnalyzerWorkaround());
263263
}
264264
protected static void SetObjectDictNullable(BorrowedReference ob, StolenReference value)
265265
{
266266
BorrowedReference type = Runtime.PyObject_TYPE(ob);
267267
int instanceDictOffset = Util.ReadInt32(type, TypeOffset.tp_dictoffset);
268268
Debug.Assert(instanceDictOffset > 0);
269-
Runtime.ReplaceReference(ob, instanceDictOffset, value);
269+
Runtime.ReplaceReference(ob, instanceDictOffset, value.AnalyzerWorkaround());
270270
}
271271

272272
internal static void GetGCHandle(BorrowedReference reflectedClrObject, BorrowedReference type, out IntPtr handle)

src/runtime/metatype.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public static NewReference tp_new(BorrowedReference tp, BorrowedReference args,
174174

175175
Runtime.PyType_Modified(type.Borrow());
176176

177-
return type;
177+
return type.AnalyzerWorkaround();
178178
}
179179

180180

src/runtime/runtime.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ private static void SetPyMemberTypeOf(out PyObject obj, StolenReference value)
418418
}
419419
var @ref = new BorrowedReference(value.Pointer);
420420
var type = PyObject_Type(@ref);
421-
XDecref(value);
421+
XDecref(value.AnalyzerWorkaround());
422422
SetPyMember(out obj, type.StealNullable());
423423
}
424424

@@ -578,7 +578,7 @@ internal static NewReference ExtendTuple(BorrowedReference t, params PyObject[]
578578
PyTuple_SetItem(items.Borrow(), size + n, args[n]);
579579
}
580580

581-
return items;
581+
return items.AnalyzerWorkaround();
582582
}
583583

584584
internal static Type[]? PythonArgsToTypeArray(BorrowedReference arg)
@@ -688,7 +688,7 @@ internal static unsafe void XDecref(StolenReference op)
688688
#endif
689689
#if !CUSTOM_INCDEC_REF
690690
if (op == null) return;
691-
Py_DecRef(op);
691+
Py_DecRef(op.AnalyzerWorkaround());
692692
return;
693693
#else
694694
var p = (void*)op;

0 commit comments

Comments
 (0)