static PyObject * _struct_new (PyTypeObject *type, PyObject *args, PyObject *kwargs) { static char *kwlist[] = { NULL }; GIBaseInfo *info; gsize size; gpointer pointer; PyObject *self = NULL; if (!PyArg_ParseTupleAndKeywords (args, kwargs, "", kwlist)) { return NULL; } info = _pygi_object_get_gi_info ( (PyObject *) type, &PyGIStructInfo_Type); if (info == NULL) { if (PyErr_ExceptionMatches (PyExc_AttributeError)) { PyErr_Format (PyExc_TypeError, "missing introspection information"); } return NULL; } size = g_struct_info_get_size ( (GIStructInfo *) info); if (size == 0) { PyErr_Format (PyExc_TypeError, "cannot allocate disguised struct %s.%s; consider adding a constructor to the library or to the overrides", g_base_info_get_namespace (info), g_base_info_get_name (info)); goto out; } pointer = g_try_malloc0 (size); if (pointer == NULL) { PyErr_NoMemory(); goto out; } self = _pygi_struct_new (type, pointer, TRUE); if (self == NULL) { g_free (pointer); } out: g_base_info_unref (info); return (PyObject *) self; }
static void _struct_dealloc (PyGIStruct *self) { GIBaseInfo *info = _pygi_object_get_gi_info ( (PyObject *) self, &PyGIStructInfo_Type); if (info != NULL && g_struct_info_is_foreign ( (GIStructInfo *) info)) { pygi_struct_foreign_release (info, ( (PyGPointer *) self)->pointer); } else if (self->free_on_dealloc) { g_free ( ( (PyGPointer *) self)->pointer); } g_base_info_unref (info); Py_TYPE( (PyGPointer *) self )->tp_free ( (PyObject *) self); }
static PyObject * _boxed_new (PyTypeObject *type, PyObject *args, PyObject *kwargs) { static char *kwlist[] = { NULL }; GIBaseInfo *info; gsize size = 0; gpointer boxed; PyGIBoxed *self = NULL; if (!PyArg_ParseTupleAndKeywords (args, kwargs, "", kwlist)) { return NULL; } info = _pygi_object_get_gi_info ( (PyObject *) type, &PyGIBaseInfo_Type); if (info == NULL) { if (PyErr_ExceptionMatches (PyExc_AttributeError)) { PyErr_Format (PyExc_TypeError, "missing introspection information"); } return NULL; } boxed = _pygi_boxed_alloc (info, &size); if (boxed == NULL) { PyErr_NoMemory(); goto out; } self = (PyGIBoxed *) _pygi_boxed_new (type, boxed, TRUE); if (self == NULL) { g_slice_free1 (size, boxed); goto out; } self->size = size; self->slice_allocated = TRUE; out: g_base_info_unref (info); return (PyObject *) self; }