static PyObject* QtGuiObject_alloc(PyTypeObject *type, Py_ssize_t nitems) { PyObject *obj; const size_t size = _PyObject_VAR_SIZE(type, nitems+1); /* note that we need to add one, for the sentinel */ if (PyType_IS_GC(type)) obj = _PyObject_GC_Malloc(size); else obj = (PyObject *)PyObject_MALLOC(size); if (obj == NULL) return PyErr_NoMemory(); // This is why we need this custom alloc: To call the C++ constructor. memset(obj, '\0', size); new ((PyQtGuiObject*) obj) PyQtGuiObject(); if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) Py_INCREF(type); if (type->tp_itemsize == 0) PyObject_INIT(obj, type); else (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems); if (PyType_IS_GC(type)) _PyObject_GC_TRACK(obj); return obj; }
PyObject * _PyObject_GC_New(PyTypeObject *tp) { PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp)); if (op != NULL) op = PyObject_INIT(op, tp); return op; }
PyVarObject * _PyObject_GC_NewVar(PyTypeObject *tp, int nitems) { const size_t size = _PyObject_VAR_SIZE(tp, nitems); PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size); if (op != NULL) op = PyObject_INIT_VAR(op, tp, nitems); return op; }
/* Allocates memory for a new node object of the given type and initializes * part of it. */ NodeObject *_Node_New(PyTypeObject *type) { const size_t size = _PyObject_SIZE(type); PyObject *obj = _PyObject_GC_Malloc(size); if (obj == NULL) PyErr_NoMemory(); else { memset(obj, '\0', size); PyObject_INIT(obj, type); PyObject_GC_Track(obj); } return (NodeObject *)obj; }