mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-28 00:16:15 +01:00
post_filter_varargs_functions should also filter callbacks. Add tests of
* girepository/girparser.c: post_filter_varargs_functions should also filter callbacks. * tests/scanner/foo.h: Add tests of varargs callbacks. svn path=/trunk/; revision=1075
This commit is contained in:
parent
a0a60f2601
commit
8ac6225faf
83
girparser.c
83
girparser.c
@ -2976,18 +2976,19 @@ cleanup (GMarkupParseContext *context,
|
||||
}
|
||||
|
||||
static GList *
|
||||
post_filter_varargs_functions (GList *list)
|
||||
post_filter_varargs_functions (GList *list, GList ** varargs_callbacks_out)
|
||||
{
|
||||
GList *iter;
|
||||
|
||||
GList *varargs_callbacks = *varargs_callbacks_out;
|
||||
|
||||
iter = list;
|
||||
while (iter)
|
||||
{
|
||||
GList *link = iter;
|
||||
GIrNode *node = iter->data;
|
||||
|
||||
|
||||
iter = iter->next;
|
||||
|
||||
|
||||
if (node->type == G_IR_NODE_FUNCTION)
|
||||
{
|
||||
if (((GIrNodeFunction*)node)->is_varargs)
|
||||
@ -2995,7 +2996,60 @@ post_filter_varargs_functions (GList *list)
|
||||
list = g_list_delete_link (list, link);
|
||||
}
|
||||
}
|
||||
if (node->type == G_IR_NODE_CALLBACK)
|
||||
{
|
||||
if (((GIrNodeFunction*)node)->is_varargs)
|
||||
{
|
||||
varargs_callbacks = g_list_append(varargs_callbacks,
|
||||
node);
|
||||
list = g_list_delete_link (list, link);
|
||||
}
|
||||
}
|
||||
}
|
||||
iter = list;
|
||||
while (iter)
|
||||
{
|
||||
GList *link = iter;
|
||||
GIrNode *node = iter->data;
|
||||
|
||||
iter = iter->next;
|
||||
|
||||
if (node->type == G_IR_NODE_FUNCTION)
|
||||
{
|
||||
GList *param;
|
||||
gboolean function_done = FALSE;
|
||||
|
||||
for (param = ((GIrNodeFunction *)node)->parameters;
|
||||
param;
|
||||
param = param->next)
|
||||
{
|
||||
GIrNodeParam *node = (GIrNodeParam *)param->data;
|
||||
|
||||
if (function_done)
|
||||
break;
|
||||
|
||||
if (node->type->is_interface)
|
||||
{
|
||||
GList *callback;
|
||||
for (callback = varargs_callbacks;
|
||||
callback;
|
||||
callback = callback->next)
|
||||
{
|
||||
if (!strcmp(node->type->interface,
|
||||
((GIrNode *)varargs_callbacks->data)->name))
|
||||
{
|
||||
list = g_list_delete_link (list, link);
|
||||
function_done = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*varargs_callbacks_out = varargs_callbacks;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@ -3003,37 +3057,44 @@ static void
|
||||
post_filter (GIrModule *module)
|
||||
{
|
||||
GList *iter;
|
||||
|
||||
module->entries = post_filter_varargs_functions (module->entries);
|
||||
GList *varargs_callbacks = NULL;
|
||||
|
||||
module->entries = post_filter_varargs_functions (module->entries,
|
||||
&varargs_callbacks);
|
||||
iter = module->entries;
|
||||
while (iter)
|
||||
{
|
||||
GIrNode *node = iter->data;
|
||||
|
||||
|
||||
iter = iter->next;
|
||||
|
||||
if (node->type == G_IR_NODE_OBJECT ||
|
||||
node->type == G_IR_NODE_INTERFACE)
|
||||
{
|
||||
GIrNodeInterface *iface = (GIrNodeInterface*)node;
|
||||
iface->members = post_filter_varargs_functions (iface->members);
|
||||
iface->members = post_filter_varargs_functions (iface->members,
|
||||
&varargs_callbacks);
|
||||
}
|
||||
else if (node->type == G_IR_NODE_BOXED)
|
||||
{
|
||||
GIrNodeBoxed *boxed = (GIrNodeBoxed*)node;
|
||||
boxed->members = post_filter_varargs_functions (boxed->members);
|
||||
boxed->members = post_filter_varargs_functions (boxed->members,
|
||||
&varargs_callbacks);
|
||||
}
|
||||
else if (node->type == G_IR_NODE_STRUCT)
|
||||
{
|
||||
GIrNodeStruct *iface = (GIrNodeStruct*)node;
|
||||
iface->members = post_filter_varargs_functions (iface->members);
|
||||
iface->members = post_filter_varargs_functions (iface->members,
|
||||
&varargs_callbacks);
|
||||
}
|
||||
else if (node->type == G_IR_NODE_UNION)
|
||||
{
|
||||
GIrNodeUnion *iface = (GIrNodeUnion*)node;
|
||||
iface->members = post_filter_varargs_functions (iface->members);
|
||||
iface->members = post_filter_varargs_functions (iface->members,
|
||||
&varargs_callbacks);
|
||||
}
|
||||
}
|
||||
g_list_free(varargs_callbacks);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user