Skip to content

Commit 6b9f783

Browse files
committed
Use wrappers for 'memory_getbuf' / 'memory_releasebuf'.
1 parent 0889bd1 commit 6b9f783

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

graalpython/com.oracle.graal.python.cext/modules/_memoryview.c

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
releasebufferprocs must NOT decrement view.obj.
5858
*/
5959

60+
POLYGLOT_DECLARE_TYPE(PyMemoryViewObject);
61+
6062
extern PyTypeObject PyNativeMemoryView_Type;
6163

6264
#define CHECK_MBUF_RELEASED(mbuf) \
@@ -646,7 +648,7 @@ memory_alloc(int ndim)
646648
mv->weakreflist = NULL;
647649

648650
_PyObject_GC_TRACK(mv);
649-
return mv;
651+
return polyglot_from_PyMemoryViewObject(mv);
650652
}
651653

652654
/*
@@ -966,7 +968,7 @@ memory_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
966968
return NULL;
967969
}
968970

969-
return PyMemoryView_FromObject(obj);
971+
return polyglot_from_PyMemoryViewObject((PyMemoryViewObject *)PyMemoryView_FromObject(obj));
970972
}
971973

972974

@@ -1418,21 +1420,11 @@ static PyMemoryViewObject* PyTruffle_MemoryView_GetDelegate(PyObject* managed_se
14181420
}
14191421

14201422
static int
1421-
memory_getbuf(PyMemoryViewObject *original_self, Py_buffer *view, int flags)
1423+
memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags)
14221424
{
1423-
PyMemoryViewObject *self = NULL;
14241425
Py_buffer *base = NULL;
14251426
int baseflags = 0;
14261427

1427-
// this code may be reached over different path; self may therefore be the managed wrapper or the native object
1428-
if (PyMemoryView_Check(original_self)) {
1429-
// we need to get the native delegate of the managed memoryview object
1430-
self = PyTruffle_MemoryView_GetDelegate((PyObject*) original_self);
1431-
} else {
1432-
self = original_self;
1433-
}
1434-
assert(Py_TYPE(self) == &PyNativeMemoryView_Type);
1435-
14361428
base = &self->view;
14371429
baseflags = self->flags;
14381430

@@ -3142,6 +3134,28 @@ PyTypeObject PyNativeMemoryView_Type = {
31423134
memory_new, /* tp_new */
31433135
};
31443136

3137+
3138+
static PyMemoryViewObject* _get_managed_self(PyMemoryViewObject *original_self) {
3139+
PyMemoryViewObject *self = NULL;
3140+
3141+
// this code may be reached over different path; self may therefore be the managed wrapper or the native object
3142+
if (PyMemoryView_Check(original_self)) {
3143+
// we need to get the native delegate of the managed memoryview object
3144+
self = PyTruffle_MemoryView_GetDelegate((PyObject*) original_self);
3145+
}
3146+
assert(self != NULL);
3147+
assert(Py_TYPE(self) == &PyNativeMemoryView_Type);
3148+
return self;
3149+
}
3150+
3151+
static int memory_managed_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags) {
3152+
return memory_getbuf(_get_managed_self(self), view, flags);
3153+
}
3154+
3155+
static void memory_managed_releasebuf(PyMemoryViewObject *self, Py_buffer *view) {
3156+
memory_releasebuf(_get_managed_self(self), view);
3157+
}
3158+
31453159
static struct PyModuleDef _memoryviewmodule = {
31463160
PyModuleDef_HEAD_INIT,
31473161
"_memoryview",
@@ -3177,7 +3191,7 @@ PyInit__memoryview(void)
31773191

31783192

31793193
// register buffer procs
3180-
polyglot_invoke(PY_TRUFFLE_CEXT, "PyTruffle_SetBufferProcs", native_to_java((PyObject*)&PyMemoryView_Type), (getbufferproc)memory_getbuf, (releasebufferproc)memory_releasebuf);
3194+
polyglot_invoke(PY_TRUFFLE_CEXT, "PyTruffle_SetBufferProcs", native_to_java((PyObject*)&PyMemoryView_Type), (getbufferproc)memory_managed_getbuf, (releasebufferproc)memory_managed_releasebuf);
31813195

31823196
return m;
31833197
}

0 commit comments

Comments
 (0)