Пример #1
0
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;
}
Пример #2
0
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;
}