FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Fix PyBuffer_GetPointer CI crash · pythonnet/pythonnet@9d0c4e0 · GitHub

Repository navigation

Commit 9d0c4e0

Browse files
andauthored
Fix PyBuffer_GetPointer CI crash
Co-authored-by: filmor <30848+filmor@users.noreply.github.com>
1 parent ab33b86 commit 9d0c4e0

3 files changed

Lines changed: 8 additions & 10 deletions

File tree

‎src/embed_tests/TestPyBuffer.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void GetPointer()
6868
int[] shape = [10, 10, 10];
6969
PyObject ndArray = np.zeros(shape);
7070

71-
PyBuffer buf = ndArray.GetBuffer(PyBUF.ND);
71+
using PyBuffer buf = ndArray.GetBuffer(PyBUF.STRIDED);
7272

7373
// this throws System.ExecutionEngineException
7474
var ptr = buf.GetPointer([0, 0, 0]);

‎src/runtime/Runtime.Delegates.cs‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.InteropServices;
23

34
using Python.Runtime.Native;
45
using Python.Runtime.Platform;
@@ -9,6 +10,9 @@ public unsafe partial class Runtime
910
{
1011
internal static class Delegates
1112
{
13+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
14+
internal delegate IntPtr PyBufferGetPointer(ref Py_buffer view, [MarshalAs(UnmanagedType.LPArray)] nint[] indices);
15+
1216
static readonly ILibraryLoader libraryLoader = LibraryLoader.Instance;
1317

1418
static Delegates()
@@ -117,7 +121,7 @@ static Delegates()
117121
// only in 3.9+
118122
}
119123
PyBuffer_IsContiguous = (delegate* unmanaged[Cdecl]<ref Py_buffer, char, int>)GetFunctionByName(nameof(PyBuffer_IsContiguous), GetUnmanagedDll(_PythonDll));
120-
PyBuffer_GetPointer = (delegate* unmanaged[Cdecl]<ref Py_buffer, nint*, IntPtr>)GetFunctionByName(nameof(PyBuffer_GetPointer), GetUnmanagedDll(_PythonDll));
124+
PyBuffer_GetPointer = Marshal.GetDelegateForFunctionPointer<PyBufferGetPointer>(GetFunctionByName(nameof(PyBuffer_GetPointer), GetUnmanagedDll(_PythonDll)));
121125
PyBuffer_FromContiguous = (delegate* unmanaged[Cdecl]<ref Py_buffer, IntPtr, IntPtr, char, int>)GetFunctionByName(nameof(PyBuffer_FromContiguous), GetUnmanagedDll(_PythonDll));
122126
PyBuffer_ToContiguous = (delegate* unmanaged[Cdecl]<IntPtr, ref Py_buffer, IntPtr, char, int>)GetFunctionByName(nameof(PyBuffer_ToContiguous), GetUnmanagedDll(_PythonDll));
123127
PyBuffer_FillContiguousStrides = (delegate* unmanaged[Cdecl]<int, IntPtr, IntPtr, int, char, void>)GetFunctionByName(nameof(PyBuffer_FillContiguousStrides), GetUnmanagedDll(_PythonDll));
@@ -394,7 +398,7 @@ static Delegates()
394398
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, void> PyBuffer_Release { get; }
395399
internal static delegate* unmanaged[Cdecl]<StrPtr, nint> PyBuffer_SizeFromFormat { get; }
396400
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, char, int> PyBuffer_IsContiguous { get; }
397-
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, nint*, IntPtr> PyBuffer_GetPointer { get; }
401+
internal static PyBufferGetPointer PyBuffer_GetPointer { get; }
398402
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, IntPtr, IntPtr, char, int> PyBuffer_FromContiguous { get; }
399403
internal static delegate* unmanaged[Cdecl]<IntPtr, ref Py_buffer, IntPtr, char, int> PyBuffer_ToContiguous { get; }
400404
internal static delegate* unmanaged[Cdecl]<int, IntPtr, IntPtr, int, char, void> PyBuffer_FillContiguousStrides { get; }

‎src/runtime/Runtime.cs‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,13 +1017,7 @@ internal static nint PyBuffer_SizeFromFormat(string format)
10171017
internal static int PyBuffer_IsContiguous(ref Py_buffer view, char order) => Delegates.PyBuffer_IsContiguous(ref view, order);
10181018

10191019

1020-
internal static IntPtr PyBuffer_GetPointer(ref Py_buffer view, nint[] indices)
1021-
{
1022-
fixed (nint* indicesPtr = indices)
1023-
{
1024-
return Delegates.PyBuffer_GetPointer(ref view, indicesPtr);
1025-
}
1026-
}
1020+
internal static IntPtr PyBuffer_GetPointer(ref Py_buffer view, nint[] indices) => Delegates.PyBuffer_GetPointer(ref view, indices);
10271021

10281022

10291023
internal static int PyBuffer_FromContiguous(ref Py_buffer view, IntPtr buf, IntPtr len, char fort) => Delegates.PyBuffer_FromContiguous(ref view, buf, len, fort);

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL