diff options
author | Owen Taylor <otaylor@src.gnome.org> | 2008-11-12 17:17:01 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2008-11-12 17:17:01 +0000 |
commit | 09423f25cd99f0999ff3e0b710d34461a5cfa54a (patch) | |
tree | 5559043ee3c55001728706979127a44d1a228a43 /girepository/girmodule.c | |
parent | 755ec2cc858997dd87e41cc5b8114d136d2434f6 (diff) | |
download | gobject-introspection-09423f25cd99f0999ff3e0b710d34461a5cfa54a.tar.gz |
Keep aliases and disguised_structures local to each module (#560419)
When parsing, keep keep a separate hash tables of aliases and
'disguised' flags for each module, and store that on the module.
After parsing an include merge the aliases/disguised flags to the
including module.
Remove 'prefix_aliases' flag and always prefix aliases/disguised
structure types when parsing; this simplifies the code considerably.
svn path=/trunk/; revision=904
Diffstat (limited to 'girepository/girmodule.c')
-rw-r--r-- | girepository/girmodule.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/girepository/girmodule.c b/girepository/girmodule.c index 91cc02d8..1b7c3048 100644 --- a/girepository/girmodule.c +++ b/girepository/girmodule.c @@ -46,6 +46,9 @@ g_ir_module_new (const gchar *name, module->dependencies = NULL; module->entries = NULL; + module->include_modules = NULL; + module->aliases = NULL; + return module; } @@ -62,13 +65,50 @@ g_ir_module_free (GIrModule *module) g_list_free (module->entries); /* Don't free dependencies, we inherit that from the parser */ - /* FIXME: we leak the included modules themelves; they may be shared - * between multiple modules, so we would need refcounting */ g_list_free (module->include_modules); + g_hash_table_destroy (module->aliases); + g_hash_table_destroy (module->disguised_structures); + g_free (module); } +static void +add_alias_foreach (gpointer key, + gpointer value, + gpointer data) +{ + GIrModule *module = data; + + g_hash_table_replace (module->aliases, g_strdup (key), g_strdup (value)); +} + +static void +add_disguised_structure_foreach (gpointer key, + gpointer value, + gpointer data) +{ + GIrModule *module = data; + + g_hash_table_replace (module->disguised_structures, g_strdup (key), value); +} + +void +g_ir_module_add_include_module (GIrModule *module, + GIrModule *include_module) +{ + module->include_modules = g_list_prepend (module->include_modules, + include_module); + + g_hash_table_foreach (include_module->aliases, + add_alias_foreach, + module); + + g_hash_table_foreach (include_module->disguised_structures, + add_disguised_structure_foreach, + module); +} + GTypelib * g_ir_module_build_typelib (GIrModule *module, GList *modules) |