|
57 | 57 | releasebufferprocs must NOT decrement view.obj.
|
58 | 58 | */
|
59 | 59 |
|
| 60 | +POLYGLOT_DECLARE_TYPE(PyMemoryViewObject); |
| 61 | + |
60 | 62 | extern PyTypeObject PyNativeMemoryView_Type;
|
61 | 63 |
|
62 | 64 | #define CHECK_MBUF_RELEASED(mbuf) \
|
@@ -646,7 +648,7 @@ memory_alloc(int ndim)
|
646 | 648 | mv->weakreflist = NULL;
|
647 | 649 |
|
648 | 650 | _PyObject_GC_TRACK(mv);
|
649 |
| - return mv; |
| 651 | + return polyglot_from_PyMemoryViewObject(mv); |
650 | 652 | }
|
651 | 653 |
|
652 | 654 | /*
|
@@ -966,7 +968,7 @@ memory_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
|
966 | 968 | return NULL;
|
967 | 969 | }
|
968 | 970 |
|
969 |
| - return PyMemoryView_FromObject(obj); |
| 971 | + return polyglot_from_PyMemoryViewObject((PyMemoryViewObject *)PyMemoryView_FromObject(obj)); |
970 | 972 | }
|
971 | 973 |
|
972 | 974 |
|
@@ -1418,21 +1420,11 @@ static PyMemoryViewObject* PyTruffle_MemoryView_GetDelegate(PyObject* managed_se
|
1418 | 1420 | }
|
1419 | 1421 |
|
1420 | 1422 | static int
|
1421 |
| -memory_getbuf(PyMemoryViewObject *original_self, Py_buffer *view, int flags) |
| 1423 | +memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags) |
1422 | 1424 | {
|
1423 |
| - PyMemoryViewObject *self = NULL; |
1424 | 1425 | Py_buffer *base = NULL;
|
1425 | 1426 | int baseflags = 0;
|
1426 | 1427 |
|
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 |
| - |
1436 | 1428 | base = &self->view;
|
1437 | 1429 | baseflags = self->flags;
|
1438 | 1430 |
|
@@ -3142,6 +3134,28 @@ PyTypeObject PyNativeMemoryView_Type = {
|
3142 | 3134 | memory_new, /* tp_new */
|
3143 | 3135 | };
|
3144 | 3136 |
|
| 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 | + |
3145 | 3159 | static struct PyModuleDef _memoryviewmodule = {
|
3146 | 3160 | PyModuleDef_HEAD_INIT,
|
3147 | 3161 | "_memoryview",
|
@@ -3177,7 +3191,7 @@ PyInit__memoryview(void)
|
3177 | 3191 |
|
3178 | 3192 |
|
3179 | 3193 | // 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); |
3181 | 3195 |
|
3182 | 3196 | return m;
|
3183 | 3197 | }
|
0 commit comments