Skip to content

Commit ab33b86

Browse files
committed
Use fixed array for slices in PyBuffer_GetPointer
1 parent 72df9ae commit ab33b86

3 files changed

Lines changed: 25 additions & 4 deletions

File tree

‎src/embed_tests/TestPyBuffer.cs‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,22 @@ public void TestBufferRead()
5858
}
5959

6060
string result = new UTF8Encoding().GetString(managedArray);
61-
Assert.That(result == " " + bufferTestString.Substring(1), Is.True);
61+
Assert.That(result, Is.EqualTo($" {bufferTestString.Substring(1)}"));
62+
}
63+
64+
[Test]
65+
public void GetPointer()
66+
{
67+
// create 3D NumPy array
68+
int[] shape = [10, 10, 10];
69+
PyObject ndArray = np.zeros(shape);
70+
71+
PyBuffer buf = ndArray.GetBuffer(PyBUF.ND);
72+
73+
// this throws System.ExecutionEngineException
74+
var ptr = buf.GetPointer([0, 0, 0]);
75+
76+
Assert.That(ptr, Is.Not.EqualTo(IntPtr.Zero));
6277
}
6378

6479
[Test]

‎src/runtime/Runtime.Delegates.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ static Delegates()
117117
// only in 3.9+
118118
}
119119
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));
120+
PyBuffer_GetPointer = (delegate* unmanaged[Cdecl]<ref Py_buffer, nint*, IntPtr>)GetFunctionByName(nameof(PyBuffer_GetPointer), GetUnmanagedDll(_PythonDll));
121121
PyBuffer_FromContiguous = (delegate* unmanaged[Cdecl]<ref Py_buffer, IntPtr, IntPtr, char, int>)GetFunctionByName(nameof(PyBuffer_FromContiguous), GetUnmanagedDll(_PythonDll));
122122
PyBuffer_ToContiguous = (delegate* unmanaged[Cdecl]<IntPtr, ref Py_buffer, IntPtr, char, int>)GetFunctionByName(nameof(PyBuffer_ToContiguous), GetUnmanagedDll(_PythonDll));
123123
PyBuffer_FillContiguousStrides = (delegate* unmanaged[Cdecl]<int, IntPtr, IntPtr, int, char, void>)GetFunctionByName(nameof(PyBuffer_FillContiguousStrides), GetUnmanagedDll(_PythonDll));
@@ -394,7 +394,7 @@ static Delegates()
394394
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, void> PyBuffer_Release { get; }
395395
internal static delegate* unmanaged[Cdecl]<StrPtr, nint> PyBuffer_SizeFromFormat { get; }
396396
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; }
397+
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, nint*, IntPtr> PyBuffer_GetPointer { get; }
398398
internal static delegate* unmanaged[Cdecl]<ref Py_buffer, IntPtr, IntPtr, char, int> PyBuffer_FromContiguous { get; }
399399
internal static delegate* unmanaged[Cdecl]<IntPtr, ref Py_buffer, IntPtr, char, int> PyBuffer_ToContiguous { get; }
400400
internal static delegate* unmanaged[Cdecl]<int, IntPtr, IntPtr, int, char, void> PyBuffer_FillContiguousStrides { get; }

‎src/runtime/Runtime.cs‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,13 @@ 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) => Delegates.PyBuffer_GetPointer(ref view, indices);
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+
}
10211027

10221028

10231029
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)