diff options
author | Colin Walters <walters@src.gnome.org> | 2008-08-30 20:31:07 +0000 |
---|---|---|
committer | Colin Walters <walters@src.gnome.org> | 2008-08-30 20:31:07 +0000 |
commit | 8e9b9ce60747b262e3e9c4be4ae85ee1319ae3f4 (patch) | |
tree | 1ddd59b84d74350c3b3afbf7df2092bfc001f053 /girepository/girmodule.c | |
parent | 3be5f52707d68d0fb02f4415dc90450aa64ffea1 (diff) | |
download | gobject-introspection-8e9b9ce60747b262e3e9c4be4ae85ee1319ae3f4.tar.gz |
Put dependencies in typelibs, resolve them when loading
* gir/Makefile.am: Dep on Makefile
* girepository/ginfo.c: Print out a nicer error
message if we failed to load something.
* girepository/girepository.c: Clean up
default typelib handling; remove global
default_typelib variable. Ensure we handle
NULL repository in more places.
Support dependency resolution.
* tests/Makefile.am: Kill off gobject.gir,
it conflicts with the real one.
* tests/Object.gir: Depend on GObject.
* tools/generate.c: Take --includedir
argument to say which directories to search
for typelibs. Print out dependencies.
svn path=/trunk/; revision=541
Diffstat (limited to 'girepository/girmodule.c')
-rw-r--r-- | girepository/girmodule.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/girepository/girmodule.c b/girepository/girmodule.c index 1077a487..65ee392d 100644 --- a/girepository/girmodule.c +++ b/girepository/girmodule.c @@ -33,13 +33,14 @@ g_ir_module_new (const gchar *name, const gchar *shared_library) { GIrModule *module; - module = g_new (GIrModule, 1); + module = g_new0 (GIrModule, 1); module->name = g_strdup (name); if (shared_library) module->shared_library = g_strdup (shared_library); else module->shared_library = NULL; + module->dependencies = NULL; module->entries = NULL; return module; @@ -56,6 +57,7 @@ g_ir_module_free (GIrModule *module) g_ir_node_free ((GIrNode *)e->data); g_list_free (module->entries); + /* Don't free dependencies, we inherit that from the parser */ g_free (module); } @@ -77,18 +79,42 @@ g_ir_module_build_typelib (GIrModule *module, guint32 size, offset, offset2, old_offset; GHashTable *strings; GHashTable *types; + char *dependencies; guchar *data; header_size = ALIGN_VALUE (sizeof (Header), 4); n_local_entries = g_list_length (module->entries); + /* Serialize dependencies into one string; this is convenient + * and not a major change to the typelib format. */ + { + GString *dependencies_str = g_string_new (""); + GList *link; + for (link = module->dependencies; link; link = link->next) + { + const char *dependency = link->data; + if (!strcmp (dependency, module->name)) + continue; + g_string_append (dependencies_str, dependency); + if (link->next) + g_string_append_c (dependencies_str, '|'); + } + dependencies = g_string_free (dependencies_str, FALSE); + if (!dependencies[0]) + { + g_free (dependencies); + dependencies = NULL; + } + } + restart: init_stats (); strings = g_hash_table_new (g_str_hash, g_str_equal); types = g_hash_table_new (g_str_hash, g_str_equal); n_entries = g_list_length (module->entries); - g_message ("%d entries (%d local)\n", n_entries, n_local_entries); + g_message ("%d entries (%d local), %d dependencies\n", n_entries, n_local_entries, + g_list_length (module->dependencies)); dir_size = n_entries * 12; size = header_size + dir_size; @@ -106,6 +132,8 @@ g_ir_module_build_typelib (GIrModule *module, size += strlen (module->name); if (module->shared_library) size += strlen (module->shared_library); + if (dependencies != NULL) + size += strlen (dependencies); g_message ("allocating %d bytes (%d header, %d directory, %d entries)\n", size, header_size, dir_size, size - header_size - dir_size); @@ -122,6 +150,10 @@ g_ir_module_build_typelib (GIrModule *module, header->n_local_entries = n_local_entries; header->n_annotations = 0; header->annotations = 0; /* filled in later */ + if (dependencies != NULL) + header->dependencies = write_string (dependencies, strings, data, &header_size); + else + header->dependencies = 0; header->size = 0; /* filled in later */ header->namespace = write_string (module->name, strings, data, &header_size); header->shared_library = (module->shared_library? @@ -180,9 +212,11 @@ g_ir_module_build_typelib (GIrModule *module, if (node->type == G_IR_NODE_XREF) { + const char *namespace = ((GIrNodeXRef*)node)->namespace; + entry->blob_type = 0; entry->local = FALSE; - entry->offset = write_string (((GIrNodeXRef*)node)->namespace, strings, data, &offset2); + entry->offset = write_string (namespace, strings, data, &offset2); entry->name = write_string (node->name, strings, data, &offset2); } else |