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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy