mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-07 00:21:07 +01:00
Summary: How did we get so many uses of `NULL` again? ezyang Pull Request resolved: https://github.com/pytorch/pytorch/pull/11047 Differential Revision: D9566799 Pulled By: goldsborough fbshipit-source-id: 83469f352ac69aa65bdaf1a1a21f922d892e0db3
103 lines
3.5 KiB
C++
103 lines
3.5 KiB
C++
#include "torch/csrc/python_headers.h"
|
|
#include "ATen/Utils.h"
|
|
#include <functional>
|
|
|
|
static PyObject* THPWrapperClass = nullptr;
|
|
|
|
struct THPWrapper {
|
|
PyObject_HEAD
|
|
void *data;
|
|
void (*destructor)(void*);
|
|
};
|
|
|
|
PyObject * THPWrapper_New(void *data, void (*destructor)(void*))
|
|
{
|
|
PyObject *args = PyTuple_New(0);
|
|
if (!args) {
|
|
return nullptr;
|
|
}
|
|
PyObject *result = PyObject_Call(THPWrapperClass, args, nullptr);
|
|
if (result) {
|
|
THPWrapper* wrapper = (THPWrapper*) result;
|
|
wrapper->data = data;
|
|
wrapper->destructor = destructor;
|
|
}
|
|
Py_DECREF(args);
|
|
return result;
|
|
}
|
|
|
|
bool THPWrapper_check(PyObject * obj)
|
|
{
|
|
return (PyObject*)Py_TYPE(obj) == THPWrapperClass;
|
|
}
|
|
|
|
void * THPWrapper_get(PyObject * obj)
|
|
{
|
|
return ((THPWrapper*)obj)->data;
|
|
}
|
|
|
|
static PyObject * THPWrapper_pynew(PyTypeObject *type, PyObject *args, PyObject *kwargs)
|
|
{
|
|
PyObject* self = type->tp_alloc(type, 0);
|
|
THPWrapper* wrapper = (THPWrapper*) self;
|
|
wrapper->data = nullptr;
|
|
wrapper->destructor = nullptr;
|
|
return self;
|
|
}
|
|
|
|
static void THPWrapper_dealloc(THPWrapper* self)
|
|
{
|
|
self->destructor(self->data);
|
|
Py_TYPE(self)->tp_free((PyObject*)self);
|
|
}
|
|
|
|
PyTypeObject THPWrapperType = {
|
|
PyVarObject_HEAD_INIT(nullptr, 0)
|
|
"torch._C._PtrWrapper", /* tp_name */
|
|
sizeof(THPWrapper), /* tp_basicsize */
|
|
0, /* tp_itemsize */
|
|
(destructor)THPWrapper_dealloc, /* tp_dealloc */
|
|
0, /* tp_print */
|
|
0, /* tp_getattr */
|
|
0, /* tp_setattr */
|
|
0, /* tp_reserved */
|
|
0, /* tp_repr */
|
|
0, /* tp_as_number */
|
|
0, /* tp_as_sequence */
|
|
0, /* tp_as_mapping */
|
|
0, /* tp_hash */
|
|
0, /* tp_call */
|
|
0, /* tp_str */
|
|
0, /* tp_getattro */
|
|
0, /* tp_setattro */
|
|
0, /* tp_as_buffer */
|
|
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
|
nullptr, /* tp_doc */
|
|
0, /* tp_traverse */
|
|
0, /* tp_clear */
|
|
0, /* tp_richcompare */
|
|
0, /* tp_weaklistoffset */
|
|
0, /* tp_iter */
|
|
0, /* tp_iternext */
|
|
0, /* tp_methods */
|
|
0, /* tp_members */
|
|
0, /* tp_getset */
|
|
0, /* tp_base */
|
|
0, /* tp_dict */
|
|
0, /* tp_descr_get */
|
|
0, /* tp_descr_set */
|
|
0, /* tp_dictoffset */
|
|
0, /* tp_init */
|
|
0, /* tp_alloc */
|
|
THPWrapper_pynew, /* tp_new */
|
|
};
|
|
|
|
bool THPWrapper_init(PyObject *module)
|
|
{
|
|
THPWrapperClass = (PyObject*)&THPWrapperType;
|
|
if (PyType_Ready(&THPWrapperType) < 0)
|
|
return false;
|
|
Py_INCREF(&THPWrapperType);
|
|
return true;
|
|
}
|