From 2b0304b86591fed6a061d8f42d50bda25a1130b1 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Thu, 6 Dec 2007 00:16:15 +0000 Subject: [PATCH] reviewed by: Johan Dahlin 2007-12-06 Gustavo J. A. M. Carneiro reviewed by: Johan Dahlin * configure.ac: * gobject-introspection.pc.in: * src/Makefile.am: * src/compiler.c: (format_output), (write_out_metadata), (main): * src/gen-introspect.c: (main): * src/gen-introspect.h: * src/generate.c: (write_callable_info), (write_repository), (load_metadata), (main): * src/gidlmodule.c: (g_idl_module_new), (g_idl_module_build_metadata): * src/gidlmodule.h: * src/gidlparser.c: (start_element_handler): * src/ginfo.c: (g_info_new), (g_info_from_entry), (g_base_info_get_name), (g_base_info_get_namespace), (g_base_info_is_deprecated), (g_base_info_get_annotation), (g_base_info_get_metadata), (g_function_info_get_symbol), (g_function_info_get_flags), (g_function_info_get_property), (g_function_info_get_vfunc), (signature_offset), (g_type_info_new), (g_callable_info_may_return_null), (g_callable_info_get_caller_owns), (g_callable_info_get_n_args), (g_callable_info_get_arg), (g_arg_info_get_direction), (g_arg_info_is_return_value), (g_arg_info_is_dipper), (g_arg_info_is_optional), (g_arg_info_may_be_null), (g_arg_info_get_ownership_transfer), (g_type_info_is_pointer), (g_type_info_get_tag), (g_type_info_get_param_type), (g_type_info_get_interface), (g_type_info_get_array_length), (g_type_info_is_zero_terminated), (g_type_info_get_n_error_domains), (g_type_info_get_error_domain), (g_error_domain_info_get_quark), (g_error_domain_info_get_codes), (g_value_info_get_value), (g_field_info_get_flags), (g_field_info_get_size), (g_field_info_get_offset), (g_registered_type_info_get_type_name), (g_registered_type_info_get_type_init), (g_struct_info_get_n_fields), (g_struct_info_get_field), (g_struct_info_get_n_methods), (g_struct_info_get_method), (find_method), (g_struct_info_find_method), (g_enum_info_get_n_values), (g_enum_info_get_value), (g_object_info_get_parent), (g_object_info_get_type_name), (g_object_info_get_type_init), (g_object_info_get_n_interfaces), (g_object_info_get_interface), (g_object_info_get_n_fields), (g_object_info_get_field), (g_object_info_get_n_properties), (g_object_info_get_property), (g_object_info_get_n_methods), (g_object_info_get_method), (g_object_info_find_method), (g_object_info_get_n_signals), (g_object_info_get_signal), (g_object_info_get_n_vfuncs), (g_object_info_get_vfunc), (g_object_info_get_n_constants), (g_object_info_get_constant), (g_interface_info_get_n_prerequisites), (g_interface_info_get_prerequisite), (g_interface_info_get_n_properties), (g_interface_info_get_property), (g_interface_info_get_n_methods), (g_interface_info_get_method), (g_interface_info_find_method), (g_interface_info_get_n_signals), (g_interface_info_get_signal), (g_interface_info_get_n_vfuncs), (g_interface_info_get_vfunc), (g_interface_info_get_n_constants), (g_interface_info_get_constant), (g_property_info_get_flags), (g_signal_info_get_flags), (g_signal_info_get_class_closure), (g_signal_info_true_stops_emit), (g_vfunc_info_get_flags), (g_vfunc_info_get_offset), (g_vfunc_info_get_signal), (g_constant_info_get_value), (g_union_info_get_n_fields), (g_union_info_get_field), (g_union_info_get_n_methods), (g_union_info_get_method), (g_union_info_is_discriminated), (g_union_info_get_discriminator_offset), (g_union_info_get_discriminator): * src/ginvoke.c: (g_function_info_invoke): * src/girepository.c: (g_irepository_register), (g_irepository_unregister), (g_irepository_get_default), (count_interfaces), (g_irepository_get_n_infos), (find_interface), (g_irepository_get_info), (g_irepository_find_by_name), (g_irepository_get_shared_library), (g_irepository_build_search_path), (g_irepository_register_file), (g_irepository_error_quark): * src/girepository.h: * src/gmetadata.c: (g_metadata_get_dir_entry), (g_metadata_check_sanity), (validate_header), (validate_array_type_blob), (validate_iface_type_blob), (validate_param_type_blob), (validate_error_type_blob), (validate_type_blob), (validate_arg_blob), (validate_signature_blob), (validate_function_blob), (validate_callback_blob), (validate_constant_blob), (validate_value_blob), (validate_field_blob), (validate_property_blob), (validate_signal_blob), (validate_vfunc_blob), (validate_struct_blob), (validate_enum_blob), (validate_object_blob), (validate_interface_blob), (validate_errordomain_blob), (validate_union_blob), (validate_blob), (validate_directory), (validate_annotations), (g_metadata_validate), (_g_metadata_init), (g_metadata_new_from_memory), (g_metadata_new_from_const_memory), (g_metadata_new_from_mapped_file), (g_metadata_free), (g_metadata_set_module), (g_metadata_get_namespace): * src/gmetadata.h: * tests/Makefile.am: * tests/invoke/Makefile.am: * tests/invoke/invoke-namespace-find.sh: * tests/invoke/invoke.c: (main): Add a namespace/shared library mapping. fixes #313268. svn path=/trunk/; revision=66 --- girepository/src/generate.c | 74 ++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/girepository/src/generate.c b/girepository/src/generate.c index 2ce33cdc6..8ae6fc355 100644 --- a/girepository/src/generate.c +++ b/girepository/src/generate.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-file-style: "gnu"; -*- */ /* GObject introspection: IDL generator * * Copyright (C) 2005 Matthias Clasen @@ -241,7 +242,6 @@ write_callable_info (const gchar *namespace, type = g_callable_info_get_return_type (info); write_type_info (namespace, type, file); - g_base_info_unref ((GIBaseInfo *)type); g_fprintf (file, "\""); @@ -262,6 +262,7 @@ write_callable_info (const gchar *namespace, g_assert_not_reached (); } } + g_base_info_unref ((GIBaseInfo *)type); if (g_callable_info_may_return_null (info)) g_fprintf (file, " null-ok=\"1\""); @@ -1023,8 +1024,14 @@ write_repository (GIRepository *repository, for (i = 0; namespaces[i]; i++) { + const gchar *shared_library; ns = namespaces[i]; - g_fprintf (file, " \n", ns); + shared_library = g_irepository_get_shared_library (repository, ns); + if (shared_library) + g_fprintf (file, " \n", + ns, shared_library); + else + g_fprintf (file, " \n", ns); for (j = 0; j < g_irepository_get_n_infos (repository, ns); j++) { @@ -1097,28 +1104,32 @@ static GOptionEntry options[] = static const guchar * load_metadata (const gchar *filename, - void **dlhandle) + GModule **dlhandle, + gsize *len) { - guchar *metadata; - void *handle; - char *error; - - handle = dlopen (filename, RTLD_LAZY); - metadata = dlsym (handle, "_G_METADATA"); - - error = dlerror (); - - if (dlhandle) - *dlhandle = handle; - - if (error) - { - g_fprintf (stderr, - "Could not load metadata from '%s': %s\n", - filename, error); + guchar *metadata; + gsize *metadata_size; + GModule *handle; + handle = g_module_open (filename, G_MODULE_BIND_LOCAL|G_MODULE_BIND_LAZY); + if (!g_module_symbol (handle, "_G_METADATA", (gpointer *) &metadata)) + { + g_printerr ("Could not load metadata from '%s': %s\n", + filename, g_module_error ()); return NULL; } + + if (!g_module_symbol (handle, "_G_METADATA_SIZE", (gpointer *) &metadata_size)) + { + g_printerr ("Could not load metadata from '%s': %s\n", + filename, g_module_error ()); + return NULL; + } + + *len = *metadata_size; + + if (dlhandle) + *dlhandle = handle; return metadata; } @@ -1130,6 +1141,7 @@ main (int argc, char *argv[]) GError *error = NULL; gboolean needs_prefix; gint i; + GMetadata *data; g_type_init (); @@ -1148,12 +1160,13 @@ main (int argc, char *argv[]) for (i = 0; input[i]; i++) { - void *dlhandle = NULL; + GModule *dlhandle = NULL; const guchar *metadata; + gsize len; if (raw) { - if (!g_file_get_contents (input[i], (gchar **)&metadata, NULL, &error)) + if (!g_file_get_contents (input[i], (gchar **)&metadata, &len, &error)) { g_fprintf (stderr, "failed to read '%s': %s\n", input[i], error->message); @@ -1163,7 +1176,7 @@ main (int argc, char *argv[]) } else { - metadata = load_metadata (input[i], &dlhandle); + metadata = load_metadata (input[i], &dlhandle, &len); if (!metadata) { g_fprintf (stderr, "failed to load metadata from '%s'\n", @@ -1177,13 +1190,22 @@ main (int argc, char *argv[]) else needs_prefix = FALSE; - g_irepository_register (g_irepository_get_default (), metadata); + data = g_metadata_new_from_const_memory (metadata, len); + { + GError *error = NULL; + if (!g_metadata_validate (data, &error)) { + g_printerr ("metadata not valid: %s\n", error->message); + g_clear_error (&error); + } + } + g_irepository_register (g_irepository_get_default (), data); write_repository (g_irepository_get_default (), needs_prefix); - g_irepository_unregister (g_irepository_get_default (), metadata); + g_irepository_unregister (g_irepository_get_default (), + g_metadata_get_namespace (data)); if (dlhandle) { - dlclose (dlhandle); + g_module_close (dlhandle); dlhandle = NULL; }