Skip to content

Commit 675ec5f

Browse files
committed
addressed a few code comments
1 parent c0a751b commit 675ec5f

File tree

8 files changed

+31
-40
lines changed

8 files changed

+31
-40
lines changed

src/runtime/NewReference.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@ ref struct NewReference
1111
{
1212
IntPtr pointer;
1313

14+
/// <summary>Creates a <see cref="NewReference"/> pointing to the same object</summary>
15+
public NewReference(BorrowedReference reference, bool canBeNull = false)
16+
{
17+
var address = canBeNull
18+
? reference.DangerousGetAddressOrNull()
19+
: reference.DangerousGetAddress();
20+
Runtime.XIncref(address);
21+
this.pointer = address;
22+
}
23+
1424
[Pure]
1525
public static implicit operator BorrowedReference(in NewReference reference)
1626
=> new BorrowedReference(reference.pointer);

src/runtime/converter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,9 @@ internal static IntPtr ToPython(object value, Type type)
241241
// return Runtime.PyFloat_FromDouble((double)((float)value));
242242
string ss = ((float)value).ToString(nfi);
243243
IntPtr ps = Runtime.PyString_FromString(ss);
244-
IntPtr op = Runtime.PyFloat_FromString(ps, IntPtr.Zero);
244+
NewReference op = Runtime.PyFloat_FromString(new BorrowedReference(ps));;
245245
Runtime.XDecref(ps);
246-
return op;
246+
return op.DangerousMoveToPointerOrNull();
247247

248248
case TypeCode.Double:
249249
return Runtime.PyFloat_FromDouble((double)value);

src/runtime/importhook.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,15 +306,14 @@ public static IntPtr __import__(IntPtr self, IntPtr argsRaw, IntPtr kw)
306306
var mod = ManagedType.GetManagedObject(module) as ModuleObject;
307307
mod?.LoadNames();
308308
}
309-
return Runtime.NewRef(module).DangerousMoveToPointer();
309+
return new NewReference(module).DangerousMoveToPointer();
310310
}
311311
if (clr_prefix != null)
312312
{
313313
return GetCLRModule(fromList).DangerousMoveToPointerOrNull();
314314
}
315315
module = Runtime.PyDict_GetItemString(modules, names[0]);
316-
return Runtime.NewRefOrNull(module)
317-
.DangerousMoveToPointer();
316+
return new NewReference(module, canBeNull: true).DangerousMoveToPointer();
318317
}
319318
Exceptions.Clear();
320319

src/runtime/pyfloat.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ private static IntPtr FromString(string value)
6666
{
6767
using (var s = new PyString(value))
6868
{
69-
IntPtr val = Runtime.PyFloat_FromString(s.obj, IntPtr.Zero);
69+
NewReference val = Runtime.PyFloat_FromString(s.Reference);
7070
PythonException.ThrowIfIsNull(val);
71-
return val;
71+
return val.DangerousMoveToPointerOrNull();
7272
}
7373
}
7474

src/runtime/pyobject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public bool HasAttr(PyObject name)
272272
{
273273
if (name == null) throw new ArgumentNullException(nameof(name));
274274

275-
return Runtime.PyObject_HasAttr(obj, name.obj) != 0;
275+
return Runtime.PyObject_HasAttr(Reference, name.Reference) != 0;
276276
}
277277

278278

src/runtime/runtime.cs

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -715,15 +715,6 @@ internal static unsafe void XIncref(IntPtr op)
715715
#endif
716716
}
717717

718-
internal static NewReference NewRef(BorrowedReference reference)
719-
{
720-
var address = reference.DangerousGetAddress();
721-
XIncref(address);
722-
return NewReference.DangerousFromPointer(address);
723-
}
724-
internal static NewReference NewRefOrNull(BorrowedReference reference)
725-
=> reference.IsNull ? default : NewRef(reference);
726-
727718
/// <summary>
728719
/// Increase Python's ref counter for the given object, and get the object back.
729720
/// </summary>
@@ -1039,19 +1030,12 @@ internal static int PyObject_HasAttrString(BorrowedReference pointer, string nam
10391030

10401031
internal static IntPtr PyObject_GetAttrString(IntPtr pointer, string name)
10411032
{
1042-
IntPtr nameMem = Marshal.StringToHGlobalAnsi(name);
1043-
try
1044-
{
1045-
return Delegates.PyObject_GetAttrString(pointer, nameMem);
1046-
}
1047-
finally
1048-
{
1049-
Marshal.FreeHGlobal(nameMem);
1050-
}
1033+
using var namePtr = new StrPtr(name, Encoding.UTF8);
1034+
return Delegates.PyObject_GetAttrString(pointer, namePtr);
10511035
}
10521036

10531037

1054-
internal static IntPtr PyObject_GetAttrString(IntPtr pointer, IntPtr name) => Delegates.PyObject_GetAttrString(pointer, name);
1038+
internal static IntPtr PyObject_GetAttrString(IntPtr pointer, StrPtr name) => Delegates.PyObject_GetAttrString(pointer, name);
10551039

10561040

10571041
internal static int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value)
@@ -1060,7 +1044,7 @@ internal static int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr v
10601044
return Delegates.PyObject_SetAttrString(pointer, namePtr, value);
10611045
}
10621046

1063-
internal static int PyObject_HasAttr(IntPtr pointer, IntPtr name) => Delegates.PyObject_HasAttr(pointer, name);
1047+
internal static int PyObject_HasAttr(BorrowedReference pointer, BorrowedReference name) => Delegates.PyObject_HasAttr(pointer, name);
10641048

10651049

10661050
internal static NewReference PyObject_GetAttr(BorrowedReference pointer, IntPtr name)
@@ -1344,7 +1328,7 @@ internal static bool PyFloat_Check(IntPtr ob)
13441328
internal static IntPtr PyFloat_FromDouble(double value) => Delegates.PyFloat_FromDouble(value);
13451329

13461330

1347-
internal static IntPtr PyFloat_FromString(IntPtr value, IntPtr junk) => Delegates.PyFloat_FromString(value, junk);
1331+
internal static NewReference PyFloat_FromString(BorrowedReference value) => Delegates.PyFloat_FromString(value);
13481332

13491333

13501334
internal static double PyFloat_AsDouble(IntPtr ob) => Delegates.PyFloat_AsDouble(ob);
@@ -2009,8 +1993,6 @@ internal static int PySys_SetObject(string name, BorrowedReference ob)
20091993
//====================================================================
20101994
// Python type object API
20111995
//====================================================================
2012-
static readonly delegate* unmanaged[Cdecl]<IntPtr, bool> pyType_Check;
2013-
20141996
internal static bool PyType_Check(IntPtr ob)
20151997
{
20161998
return PyObject_TypeCheck(ob, PyTypeType);
@@ -2284,7 +2266,7 @@ private static class Delegates
22842266
static Delegates()
22852267
{
22862268
PyDictProxy_New = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr>)GetFunctionByName(nameof(PyDictProxy_New), GetUnmanagedDll(_PythonDll));
2287-
Py_IncRef = (delegate* unmanaged[Cdecl]<IntPtr, void>)GetFunctionByName(nameof(Py_IncRef), GetUnmanagedDll(_PythonDll));
2269+
Py_IncRef = (delegate* unmanaged[Cdecl]<IntPtr, void>)GetFunctionByName(nameof(Py_IncRef), GetUnmanagedDll(_PythonDll));
22882270
Py_DecRef = (delegate* unmanaged[Cdecl]<IntPtr, void>)GetFunctionByName(nameof(Py_DecRef), GetUnmanagedDll(_PythonDll));
22892271
Py_Initialize = (delegate* unmanaged[Cdecl]<void>)GetFunctionByName(nameof(Py_Initialize), GetUnmanagedDll(_PythonDll));
22902272
Py_InitializeEx = (delegate* unmanaged[Cdecl]<int, void>)GetFunctionByName(nameof(Py_InitializeEx), GetUnmanagedDll(_PythonDll));
@@ -2334,9 +2316,9 @@ static Delegates()
23342316
PyCFunction_Call = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyCFunction_Call), GetUnmanagedDll(_PythonDll));
23352317
PyMethod_New = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyMethod_New), GetUnmanagedDll(_PythonDll));
23362318
PyObject_HasAttrString = (delegate* unmanaged[Cdecl]<BorrowedReference, StrPtr, int>)GetFunctionByName(nameof(PyObject_HasAttrString), GetUnmanagedDll(_PythonDll));
2337-
PyObject_GetAttrString = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyObject_GetAttrString), GetUnmanagedDll(_PythonDll));
2319+
PyObject_GetAttrString = (delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr>)GetFunctionByName(nameof(PyObject_GetAttrString), GetUnmanagedDll(_PythonDll));
23382320
PyObject_SetAttrString = (delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr, int>)GetFunctionByName(nameof(PyObject_SetAttrString), GetUnmanagedDll(_PythonDll));
2339-
PyObject_HasAttr = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int>)GetFunctionByName(nameof(PyObject_HasAttr), GetUnmanagedDll(_PythonDll));
2321+
PyObject_HasAttr = (delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, int>)GetFunctionByName(nameof(PyObject_HasAttr), GetUnmanagedDll(_PythonDll));
23402322
PyObject_GetAttr = (delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, NewReference>)GetFunctionByName(nameof(PyObject_GetAttr), GetUnmanagedDll(_PythonDll));
23412323
PyObject_SetAttr = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, int>)GetFunctionByName(nameof(PyObject_SetAttr), GetUnmanagedDll(_PythonDll));
23422324
PyObject_GetItem = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyObject_GetItem), GetUnmanagedDll(_PythonDll));
@@ -2394,7 +2376,7 @@ static Delegates()
23942376
PyLong_FromVoidPtr = (delegate* unmanaged[Cdecl]<IntPtr, NewReference>)GetFunctionByName(nameof(PyLong_FromVoidPtr), GetUnmanagedDll(_PythonDll));
23952377
PyLong_AsVoidPtr = (delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr>)GetFunctionByName(nameof(PyLong_AsVoidPtr), GetUnmanagedDll(_PythonDll));
23962378
PyFloat_FromDouble = (delegate* unmanaged[Cdecl]<double, IntPtr>)GetFunctionByName(nameof(PyFloat_FromDouble), GetUnmanagedDll(_PythonDll));
2397-
PyFloat_FromString = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyFloat_FromString), GetUnmanagedDll(_PythonDll));
2379+
PyFloat_FromString = (delegate* unmanaged[Cdecl]<BorrowedReference, NewReference>)GetFunctionByName(nameof(PyFloat_FromString), GetUnmanagedDll(_PythonDll));
23982380
PyFloat_AsDouble = (delegate* unmanaged[Cdecl]<IntPtr, double>)GetFunctionByName(nameof(PyFloat_AsDouble), GetUnmanagedDll(_PythonDll));
23992381
PyNumber_Add = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyNumber_Add), GetUnmanagedDll(_PythonDll));
24002382
PyNumber_Subtract = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyNumber_Subtract), GetUnmanagedDll(_PythonDll));
@@ -2606,9 +2588,9 @@ static Delegates()
26062588
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr> PyCFunction_Call { get; }
26072589
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr> PyMethod_New { get; }
26082590
internal static delegate* unmanaged[Cdecl]<BorrowedReference, StrPtr, int> PyObject_HasAttrString { get; }
2609-
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyObject_GetAttrString { get; }
2591+
internal static delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr> PyObject_GetAttrString { get; }
26102592
internal static delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr, int> PyObject_SetAttrString { get; }
2611-
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int> PyObject_HasAttr { get; }
2593+
internal static delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, int> PyObject_HasAttr { get; }
26122594
internal static delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, NewReference> PyObject_GetAttr { get; }
26132595
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, int> PyObject_SetAttr { get; }
26142596
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyObject_GetItem { get; }
@@ -2659,7 +2641,7 @@ static Delegates()
26592641
internal static delegate* unmanaged[Cdecl]<IntPtr, NewReference> PyLong_FromVoidPtr { get; }
26602642
internal static delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr> PyLong_AsVoidPtr { get; }
26612643
internal static delegate* unmanaged[Cdecl]<double, IntPtr> PyFloat_FromDouble { get; }
2662-
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyFloat_FromString { get; }
2644+
internal static delegate* unmanaged[Cdecl]<BorrowedReference, NewReference> PyFloat_FromString { get; }
26632645
internal static delegate* unmanaged[Cdecl]<IntPtr, double> PyFloat_AsDouble { get; }
26642646
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyNumber_Add { get; }
26652647
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyNumber_Subtract { get; }

src/runtime/runtime_data.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ internal static void Stash()
8585
Marshal.Copy(data, 0, mem + IntPtr.Size, (int)ms.Length);
8686

8787
ClearCLRData();
88-
#warning this leaks memory in mem
88+
8989
NewReference capsule = PyCapsule_New(mem, IntPtr.Zero, IntPtr.Zero);
9090
PySys_SetObject("clr_data", capsule);
9191
// Let the dictionary own the reference

src/runtime/typemanager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ public static IntPtr CreateObjectType()
938938
resRef.Dispose();
939939
BorrowedReference A = Runtime.PyDict_GetItemString(globals, "A");
940940
Debug.Assert(!A.IsNull);
941-
return Runtime.NewRef(A).DangerousMoveToPointer();
941+
return new NewReference(A).DangerousMoveToPointer();
942942
}
943943
}
944944
}

0 commit comments

Comments
 (0)