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:
Robert Carr 2009-01-29 10:32:25 +00:00
parent a0a60f2601
commit 8ac6225faf

View File

@ -2976,18 +2976,19 @@ cleanup (GMarkupParseContext *context,
} }
static GList * static GList *
post_filter_varargs_functions (GList *list) post_filter_varargs_functions (GList *list, GList ** varargs_callbacks_out)
{ {
GList *iter; GList *iter;
GList *varargs_callbacks = *varargs_callbacks_out;
iter = list; iter = list;
while (iter) while (iter)
{ {
GList *link = iter; GList *link = iter;
GIrNode *node = iter->data; GIrNode *node = iter->data;
iter = iter->next; iter = iter->next;
if (node->type == G_IR_NODE_FUNCTION) if (node->type == G_IR_NODE_FUNCTION)
{ {
if (((GIrNodeFunction*)node)->is_varargs) if (((GIrNodeFunction*)node)->is_varargs)
@ -2995,7 +2996,60 @@ post_filter_varargs_functions (GList *list)
list = g_list_delete_link (list, link); 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; return list;
} }
@ -3003,37 +3057,44 @@ static void
post_filter (GIrModule *module) post_filter (GIrModule *module)
{ {
GList *iter; GList *iter;
GList *varargs_callbacks = NULL;
module->entries = post_filter_varargs_functions (module->entries);
module->entries = post_filter_varargs_functions (module->entries,
&varargs_callbacks);
iter = module->entries; iter = module->entries;
while (iter) while (iter)
{ {
GIrNode *node = iter->data; GIrNode *node = iter->data;
iter = iter->next; iter = iter->next;
if (node->type == G_IR_NODE_OBJECT || if (node->type == G_IR_NODE_OBJECT ||
node->type == G_IR_NODE_INTERFACE) node->type == G_IR_NODE_INTERFACE)
{ {
GIrNodeInterface *iface = (GIrNodeInterface*)node; 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) else if (node->type == G_IR_NODE_BOXED)
{ {
GIrNodeBoxed *boxed = (GIrNodeBoxed*)node; 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) else if (node->type == G_IR_NODE_STRUCT)
{ {
GIrNodeStruct *iface = (GIrNodeStruct*)node; 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) else if (node->type == G_IR_NODE_UNION)
{ {
GIrNodeUnion *iface = (GIrNodeUnion*)node; 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);
} }
/** /**