Skip to content
Merged
Changes from 1 commit
Commits
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
Next Next commit
Avoid extra function
  • Loading branch information
JelleZijlstra committed May 12, 2023
commit 0576d2622323bd16d04211b240c0593dd5f50433
28 changes: 11 additions & 17 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -9115,17 +9115,23 @@ releasebuffer_maybe_call_super(PyObject *self, Py_buffer *buffer)
}

static void
releasebuffer_call_python_inner(PyObject *self, Py_buffer *buffer)
releasebuffer_call_python(PyObject *self, Py_buffer *buffer)
{
assert(!PyErr_Occurred());
// bf_releasebuffer may be called while an exception is already active.
// We have no way to report additional errors up the stack, because
// this slot returns void, so we simply stash away the active exception
// and restore it after the call to Python returns.
PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);

PyObject *mv;
bool is_buffer_wrapper = Py_TYPE(buffer->obj) == &_PyBufferWrapper_Type;
if (is_buffer_wrapper) {
// Make sure we pass the same memoryview to
// __release_buffer__() that __buffer__() returned.
PyBufferWrapper *bw = (PyBufferWrapper *)buffer->obj;
if (bw->mv == NULL) {
return;
goto end;
}
mv = Py_NewRef(bw->mv);
}
Expand All @@ -9135,7 +9141,7 @@ releasebuffer_call_python_inner(PyObject *self, Py_buffer *buffer)
mv = PyMemoryView_FromBuffer(buffer);
if (mv == NULL) {
PyErr_WriteUnraisable(self);
return;
goto end;
}
// Set the memoryview to restricted mode, which forbids
// users from saving any reference to the underlying buffer
Expand All @@ -9156,19 +9162,7 @@ releasebuffer_call_python_inner(PyObject *self, Py_buffer *buffer)
PyObject_CallMethodNoArgs(mv, &_Py_ID(release));
}
Py_DECREF(mv);
}

static void
releasebuffer_call_python(PyObject *self, Py_buffer *buffer)
{
// bf_releasebuffer may be called while an exception is already active.
// We have no way to report additional errors up the stack, because
// this slot returns void, so we simply stash away the active exception
// and restore it after the call to Python returns.
PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);

releasebuffer_call_python_inner(self, buffer);
end:
assert(!PyErr_Occurred());

PyErr_Restore(type, value, traceback);
Expand Down