pytorch/torch/csrc/utils/pyobject_preservation.cpp
Kurt Mohler 56b848157c Reland: Add PyObject preservation for UntypedStorage (#103907)
This relands #97470 after #102553 reverted it. This PR attempts to fix the internal failure by avoiding an unnecessary intermediate storage buffer allocation in `c10::newStorageImplFromRefcountedDataPtr`.

Part of #91395

Pull Request resolved: https://github.com/pytorch/pytorch/pull/103907
Approved by: https://github.com/ezyang
2023-09-07 04:24:11 +00:00

20 lines
508 B
C++

#include <torch/csrc/utils/pyobject_preservation.h>
#include <structmember.h>
void clear_slots(PyTypeObject* type, PyObject* self) {
Py_ssize_t n = Py_SIZE(type);
PyMemberDef* mp = type->tp_members;
for (Py_ssize_t i = 0; i < n; i++, mp++) {
if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
char* addr = (char*)self + mp->offset;
PyObject* obj = *(PyObject**)addr;
if (obj != nullptr) {
*(PyObject**)addr = nullptr;
Py_DECREF(obj);
}
}
}
}