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

Skip to content

Commit 9fd877e

Browse files
authored
reimplemented some of the PyList members using BorrowedReference (#1068)
1 parent 8ad1062 commit 9fd877e

File tree

5 files changed

+33
-13
lines changed

5 files changed

+33
-13
lines changed

src/embed_tests/pyimport.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void SetUp()
3939

4040
IntPtr str = Runtime.Runtime.PyString_FromString(testPath);
4141
IntPtr path = Runtime.Runtime.PySys_GetObject("path");
42-
Runtime.Runtime.PyList_Append(path, str);
42+
Runtime.Runtime.PyList_Append(new BorrowedReference(path), str);
4343
}
4444

4545
[TearDown]

src/runtime/BorrowedReference.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ readonly ref struct BorrowedReference
1414
public IntPtr DangerousGetAddress()
1515
=> this.IsNull ? throw new NullReferenceException() : this.pointer;
1616

17-
BorrowedReference(IntPtr pointer)
17+
/// <summary>
18+
/// Creates new instance of <see cref="BorrowedReference"/> from raw pointer. Unsafe.
19+
/// </summary>
20+
public BorrowedReference(IntPtr pointer)
1821
{
1922
this.pointer = pointer;
2023
}

src/runtime/pylist.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public static PyList AsList(PyObject value)
120120
/// </remarks>
121121
public void Append(PyObject item)
122122
{
123-
int r = Runtime.PyList_Append(obj, item.obj);
123+
int r = Runtime.PyList_Append(this.Reference, item.obj);
124124
if (r < 0)
125125
{
126126
throw new PythonException();
@@ -135,7 +135,7 @@ public void Append(PyObject item)
135135
/// </remarks>
136136
public void Insert(int index, PyObject item)
137137
{
138-
int r = Runtime.PyList_Insert(obj, index, item.obj);
138+
int r = Runtime.PyList_Insert(this.Reference, index, item.obj);
139139
if (r < 0)
140140
{
141141
throw new PythonException();
@@ -151,7 +151,7 @@ public void Insert(int index, PyObject item)
151151
/// </remarks>
152152
public void Reverse()
153153
{
154-
int r = Runtime.PyList_Reverse(obj);
154+
int r = Runtime.PyList_Reverse(this.Reference);
155155
if (r < 0)
156156
{
157157
throw new PythonException();
@@ -167,7 +167,7 @@ public void Reverse()
167167
/// </remarks>
168168
public void Sort()
169169
{
170-
int r = Runtime.PyList_Sort(obj);
170+
int r = Runtime.PyList_Sort(this.Reference);
171171
if (r < 0)
172172
{
173173
throw new PythonException();

src/runtime/pyobject.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class PyObject : DynamicObject, IEnumerable, IPyDisposable
3333
private bool disposed = false;
3434
private bool _finalized = false;
3535

36+
internal BorrowedReference Reference => new BorrowedReference(obj);
37+
3638
/// <summary>
3739
/// PyObject Constructor
3840
/// </summary>
@@ -52,9 +54,24 @@ public PyObject(IntPtr ptr)
5254
#endif
5355
}
5456

57+
/// <summary>
58+
/// Creates new <see cref="PyObject"/> pointing to the same object as
59+
/// the <paramref name="reference"/>. Increments refcount, allowing <see cref="PyObject"/>
60+
/// to have ownership over its own reference.
61+
/// </summary>
62+
internal PyObject(BorrowedReference reference)
63+
{
64+
if (reference.IsNull) throw new ArgumentNullException(nameof(reference));
65+
66+
obj = Runtime.SelfIncRef(reference.DangerousGetAddress());
67+
#if TRACE_ALLOC
68+
Traceback = new StackTrace(1);
69+
#endif
70+
}
71+
5572
// Protected default constructor to allow subclasses to manage
5673
// initialization in different ways as appropriate.
57-
[Obsolete("Please, always use PyObject(IntPtr)")]
74+
[Obsolete("Please, always use PyObject(*Reference)")]
5875
protected PyObject()
5976
{
6077
#if TRACE_ALLOC

src/runtime/runtime.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ internal static void Initialize(bool initSigs = false)
341341
string rtdir = RuntimeEnvironment.GetRuntimeDirectory();
342342
IntPtr path = PySys_GetObject("path");
343343
IntPtr item = PyString_FromString(rtdir);
344-
PyList_Append(path, item);
344+
PyList_Append(new BorrowedReference(path), item);
345345
XDecref(item);
346346
AssemblyManager.UpdatePath();
347347
}
@@ -1658,22 +1658,22 @@ internal static int PyList_SetItem(IntPtr pointer, long index, IntPtr value)
16581658
[DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)]
16591659
private static extern int PyList_SetItem(IntPtr pointer, IntPtr index, IntPtr value);
16601660

1661-
internal static int PyList_Insert(IntPtr pointer, long index, IntPtr value)
1661+
internal static int PyList_Insert(BorrowedReference pointer, long index, IntPtr value)
16621662
{
16631663
return PyList_Insert(pointer, new IntPtr(index), value);
16641664
}
16651665

16661666
[DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)]
1667-
private static extern int PyList_Insert(IntPtr pointer, IntPtr index, IntPtr value);
1667+
private static extern int PyList_Insert(BorrowedReference pointer, IntPtr index, IntPtr value);
16681668

16691669
[DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)]
1670-
internal static extern int PyList_Append(IntPtr pointer, IntPtr value);
1670+
internal static extern int PyList_Append(BorrowedReference pointer, IntPtr value);
16711671

16721672
[DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)]
1673-
internal static extern int PyList_Reverse(IntPtr pointer);
1673+
internal static extern int PyList_Reverse(BorrowedReference pointer);
16741674

16751675
[DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)]
1676-
internal static extern int PyList_Sort(IntPtr pointer);
1676+
internal static extern int PyList_Sort(BorrowedReference pointer);
16771677

16781678
internal static IntPtr PyList_GetSlice(IntPtr pointer, long start, long end)
16791679
{

0 commit comments

Comments
 (0)