Skip to content

Commit 63de923

Browse files
committed
Review changes, update API usage
1 parent ff170e9 commit 63de923

File tree

6 files changed

+51
-57
lines changed

6 files changed

+51
-57
lines changed

src/embed_tests/pyimport.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void SetUp()
3737
Assert.IsFalse(str == IntPtr.Zero);
3838
BorrowedReference path = Runtime.Runtime.PySys_GetObject("path");
3939
Assert.IsFalse(path.IsNull);
40-
Runtime.Runtime.PyList_Append(path, str);
40+
Runtime.Runtime.PyList_Append(path, new BorrowedReference(str));
4141
Runtime.Runtime.XDecref(str);
4242
}
4343

src/runtime/BorrowedReference.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ readonly ref struct BorrowedReference
99
{
1010
readonly IntPtr pointer;
1111
public bool IsNull => this.pointer == IntPtr.Zero;
12-
public bool IsNone => this.pointer == Runtime.PyNone;
1312

1413
/// <summary>Gets a raw pointer to the Python object</summary>
1514
public IntPtr DangerousGetAddress()

src/runtime/importhook.cs

Lines changed: 24 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ internal static void RestoreRuntimeData(RuntimeDataStorage storage)
101101
var rootHandle = storage.GetValue<IntPtr>("root");
102102
root = (CLRModule)ManagedType.GetManagedObject(rootHandle);
103103
BorrowedReference dict = Runtime.PyImport_GetModuleDict();
104-
Runtime.PyDict_SetItemString(dict.DangerousGetAddress(), "clr", py_clr_module);
104+
Runtime.PyDict_SetItemString(dict, "clr", ClrModuleReference);
105105
SetupNamespaceTracking();
106106
}
107107

@@ -115,14 +115,12 @@ static void SetupImportHook()
115115
var exec = Runtime.PyDict_GetItemString(builtins, "exec");
116116
using var args = NewReference.DangerousFromPointer(Runtime.PyTuple_New(2));
117117

118-
IntPtr codeStr = Runtime.PyString_FromString(LoaderCode);
119-
Runtime.PyTuple_SetItem(args.DangerousGetAddress(), 0, codeStr);
120-
// PyTuple_SetItem steals a reference, mod_dict is borrowed.
118+
var codeStr = NewReference.DangerousFromPointer(Runtime.PyString_FromString(LoaderCode));
119+
Runtime.PyTuple_SetItem(args, 0, codeStr);
121120
var mod_dict = Runtime.PyModule_GetDict(import_hook_module);
122-
Runtime.XIncref(mod_dict.DangerousGetAddress());
123-
Runtime.PyTuple_SetItem(args.DangerousGetAddress(), 1, mod_dict.DangerousGetAddress());
124-
Runtime.PyObject_Call(exec.DangerousGetAddress(), args.DangerousGetAddress(), IntPtr.Zero);
125-
121+
// reference not stolen due to overload incref'ing for us.
122+
Runtime.PyTuple_SetItem(args, 1, mod_dict);
123+
Runtime.PyObject_Call(exec, args, default);
126124
// Set as a sub-module of clr.
127125
if(Runtime.PyModule_AddObject(ClrModuleReference, "loader", import_hook_module) != 0)
128126
{
@@ -132,9 +130,8 @@ static void SetupImportHook()
132130

133131
// Finally, add the hook to the meta path
134132
var findercls = Runtime.PyDict_GetItemString(mod_dict, "DotNetFinder");
135-
var finderCtorArgs = Runtime.PyTuple_New(0);
136-
var finder_inst = Runtime.PyObject_CallObject(findercls.DangerousGetAddress(), finderCtorArgs);
137-
Runtime.XDecref(finderCtorArgs);
133+
var finderCtorArgs = NewReference.DangerousFromPointer(Runtime.PyTuple_New(0));
134+
var finder_inst = Runtime.PyObject_CallObject(findercls, finderCtorArgs);
138135
var metapath = Runtime.PySys_GetObject("meta_path");
139136
Runtime.PyList_Append(metapath, finder_inst);
140137
}
@@ -147,34 +144,19 @@ static void SetupImportHook()
147144
/// </summary>
148145
static void SetupNamespaceTracking()
149146
{
150-
var newset = Runtime.PySet_New(default);
151-
try
147+
using var newset = Runtime.PySet_New(default);
148+
foreach (var ns in AssemblyManager.GetNamespaces())
152149
{
153-
foreach (var ns in AssemblyManager.GetNamespaces())
150+
using var pyNs = NewReference.DangerousFromPointer(Runtime.PyString_FromString(ns));
151+
if (Runtime.PySet_Add(newset, pyNs) != 0)
154152
{
155-
var pyNs = Runtime.PyString_FromString(ns);
156-
try
157-
{
158-
if (Runtime.PySet_Add(newset, new BorrowedReference(pyNs)) != 0)
159-
{
160-
throw PythonException.ThrowLastAsClrException();
161-
}
162-
}
163-
finally
164-
{
165-
Runtime.XDecref(pyNs);
166-
}
153+
throw PythonException.ThrowLastAsClrException();
167154
}
168-
169-
if (Runtime.PyDict_SetItemString(root.dict, availableNsKey, newset.DangerousGetAddress()) != 0)
155+
if (Runtime.PyDict_SetItemString(root.DictRef, availableNsKey, newset) != 0)
170156
{
171157
throw PythonException.ThrowLastAsClrException();
172158
}
173159
}
174-
finally
175-
{
176-
newset.Dispose();
177-
}
178160

179161
}
180162

@@ -189,24 +171,21 @@ static void TeardownNameSpaceTracking()
189171

190172
public static void AddNamespace(string name)
191173
{
192-
using (Py.GIL())
174+
var pyNs = Runtime.PyString_FromString(name);
175+
try
193176
{
194-
var pyNs = Runtime.PyString_FromString(name);
195-
try
177+
var nsSet = Runtime.PyDict_GetItemString(new BorrowedReference(root.dict), availableNsKey);
178+
if (!(nsSet.IsNull || nsSet.DangerousGetAddress() == Runtime.PyNone))
196179
{
197-
var nsSet = Runtime.PyDict_GetItemString(new BorrowedReference(root.dict), availableNsKey);
198-
if (!(nsSet.IsNull && nsSet.IsNone))
180+
if (Runtime.PySet_Add(nsSet, new BorrowedReference(pyNs)) != 0)
199181
{
200-
if (Runtime.PySet_Add(nsSet, new BorrowedReference(pyNs)) != 0)
201-
{
202-
throw PythonException.ThrowLastAsClrException();
203-
}
182+
throw PythonException.ThrowLastAsClrException();
204183
}
205184
}
206-
finally
207-
{
208-
Runtime.XDecref(pyNs);
209-
}
185+
}
186+
finally
187+
{
188+
Runtime.XDecref(pyNs);
210189
}
211190
}
212191

src/runtime/moduleobject.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ public void LoadNames()
194194
var pyname = Runtime.PyString_FromString(name);
195195
try
196196
{
197-
if (Runtime.PyList_Append(new BorrowedReference(__all__), pyname) != 0)
197+
if (Runtime.PyList_Append(new BorrowedReference(__all__), new BorrowedReference(pyname)) != 0)
198198
{
199199
throw PythonException.ThrowLastAsClrException();
200200
}
@@ -598,10 +598,8 @@ public static string[] ListAssemblies(bool verbose)
598598
public static ModuleObject _load_clr_module(PyObject spec)
599599
{
600600
ModuleObject mod = null;
601-
using (var modname = spec.GetAttr("name"))
602-
{
603-
mod = ImportHook.Import(modname.ToString());
604-
}
601+
using var modname = spec.GetAttr("name");
602+
mod = ImportHook.Import(modname.ToString());
605603
return mod;
606604
}
607605
}

src/runtime/pylist.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public static PyList AsList(PyObject value)
132132
/// </remarks>
133133
public void Append(PyObject item)
134134
{
135-
int r = Runtime.PyList_Append(this.Reference, item.obj);
135+
int r = Runtime.PyList_Append(this.Reference, new BorrowedReference(item.obj));
136136
if (r < 0)
137137
{
138138
throw PythonException.ThrowLastAsClrException();

src/runtime/runtime.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ internal static void Initialize(bool initSigs = false, ShutdownMode mode = Shutd
174174
IntPtr item = PyString_FromString(rtdir);
175175
if (PySequence_Contains(path, item) == 0)
176176
{
177-
PyList_Append(new BorrowedReference(path), item);
177+
PyList_Append(new BorrowedReference(path), new BorrowedReference(item));
178178
}
179179
XDecref(item);
180180
AssemblyManager.UpdatePath();
@@ -1087,6 +1087,8 @@ internal static IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name)
10871087

10881088

10891089
internal static IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw) => Delegates.PyObject_Call(pointer, args, kw);
1090+
internal static IntPtr PyObject_Call(BorrowedReference pointer, BorrowedReference args, BorrowedReference kw)
1091+
=> Delegates.PyObject_Call(pointer.DangerousGetAddress(), args.DangerousGetAddress(), kw.DangerousGetAddressOrNull());
10901092

10911093

10921094
internal static NewReference PyObject_CallObject(BorrowedReference callable, BorrowedReference args) => Delegates.PyObject_CallObject(callable, args);
@@ -1822,7 +1824,7 @@ internal static int PyList_Insert(BorrowedReference pointer, long index, IntPtr
18221824
private static int PyList_Insert(BorrowedReference pointer, IntPtr index, IntPtr value) => Delegates.PyList_Insert(pointer, index, value);
18231825

18241826

1825-
internal static int PyList_Append(BorrowedReference pointer, IntPtr value) => Delegates.PyList_Append(pointer, value);
1827+
internal static int PyList_Append(BorrowedReference pointer, BorrowedReference value) => Delegates.PyList_Append(pointer, value);
18261828

18271829

18281830
internal static int PyList_Reverse(BorrowedReference pointer) => Delegates.PyList_Reverse(pointer);
@@ -1885,7 +1887,15 @@ internal static int PyTuple_SetItem(IntPtr pointer, long index, IntPtr value)
18851887
{
18861888
return PyTuple_SetItem(pointer, new IntPtr(index), value);
18871889
}
1890+
internal static int PyTuple_SetItem(BorrowedReference pointer, long index, StolenReference value)
1891+
=> PyTuple_SetItem(pointer.DangerousGetAddress(), new IntPtr(index), value.DangerousGetAddressOrNull());
18881892

1893+
internal static int PyTuple_SetItem(BorrowedReference pointer, long index, BorrowedReference value)
1894+
{
1895+
var increfValue = value.DangerousGetAddress();
1896+
Runtime.XIncref(increfValue);
1897+
return PyTuple_SetItem(pointer.DangerousGetAddress(), new IntPtr(index), increfValue);
1898+
}
18891899

18901900
private static int PyTuple_SetItem(IntPtr pointer, IntPtr index, IntPtr value) => Delegates.PyTuple_SetItem(pointer, index, value);
18911901

@@ -1944,6 +1954,14 @@ internal static string PyModule_GetFilename(IntPtr module)
19441954

19451955

19461956
internal static IntPtr PyImport_Import(IntPtr name) => Delegates.PyImport_Import(name);
1957+
1958+
/// <summary>
1959+
/// We can't use a StolenReference here because the reference is stolen only on success.
1960+
/// </summary>
1961+
/// <param name="module">The module to add the object to.</param>
1962+
/// <param name="name">The key that will refer to the object.</param>
1963+
/// <param name="stolenObject">The object to add to the module.</param>
1964+
/// <returns>Return -1 on error, 0 on success.</returns>
19471965
internal static int PyModule_AddObject(BorrowedReference module, string name, BorrowedReference stolenObject)
19481966
{
19491967
using var namePtr = new StrPtr(name, Encoding.UTF8);
@@ -2483,7 +2501,7 @@ static Delegates()
24832501
PyList_GetItem = (delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr, BorrowedReference>)GetFunctionByName(nameof(PyList_GetItem), GetUnmanagedDll(_PythonDll));
24842502
PyList_SetItem = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, int>)GetFunctionByName(nameof(PyList_SetItem), GetUnmanagedDll(_PythonDll));
24852503
PyList_Insert = (delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr, IntPtr, int>)GetFunctionByName(nameof(PyList_Insert), GetUnmanagedDll(_PythonDll));
2486-
PyList_Append = (delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr, int>)GetFunctionByName(nameof(PyList_Append), GetUnmanagedDll(_PythonDll));
2504+
PyList_Append = (delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, int>)GetFunctionByName(nameof(PyList_Append), GetUnmanagedDll(_PythonDll));
24872505
PyList_Reverse = (delegate* unmanaged[Cdecl]<BorrowedReference, int>)GetFunctionByName(nameof(PyList_Reverse), GetUnmanagedDll(_PythonDll));
24882506
PyList_Sort = (delegate* unmanaged[Cdecl]<BorrowedReference, int>)GetFunctionByName(nameof(PyList_Sort), GetUnmanagedDll(_PythonDll));
24892507
PyList_GetSlice = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyList_GetSlice), GetUnmanagedDll(_PythonDll));
@@ -2780,7 +2798,7 @@ static Delegates()
27802798
internal static delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr, BorrowedReference> PyList_GetItem { get; }
27812799
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, int> PyList_SetItem { get; }
27822800
internal static delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr, IntPtr, int> PyList_Insert { get; }
2783-
internal static delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr, int> PyList_Append { get; }
2801+
internal static delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, int> PyList_Append { get; }
27842802
internal static delegate* unmanaged[Cdecl]<BorrowedReference, int> PyList_Reverse { get; }
27852803
internal static delegate* unmanaged[Cdecl]<BorrowedReference, int> PyList_Sort { get; }
27862804
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr> PyList_GetSlice { get; }

0 commit comments

Comments
 (0)