diff options
author | Hyunjee Kim <hj0426.kim@samsung.com> | 2019-12-03 10:35:59 +0900 |
---|---|---|
committer | Hyunjee Kim <hj0426.kim@samsung.com> | 2019-12-03 10:35:59 +0900 |
commit | aedbffaae7e80f2e7d90374faea486abbc5e57f7 (patch) | |
tree | b32b9c1e815ddc6804f1b96f191688f1dd860802 /gobject | |
parent | 5de945120591a487ffe65d50419ef336d3fe14d5 (diff) | |
download | glib-aedbffaae7e80f2e7d90374faea486abbc5e57f7.tar.gz glib-aedbffaae7e80f2e7d90374faea486abbc5e57f7.tar.bz2 glib-aedbffaae7e80f2e7d90374faea486abbc5e57f7.zip |
Imported Upstream version 2.57.1
Diffstat (limited to 'gobject')
-rw-r--r-- | gobject/gclosure.c | 4 | ||||
-rw-r--r-- | gobject/gclosure.h | 2 | ||||
-rwxr-xr-x | gobject/glib-mkenums.in | 4 | ||||
-rw-r--r-- | gobject/gobject-autocleanups.h | 4 | ||||
-rw-r--r-- | gobject/gobject.c | 18 | ||||
-rw-r--r-- | gobject/gobject_gdb.py | 39 | ||||
-rw-r--r-- | gobject/gsignal.c | 2 | ||||
-rw-r--r-- | gobject/gsourceclosure.c | 2 | ||||
-rw-r--r-- | gobject/gtype.h | 109 | ||||
-rw-r--r-- | gobject/gtypemodule.c | 6 | ||||
-rw-r--r-- | gobject/gvaluecollector.h | 12 | ||||
-rw-r--r-- | gobject/meson.build | 15 |
12 files changed, 161 insertions, 56 deletions
diff --git a/gobject/gclosure.c b/gobject/gclosure.c index caa11549c..b42af60bb 100644 --- a/gobject/gclosure.c +++ b/gobject/gclosure.c @@ -54,7 +54,9 @@ * library provides the #GCClosure type for this purpose. Bindings for * other languages need marshallers which convert between #GValues * and suitable representations in the runtime of the language in - * order to use functions written in that languages as callbacks. + * order to use functions written in that language as callbacks. Use + * g_closure_set_marshal() to set the marshaller on such a custom + * closure implementation. * * Within GObject, closures play an important role in the * implementation of signals. When a signal is registered, the diff --git a/gobject/gclosure.h b/gobject/gclosure.h index 393348c7c..a5c1c3fcb 100644 --- a/gobject/gclosure.h +++ b/gobject/gclosure.h @@ -200,7 +200,7 @@ struct _GClosure /*< private >*/ GClosureNotifyData *notifiers; - /* invariants/constrains: + /* invariants/constraints: * - ->marshal and ->data are _invalid_ as soon as ->is_invalid==TRUE * - invocation of all inotifiers occours prior to fnotifiers * - order of inotifiers is random diff --git a/gobject/glib-mkenums.in b/gobject/glib-mkenums.in index 32e81af05..fe9a10756 100755 --- a/gobject/glib-mkenums.in +++ b/gobject/glib-mkenums.in @@ -99,7 +99,7 @@ codecs.register_error('replace_and_warn', replace_and_warn) # glib-mkenums.py # Information about the current enumeration flags = None # Is enumeration a bitmask? -option_underscore_name = '' # Overriden underscore variant of the enum name +option_underscore_name = '' # Overridden underscore variant of the enum name # for example to fix the cases we don't get the # mixed-case -> underscorized transform right. option_lowercase_name = '' # DEPRECATED. A lower case name to use as part @@ -486,7 +486,7 @@ def process_file(curfilename): if option_lowercase_name is not None: if option_underscore_name is not None: - print_warning("lowercase_name overriden with underscore_name") + print_warning("lowercase_name overridden with underscore_name") option_lowercase_name = None else: print_warning("lowercase_name is deprecated, use underscore_name") diff --git a/gobject/gobject-autocleanups.h b/gobject/gobject-autocleanups.h index 8aeda2eb9..1613857ec 100644 --- a/gobject/gobject-autocleanups.h +++ b/gobject/gobject-autocleanups.h @@ -22,6 +22,10 @@ #endif G_DEFINE_AUTOPTR_CLEANUP_FUNC(GClosure, g_closure_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GEnumClass, g_type_class_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GFlagsClass, g_type_class_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GObject, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GInitiallyUnowned, g_object_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GParamSpec, g_param_spec_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTypeClass, g_type_class_unref) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GValue, g_value_unset) diff --git a/gobject/gobject.c b/gobject/gobject.c index 81a1162e9..555ca3fae 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -477,11 +477,17 @@ g_object_do_class_init (GObjectClass *class) * @gobject: the object which received the signal. * @pspec: the #GParamSpec of the property which changed. * - * The notify signal is emitted on an object when one of its - * properties has been changed. Note that getting this signal - * doesn't guarantee that the value of the property has actually - * changed, it may also be emitted when the setter for the property - * is called to reinstate the previous value. + * The notify signal is emitted on an object when one of its properties has + * its value set through g_object_set_property(), g_object_set(), et al. + * + * Note that getting this signal doesn’t itself guarantee that the value of + * the property has actually changed. When it is emitted is determined by the + * derived GObject class. If the implementor did not create the property with + * %G_PARAM_EXPLICIT_NOTIFY, then any call to g_object_set_property() results + * in ::notify being emitted, even if the new value is the same as the old. + * If they did pass %G_PARAM_EXPLICIT_NOTIFY, then this signal is emitted only + * when they explicitly call g_object_notify() or g_object_notify_by_pspec(), + * and common practice is to do that only when the value has actually changed. * * This signal is typically used to obtain change notification for a * single property, by specifying the property name as a detail in the @@ -1899,7 +1905,7 @@ g_object_new_is_valid_property (GType object_type, /** - * g_object_new_with_properties: (rename-to g_object_new) + * g_object_new_with_properties: (skip) * @object_type: the object type to instantiate * @n_properties: the number of properties * @names: (array length=n_properties): the names of each property to be set diff --git a/gobject/gobject_gdb.py b/gobject/gobject_gdb.py index c86dbd1b7..1746576fd 100644 --- a/gobject/gobject_gdb.py +++ b/gobject/gobject_gdb.py @@ -21,7 +21,7 @@ except ImportError: def read_global_var (symname): return gdb.selected_frame().read_var(symname) -def g_type_to_name (gtype): +def g_type_to_typenode (gtype): def lookup_fundamental_type (typenode): if typenode == 0: return None @@ -36,6 +36,10 @@ def g_type_to_name (gtype): typenode = gdb.Value(typenode).cast (gdb.lookup_type("TypeNode").pointer()) else: typenode = lookup_fundamental_type (typenode) + return typenode + +def g_type_to_name (gtype): + typenode = g_type_to_typenode(gtype) if typenode != None: return glib_gdb.g_quark_to_string (typenode["qname"]) return None @@ -88,9 +92,42 @@ class GTypePrettyPrinter: return ("0x%x [%s]")% (long(self.val), name) return ("0x%x") % (long(self.val)) +def is_g_type_class_instance (val): + type = val.type + if type.code != gdb.TYPE_CODE_PTR: + return False + return str(type.target()) == "GTypeClass" + +class GTypeHandlePrettyPrinter: + "Prints a GType instance" + + def __init__ (self, val, hint = ""): + self.val = val + self.hint = hint + + def to_string (self): + typenode = g_type_to_typenode(self.val) + if typenode != None: + name = glib_gdb.g_quark_to_string (typenode["qname"]) + s = ("0x%x [%s%s")% (long(self.val), self.hint, name) + for i in range (1, int(typenode["n_supers"])): + node = g_type_to_typenode(typenode["supers"][i]) + if node: + name = glib_gdb.g_quark_to_string(node["qname"]) + else: + name = "???" + s += "/" + name + return s + "]" + else: + return ("0x%x") % (long(self.val)) + def pretty_printer_lookup (val): if is_g_type_instance (val): return GTypePrettyPrinter (val) + if str(val.type) == "GType": + return GTypeHandlePrettyPrinter (val) + if is_g_type_class_instance (val): + return GTypeHandlePrettyPrinter (val["g_type"], "g_type: ") return None diff --git a/gobject/gsignal.c b/gobject/gsignal.c index b22dfcca8..76f1dc93c 100644 --- a/gobject/gsignal.c +++ b/gobject/gsignal.c @@ -1467,7 +1467,7 @@ g_signal_new (const gchar *signal_name, * Creates a new signal. (This is usually done in the class initializer.) * * This is a variant of g_signal_new() that takes a C callback instead - * off a class offset for the signal's class handler. This function + * of a class offset for the signal's class handler. This function * doesn't need a function pointer exposed in the class structure of * an object definition, instead the function pointer is passed * directly and can be overriden by derived classes with diff --git a/gobject/gsourceclosure.c b/gobject/gsourceclosure.c index 3a1a1238a..0d0d2e87c 100644 --- a/gobject/gsourceclosure.c +++ b/gobject/gsourceclosure.c @@ -258,7 +258,7 @@ g_source_set_closure (GSource *source, source->source_funcs != &g_timeout_funcs && source->source_funcs != &g_idle_funcs) { - g_critical (G_STRLOC ": closure cannot be set on GSource without GSourceFuncs::closure_callback\n"); + g_critical (G_STRLOC ": closure cannot be set on GSource without GSourceFuncs::closure_callback"); return; } diff --git a/gobject/gtype.h b/gobject/gtype.h index 375dfa210..cf7770322 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -1948,6 +1948,7 @@ static void type_name##_class_intern_init (gpointer klass) \ \ static void type_name##_init (TypeName *self); \ static void type_name##_class_init (TypeName##Class *klass); \ +static GType type_name##_get_type_once (void); \ static gpointer type_name##_parent_class = NULL; \ static gint TypeName##_private_offset; \ \ @@ -1970,7 +1971,17 @@ type_name##_get_type (void) \ #define _G_DEFINE_TYPE_EXTENDED_BEGIN_REGISTER(TypeName, type_name, TYPE_PARENT, flags) \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ - GType g_define_type_id = \ + GType g_define_type_id = type_name##_get_type_once (); \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} /* closes type_name##_get_type() */ \ +\ +G_GNUC_NO_INLINE \ +static GType \ +type_name##_get_type_once (void) \ +{ \ + GType g_define_type_id = \ g_type_register_static_simple (TYPE_PARENT, \ g_intern_static_string (#TypeName), \ sizeof (TypeName##Class), \ @@ -1978,14 +1989,12 @@ type_name##_get_type (void) \ sizeof (TypeName), \ (GInstanceInitFunc)(void (*)(void)) type_name##_init, \ (GTypeFlags) flags); \ - { /* custom code follows */ + { /* custom code follows */ #define _G_DEFINE_TYPE_EXTENDED_END() \ - /* following custom code */ \ - } \ - g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + /* following custom code */ \ } \ - return g_define_type_id__volatile; \ -} /* closes type_name##_get_type() */ + return g_define_type_id; \ +} /* closes type_name##_get_type_once() */ /* This was defined before we had G_DEFINE_TYPE_WITH_CODE_AND_PRELUDE, it's simplest * to keep it. @@ -2070,42 +2079,66 @@ type_name##_get_type (void) \ */ #if !defined (__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) && !(defined (__APPLE__) && defined (__ppc64__)) #define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \ +static GType type_name##_get_type_once (void); \ +\ GType \ type_name##_get_type (void) \ { \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ - GType (* _g_register_boxed) \ - (const gchar *, \ - union \ - { \ - TypeName * (*do_copy_type) (TypeName *); \ - TypeName * (*do_const_copy_type) (const TypeName *); \ - GBoxedCopyFunc do_copy_boxed; \ - } __attribute__((__transparent_union__)), \ - union \ - { \ - void (* do_free_type) (TypeName *); \ - GBoxedFreeFunc do_free_boxed; \ - } __attribute__((__transparent_union__)) \ - ) = g_boxed_type_register_static; \ - GType g_define_type_id = \ - _g_register_boxed (g_intern_static_string (#TypeName), copy_func, free_func); \ - { /* custom code follows */ + GType g_define_type_id = type_name##_get_type_once (); \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} \ +\ +G_GNUC_NO_INLINE \ +static GType \ +type_name##_get_type_once (void) \ +{ \ + GType (* _g_register_boxed) \ + (const gchar *, \ + union \ + { \ + TypeName * (*do_copy_type) (TypeName *); \ + TypeName * (*do_const_copy_type) (const TypeName *); \ + GBoxedCopyFunc do_copy_boxed; \ + } __attribute__((__transparent_union__)), \ + union \ + { \ + void (* do_free_type) (TypeName *); \ + GBoxedFreeFunc do_free_boxed; \ + } __attribute__((__transparent_union__)) \ + ) = g_boxed_type_register_static; \ + GType g_define_type_id = \ + _g_register_boxed (g_intern_static_string (#TypeName), copy_func, free_func); \ + { /* custom code follows */ #else #define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \ +static GType type_name##_get_type_once (void); \ +\ GType \ type_name##_get_type (void) \ { \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ - GType g_define_type_id = \ - g_boxed_type_register_static (g_intern_static_string (#TypeName), \ - (GBoxedCopyFunc) copy_func, \ - (GBoxedFreeFunc) free_func); \ - { /* custom code follows */ + GType g_define_type_id = type_name##_get_type_once (); \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} \ +\ +G_GNUC_NO_INLINE \ +static GType \ +type_name##_get_type_once (void) \ +{ \ + GType g_define_type_id = \ + g_boxed_type_register_static (g_intern_static_string (#TypeName), \ + (GBoxedCopyFunc) copy_func, \ + (GBoxedFreeFunc) free_func); \ + { /* custom code follows */ #endif /* __GNUC__ */ /** @@ -2136,15 +2169,27 @@ type_name##_get_type (void) \ #define G_DEFINE_POINTER_TYPE_WITH_CODE(TypeName, type_name, _C_) _G_DEFINE_POINTER_TYPE_BEGIN (TypeName, type_name) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() #define _G_DEFINE_POINTER_TYPE_BEGIN(TypeName, type_name) \ +static GType type_name##_get_type_once (void); \ +\ GType \ type_name##_get_type (void) \ { \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ - GType g_define_type_id = \ - g_pointer_type_register_static (g_intern_static_string (#TypeName)); \ - { /* custom code follows */ + GType g_define_type_id = type_name##_get_type_once (); \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} \ +\ +G_GNUC_NO_INLINE \ +static GType \ +type_name##_get_type_once (void) \ +{ \ + GType g_define_type_id = \ + g_pointer_type_register_static (g_intern_static_string (#TypeName)); \ + { /* custom code follows */ /* --- protected (for fundamental type implementations) --- */ GLIB_AVAILABLE_IN_ALL diff --git a/gobject/gtypemodule.c b/gobject/gtypemodule.c index c67f789b1..4ecaf8c88 100644 --- a/gobject/gtypemodule.c +++ b/gobject/gtypemodule.c @@ -253,7 +253,7 @@ g_type_module_use (GTypeModule *module) ModuleTypeInfo *type_info = tmp_list->data; if (!type_info->loaded) { - g_warning ("plugin '%s' failed to register type '%s'\n", + g_warning ("plugin '%s' failed to register type '%s'", module->name ? module->name : "(unknown)", g_type_name (type_info->type)); module->use_count--; @@ -309,7 +309,7 @@ g_type_module_use_plugin (GTypePlugin *plugin) if (!g_type_module_use (module)) { - g_warning ("Fatal error - Could not reload previously loaded plugin '%s'\n", + g_warning ("Fatal error - Could not reload previously loaded plugin '%s'", module->name ? module->name : "(unknown)"); exit (1); } @@ -413,7 +413,7 @@ g_type_module_register_type (GTypeModule *module, { const gchar *parent_type_name = g_type_name (parent_type); - g_warning ("Type '%s' recreated with different parent type.\n" + g_warning ("Type '%s' recreated with different parent type." "(was '%s', now '%s')", type_name, g_type_name (module_type_info->parent_type), parent_type_name ? parent_type_name : "(unknown)"); diff --git a/gobject/gvaluecollector.h b/gobject/gvaluecollector.h index f58858841..d083084f1 100644 --- a/gobject/gvaluecollector.h +++ b/gobject/gvaluecollector.h @@ -195,16 +195,16 @@ G_STMT_START { \ /** * G_VALUE_LCOPY: - * @value: a #GValue return location. @value is supposed to be initialized - * according to the value type to be collected + * @value: a #GValue to store into the @var_args; this must be initialized + * and set * @var_args: the va_list variable; it may be evaluated multiple times * @flags: flags which are passed on to the lcopy_value() function of * the #GTypeValueTable of @value. * @__error: a #gchar** variable that will be modified to hold a g_new() - * allocated error messages if something fails - * - * Collects a value's variable argument locations from a va_list. Usage is - * analogous to G_VALUE_COLLECT(). + * allocated error message if something fails + * + * Stores a value’s value into one or more argument locations from a va_list. + * This is the inverse of G_VALUE_COLLECT(). */ #define G_VALUE_LCOPY(value, var_args, flags, __error) \ G_STMT_START { \ diff --git a/gobject/meson.build b/gobject/meson.build index f1ab8fd46..d34a897a7 100644 --- a/gobject/meson.build +++ b/gobject/meson.build @@ -68,8 +68,19 @@ libgobject = library('gobject-2.0', soversion : soversion, install : true, include_directories : [configinc], - dependencies : [libintl, libffi_dep, libglib_dep], - c_args : ['-DG_LOG_DOMAIN="GLib-GObject"', '-DGOBJECT_COMPILATION'] + glib_hidden_visibility_args) + dependencies : [libffi_dep, libglib_dep], + c_args : ['-DG_LOG_DOMAIN="GLib-GObject"', '-DGOBJECT_COMPILATION'] + glib_hidden_visibility_args, + link_args : glib_link_flags, +) + +pkg.generate(libraries : libgobject, + requires : ['glib-2.0'], + version : glib_version, + install_dir : glib_pkgconfigreldir, + filebase : 'gobject-2.0', + name : 'GObject', + description : 'GLib Type, Object, Parameter and Signal Library', +) libgobject_dep = declare_dependency(link_with : libgobject, include_directories : gobjectinc) |