summaryrefslogtreecommitdiff
path: root/girepository/girmodule.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@src.gnome.org>2008-11-12 17:17:01 +0000
committerOwen Taylor <otaylor@src.gnome.org>2008-11-12 17:17:01 +0000
commit09423f25cd99f0999ff3e0b710d34461a5cfa54a (patch)
tree5559043ee3c55001728706979127a44d1a228a43 /girepository/girmodule.c
parent755ec2cc858997dd87e41cc5b8114d136d2434f6 (diff)
downloadgobject-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.c44
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)