From: Alan Knowles Date: Sat, 3 Apr 2010 07:25:07 +0000 (+0800) Subject: [ALIAS_POINTER] Support for aliases to pointers X-Git-Url: http://git.roojs.org/?p=gnome.gobject-introspection;a=commitdiff_plain;h=a50303e78e69fe8554039633db85243e0637c92f [ALIAS_POINTER] Support for aliases to pointers This is required by a number of libraries to support typedef aaa *bbbb; --- diff --git a/girepository/girparser.c b/girepository/girparser.c index 1e48bdb..6b48cfd 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -524,6 +524,17 @@ parse_type_internal (const gchar *str, char **next, gboolean in_glib, (str)++; type->interface = g_strndup (start, str - start); + + /* + The alias code can return pointers for typedefs. + since the type reader code does not catch this, + it has to be set here. + */ + if (strchr(start, '*')) + { + g_debug("Adding type as interface (pointer) %s ", type->interface); + type->is_pointer = TRUE; + } } if (next) @@ -539,13 +550,15 @@ parse_type_internal (const gchar *str, char **next, gboolean in_glib, } static const char * -resolve_aliases (ParseContext *ctx, const gchar *type) +resolve_aliases (ParseContext *ctx, const gchar *type, gboolean *has_pointer) { gpointer orig; gpointer value; GSList *seen_values = NULL; const gchar *lookup; - gchar *prefixed; + gchar *prefixed, *lookup_copy; + char *start_pos; + if (strchr (type, '.') == NULL) { @@ -557,17 +570,36 @@ resolve_aliases (ParseContext *ctx, const gchar *type) lookup = type; prefixed = NULL; } - + /* + Since target could be a name + '*' + we need to duplicate the lookup value always + and free it later.. + */ + star_pos = strchr(lookup, '*'); + if (star_pos) + *is_pointer = TRUE; + + lookup_copy = g_strndup(lookup, star_pos ? (gsize) (star_pos - lookup) : strlen(lookup)); + seen_values = g_slist_prepend (seen_values, (char*)lookup); - while (g_hash_table_lookup_extended (ctx->current_module->aliases, lookup, &orig, &value)) + while (g_hash_table_lookup_extended (ctx->current_module->aliases, lookup_copy, &orig, &value)) { g_debug ("Resolved: %s => %s\n", lookup, (char*)value); lookup = value; + /* prevent looping forever.. */ if (g_slist_find_custom (seen_values, lookup, (GCompareFunc)strcmp) != NULL) break; seen_values = g_slist_prepend (seen_values, (gchar*)lookup); + + g_free(lookup_copy); + star_pos = strchr(lookup, '*'); + if (star_pos) + *is_pointer = TRUE; + lookup_copy = g_strndup(lookup, star_pos ? (gsize) (star_pos - lookup) : strlen(lookup)); + } + g_free(lookup_copy); g_slist_free (seen_values); if (lookup == prefixed) @@ -610,18 +642,23 @@ parse_type (ParseContext *ctx, const gchar *type) GIrNodeType *node; const BasicTypeInfo *basic; gboolean in_glib, in_gobject; - + gboolean is_pointer = FALSE; + in_glib = strcmp (ctx->namespace, "GLib") == 0; in_gobject = strcmp (ctx->namespace, "GObject") == 0; /* Do not search aliases for basic types */ basic = parse_basic (type); if (basic == NULL) - type = resolve_aliases (ctx, type); + type = resolve_aliases (ctx, type, &is_pointer); node = parse_type_internal (type, NULL, in_glib, in_gobject); - if (node) - g_debug ("Parsed type: %s => %d", type, node->tag); + if (node) + { + g_debug ("Parsed type: %s => %d", type, node->tag); + /* Overlay is_pointer if it get's set */ + node->is_pointer = node->is_pointer || is_pointer; + } else g_critical ("Failed to parse type: '%s'", type);