Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
909ed1f
dropped net40 target from modern projects
lostmsu Nov 30, 2020
47e926e
use .NET Standard 2.0 platform detection features
lostmsu Dec 2, 2020
21683b3
drop NativeCodePage alltogether
lostmsu Dec 2, 2020
972c41d
WIP: use C# 9 function pointers for PInvoke
lostmsu Dec 4, 2020
51e5184
allow setting PythonDLL
lostmsu Dec 10, 2020
2498d47
always explicitly specify the way strings are marshaled
lostmsu Jan 22, 2021
70fc803
CI: figure out DLL name from environment
lostmsu Jan 22, 2021
28a5dab
use Roslyn preview in CI
lostmsu Jan 22, 2021
c75229a
fixed Linux and Mac DLL loaders breaking dll path
lostmsu Jan 22, 2021
a0a1dc1
correctly detect DLL on *nix when running from Python
lostmsu Jan 22, 2021
1b88783
Windows library loader: add support for hModule == 0
lostmsu Jan 22, 2021
2c1aaef
fix dll loading in tests
lostmsu Jan 22, 2021
39e41d0
mentiond PythonDLL in changelog
lostmsu Jan 22, 2021
17040fe
set PYDLL in AppVeyor
lostmsu Jan 22, 2021
b7410b6
revert automatically added 'm' suffix for *nix default dll name
lostmsu Jan 22, 2021
275cae9
specify full DLL name instead of PYVER in GH Actions
lostmsu Jan 22, 2021
b4cb37e
use Microsoft.Net.Compilers.Toolset instead of Microsoft.Net.Compilers
lostmsu Jan 23, 2021
f68e581
in CI MacOS python DLL has 'm' suffix
lostmsu Jan 23, 2021
cda604a
only set PYTHONNET_PYDLL for test runs from .NET
lostmsu Jan 23, 2021
3982892
workaround for pytest/clr module not preloading python C API library
lostmsu Jan 23, 2021
a6cbe20
addressed a few code comments
lostmsu Jan 26, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
addressed a few code comments
  • Loading branch information
lostmsu committed Jan 28, 2021
commit a6cbe20cc81de4b0fc2b331b0a8ba53fc2d0311b
10 changes: 10 additions & 0 deletions src/runtime/NewReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ ref struct NewReference
{
IntPtr pointer;

/// <summary>Creates a <see cref="NewReference"/> pointing to the same object</summary>
public NewReference(BorrowedReference reference, bool canBeNull = false)
{
var address = canBeNull
? reference.DangerousGetAddressOrNull()
: reference.DangerousGetAddress();
Runtime.XIncref(address);
this.pointer = address;
}

[Pure]
public static implicit operator BorrowedReference(in NewReference reference)
=> new BorrowedReference(reference.pointer);
Expand Down
4 changes: 2 additions & 2 deletions src/runtime/converter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,9 @@ internal static IntPtr ToPython(object value, Type type)
// return Runtime.PyFloat_FromDouble((double)((float)value));
string ss = ((float)value).ToString(nfi);
IntPtr ps = Runtime.PyString_FromString(ss);
IntPtr op = Runtime.PyFloat_FromString(ps, IntPtr.Zero);
NewReference op = Runtime.PyFloat_FromString(new BorrowedReference(ps));;
Runtime.XDecref(ps);
return op;
return op.DangerousMoveToPointerOrNull();

case TypeCode.Double:
return Runtime.PyFloat_FromDouble((double)value);
Expand Down
5 changes: 2 additions & 3 deletions src/runtime/importhook.cs
Original file line number Diff line number Diff line change
Expand Up @@ -306,15 +306,14 @@ public static IntPtr __import__(IntPtr self, IntPtr argsRaw, IntPtr kw)
var mod = ManagedType.GetManagedObject(module) as ModuleObject;
mod?.LoadNames();
}
return Runtime.NewRef(module).DangerousMoveToPointer();
return new NewReference(module).DangerousMoveToPointer();
}
if (clr_prefix != null)
{
return GetCLRModule(fromList).DangerousMoveToPointerOrNull();
}
module = Runtime.PyDict_GetItemString(modules, names[0]);
return Runtime.NewRefOrNull(module)
.DangerousMoveToPointer();
return new NewReference(module, canBeNull: true).DangerousMoveToPointer();
}
Exceptions.Clear();

Expand Down
4 changes: 2 additions & 2 deletions src/runtime/pyfloat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ private static IntPtr FromString(string value)
{
using (var s = new PyString(value))
{
IntPtr val = Runtime.PyFloat_FromString(s.obj, IntPtr.Zero);
NewReference val = Runtime.PyFloat_FromString(s.Reference);
PythonException.ThrowIfIsNull(val);
return val;
return val.DangerousMoveToPointerOrNull();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/runtime/pyobject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ public bool HasAttr(PyObject name)
{
if (name == null) throw new ArgumentNullException(nameof(name));

return Runtime.PyObject_HasAttr(obj, name.obj) != 0;
return Runtime.PyObject_HasAttr(Reference, name.Reference) != 0;
}


Expand Down
42 changes: 12 additions & 30 deletions src/runtime/runtime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -715,15 +715,6 @@ internal static unsafe void XIncref(IntPtr op)
#endif
}

internal static NewReference NewRef(BorrowedReference reference)
{
var address = reference.DangerousGetAddress();
XIncref(address);
return NewReference.DangerousFromPointer(address);
}
internal static NewReference NewRefOrNull(BorrowedReference reference)
=> reference.IsNull ? default : NewRef(reference);

/// <summary>
/// Increase Python's ref counter for the given object, and get the object back.
/// </summary>
Expand Down Expand Up @@ -1039,19 +1030,12 @@ internal static int PyObject_HasAttrString(BorrowedReference pointer, string nam

internal static IntPtr PyObject_GetAttrString(IntPtr pointer, string name)
{
IntPtr nameMem = Marshal.StringToHGlobalAnsi(name);
try
{
return Delegates.PyObject_GetAttrString(pointer, nameMem);
}
finally
{
Marshal.FreeHGlobal(nameMem);
}
using var namePtr = new StrPtr(name, Encoding.UTF8);
return Delegates.PyObject_GetAttrString(pointer, namePtr);
}


internal static IntPtr PyObject_GetAttrString(IntPtr pointer, IntPtr name) => Delegates.PyObject_GetAttrString(pointer, name);
internal static IntPtr PyObject_GetAttrString(IntPtr pointer, StrPtr name) => Delegates.PyObject_GetAttrString(pointer, name);


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

internal static int PyObject_HasAttr(IntPtr pointer, IntPtr name) => Delegates.PyObject_HasAttr(pointer, name);
internal static int PyObject_HasAttr(BorrowedReference pointer, BorrowedReference name) => Delegates.PyObject_HasAttr(pointer, name);


internal static NewReference PyObject_GetAttr(BorrowedReference pointer, IntPtr name)
Expand Down Expand Up @@ -1324,7 +1308,7 @@ internal static bool PyFloat_Check(IntPtr ob)
internal static IntPtr PyFloat_FromDouble(double value) => Delegates.PyFloat_FromDouble(value);


internal static IntPtr PyFloat_FromString(IntPtr value, IntPtr junk) => Delegates.PyFloat_FromString(value, junk);
internal static NewReference PyFloat_FromString(BorrowedReference value) => Delegates.PyFloat_FromString(value);


internal static double PyFloat_AsDouble(IntPtr ob) => Delegates.PyFloat_AsDouble(ob);
Expand Down Expand Up @@ -1990,8 +1974,6 @@ internal static int PySys_SetObject(string name, BorrowedReference ob)
//====================================================================
// Python type object API
//====================================================================
static readonly delegate* unmanaged[Cdecl]<IntPtr, bool> pyType_Check;

internal static bool PyType_Check(IntPtr ob)
{
return PyObject_TypeCheck(ob, PyTypeType);
Expand Down Expand Up @@ -2272,7 +2254,7 @@ private static class Delegates
static Delegates()
{
PyDictProxy_New = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr>)GetFunctionByName(nameof(PyDictProxy_New), GetUnmanagedDll(_PythonDll));
Py_IncRef = (delegate* unmanaged[Cdecl]<IntPtr, void>)GetFunctionByName(nameof(Py_IncRef), GetUnmanagedDll(_PythonDll));
Py_IncRef = (delegate* unmanaged[Cdecl]<IntPtr, void>)GetFunctionByName(nameof(Py_IncRef), GetUnmanagedDll(_PythonDll));
Py_DecRef = (delegate* unmanaged[Cdecl]<IntPtr, void>)GetFunctionByName(nameof(Py_DecRef), GetUnmanagedDll(_PythonDll));
Py_Initialize = (delegate* unmanaged[Cdecl]<void>)GetFunctionByName(nameof(Py_Initialize), GetUnmanagedDll(_PythonDll));
Py_InitializeEx = (delegate* unmanaged[Cdecl]<int, void>)GetFunctionByName(nameof(Py_InitializeEx), GetUnmanagedDll(_PythonDll));
Expand Down Expand Up @@ -2322,9 +2304,9 @@ static Delegates()
PyCFunction_Call = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyCFunction_Call), GetUnmanagedDll(_PythonDll));
PyMethod_New = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyMethod_New), GetUnmanagedDll(_PythonDll));
PyObject_HasAttrString = (delegate* unmanaged[Cdecl]<BorrowedReference, StrPtr, int>)GetFunctionByName(nameof(PyObject_HasAttrString), GetUnmanagedDll(_PythonDll));
PyObject_GetAttrString = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyObject_GetAttrString), GetUnmanagedDll(_PythonDll));
PyObject_GetAttrString = (delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr>)GetFunctionByName(nameof(PyObject_GetAttrString), GetUnmanagedDll(_PythonDll));
PyObject_SetAttrString = (delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr, int>)GetFunctionByName(nameof(PyObject_SetAttrString), GetUnmanagedDll(_PythonDll));
PyObject_HasAttr = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int>)GetFunctionByName(nameof(PyObject_HasAttr), GetUnmanagedDll(_PythonDll));
PyObject_HasAttr = (delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, int>)GetFunctionByName(nameof(PyObject_HasAttr), GetUnmanagedDll(_PythonDll));
PyObject_GetAttr = (delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, NewReference>)GetFunctionByName(nameof(PyObject_GetAttr), GetUnmanagedDll(_PythonDll));
PyObject_SetAttr = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, int>)GetFunctionByName(nameof(PyObject_SetAttr), GetUnmanagedDll(_PythonDll));
PyObject_GetItem = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyObject_GetItem), GetUnmanagedDll(_PythonDll));
Expand Down Expand Up @@ -2382,7 +2364,7 @@ static Delegates()
PyLong_FromVoidPtr = (delegate* unmanaged[Cdecl]<IntPtr, NewReference>)GetFunctionByName(nameof(PyLong_FromVoidPtr), GetUnmanagedDll(_PythonDll));
PyLong_AsVoidPtr = (delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr>)GetFunctionByName(nameof(PyLong_AsVoidPtr), GetUnmanagedDll(_PythonDll));
PyFloat_FromDouble = (delegate* unmanaged[Cdecl]<double, IntPtr>)GetFunctionByName(nameof(PyFloat_FromDouble), GetUnmanagedDll(_PythonDll));
PyFloat_FromString = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyFloat_FromString), GetUnmanagedDll(_PythonDll));
PyFloat_FromString = (delegate* unmanaged[Cdecl]<BorrowedReference, NewReference>)GetFunctionByName(nameof(PyFloat_FromString), GetUnmanagedDll(_PythonDll));
PyFloat_AsDouble = (delegate* unmanaged[Cdecl]<IntPtr, double>)GetFunctionByName(nameof(PyFloat_AsDouble), GetUnmanagedDll(_PythonDll));
PyNumber_Add = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyNumber_Add), GetUnmanagedDll(_PythonDll));
PyNumber_Subtract = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr>)GetFunctionByName(nameof(PyNumber_Subtract), GetUnmanagedDll(_PythonDll));
Expand Down Expand Up @@ -2594,9 +2576,9 @@ static Delegates()
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr> PyCFunction_Call { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, IntPtr> PyMethod_New { get; }
internal static delegate* unmanaged[Cdecl]<BorrowedReference, StrPtr, int> PyObject_HasAttrString { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyObject_GetAttrString { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr> PyObject_GetAttrString { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, StrPtr, IntPtr, int> PyObject_SetAttrString { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, int> PyObject_HasAttr { get; }
internal static delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, int> PyObject_HasAttr { get; }
internal static delegate* unmanaged[Cdecl]<BorrowedReference, BorrowedReference, NewReference> PyObject_GetAttr { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr, int> PyObject_SetAttr { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyObject_GetItem { get; }
Expand Down Expand Up @@ -2647,7 +2629,7 @@ static Delegates()
internal static delegate* unmanaged[Cdecl]<IntPtr, NewReference> PyLong_FromVoidPtr { get; }
internal static delegate* unmanaged[Cdecl]<BorrowedReference, IntPtr> PyLong_AsVoidPtr { get; }
internal static delegate* unmanaged[Cdecl]<double, IntPtr> PyFloat_FromDouble { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyFloat_FromString { get; }
internal static delegate* unmanaged[Cdecl]<BorrowedReference, NewReference> PyFloat_FromString { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, double> PyFloat_AsDouble { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyNumber_Add { get; }
internal static delegate* unmanaged[Cdecl]<IntPtr, IntPtr, IntPtr> PyNumber_Subtract { get; }
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/runtime_data.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ internal static void Stash()
Marshal.Copy(data, 0, mem + IntPtr.Size, (int)ms.Length);

ClearCLRData();
#warning this leaks memory in mem

NewReference capsule = PyCapsule_New(mem, IntPtr.Zero, IntPtr.Zero);
PySys_SetObject("clr_data", capsule);
// Let the dictionary own the reference
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/typemanager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,7 @@ public static IntPtr CreateObjectType()
resRef.Dispose();
BorrowedReference A = Runtime.PyDict_GetItemString(globals, "A");
Debug.Assert(!A.IsNull);
return Runtime.NewRef(A).DangerousMoveToPointer();
return new NewReference(A).DangerousMoveToPointer();
}
}
}