static PyObject * _get_fields (PyGIBaseInfo *self, GIInfoType info_type) { gssize n_infos; PyObject *infos; gssize i; switch (info_type) { case GI_INFO_TYPE_STRUCT: n_infos = g_struct_info_get_n_fields ( (GIStructInfo *) self->info); break; case GI_INFO_TYPE_OBJECT: n_infos = g_object_info_get_n_fields ( (GIObjectInfo *) self->info); break; default: g_assert_not_reached(); } infos = PyTuple_New (n_infos); if (infos == NULL) { return NULL; } for (i = 0; i < n_infos; i++) { GIBaseInfo *info; PyObject *py_info; switch (info_type) { case GI_INFO_TYPE_STRUCT: info = (GIBaseInfo *) g_struct_info_get_field ( (GIStructInfo *) self->info, i); break; case GI_INFO_TYPE_OBJECT: info = (GIBaseInfo *) g_object_info_get_field ( (GIObjectInfo *) self->info, i); break; default: g_assert_not_reached(); } g_assert (info != NULL); py_info = _pygi_info_new (info); g_base_info_unref (info); if (py_info == NULL) { Py_CLEAR (infos); break; } PyTuple_SET_ITEM (infos, i, py_info); } return infos; }
static GIFieldInfo * find_field_info(GIObjectInfo *info, gchar *name) { int i; GIFieldInfo *field_info; /* GParamSpecs aren't very big. We could optimize this so that it isn't * O(N), but for the biggest GParamSpec, N=5, so it doesn't really matter. */ for (i = 0; i < g_object_info_get_n_fields((GIObjectInfo*)info); i++) { field_info = g_object_info_get_field((GIObjectInfo*)info, i); if (g_str_equal(name, g_base_info_get_name((GIBaseInfo*)field_info))) return field_info; g_base_info_unref((GIBaseInfo*)field_info); } return NULL; }