diff options
Diffstat (limited to 'girepository/girnode.c')
-rw-r--r-- | girepository/girnode.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/girepository/girnode.c b/girepository/girnode.c index 22c0aee..01e83ac 100644 --- a/girepository/girnode.c +++ b/girepository/girnode.c @@ -265,6 +265,7 @@ g_ir_node_free (GIrNode *node) GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node; g_free (node->name); + g_free (vfunc->invoker); for (l = vfunc->parameters; l; l = l->next) g_ir_node_free ((GIrNode *)l->data); g_list_free (vfunc->parameters); @@ -1186,6 +1187,30 @@ g_ir_find_node (GIrModule *module, return node != NULL; } +static int +get_index_of_member_type (GIrNodeInterface *node, + GIrNodeTypeId type, + const char *name) +{ + guint index = -1; + GList *l; + + for (l = node->members; l; l = l->next) + { + GIrNode *node = l->data; + + if (node->type != type) + continue; + + index++; + + if (strcmp (node->name, name) == 0) + break; + } + + return index; +} + static void serialize_type (GIrModule *module, GList *modules, @@ -1759,6 +1784,18 @@ g_ir_node_build_typelib (GIrNode *node, blob->class_closure = 0; /* FIXME */ blob->reserved = 0; + if (vfunc->invoker) + { + int index = get_index_of_member_type ((GIrNodeInterface*)parent, G_IR_NODE_FUNCTION, vfunc->invoker); + if (index == -1) + { + g_error ("Unknown member function %s for vfunc %s", vfunc->invoker, node->name); + } + blob->invoker = (guint) index; + } + else + blob->invoker = 0x3ff; /* max of 10 bits */ + blob->struct_offset = vfunc->offset; blob->reserved2 = 0; blob->signature = signature; |