diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2022-08-30 23:43:51 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gmail.com> | 2023-01-08 14:03:20 +0000 |
commit | bfe4b306506547bd7bbc25123c1323e561b5096e (patch) | |
tree | 3cc49113f7c84c77e888e82bb856abe0b79dddfb /girepository | |
parent | d32cc77e70fb5ce93f005e87587203167306be31 (diff) | |
download | gobject-introspection-bfe4b306506547bd7bbc25123c1323e561b5096e.tar.gz |
Dump the default value of object properties
We use g_param_spec_get_default_value() to get the default GValue of a
GParamSpec, and then we serialize it into a string according to the
value's own contents and type.
Diffstat (limited to 'girepository')
-rw-r--r-- | girepository/gdump.c | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/girepository/gdump.c b/girepository/gdump.c index e79f1719..3ee687b6 100644 --- a/girepository/gdump.c +++ b/girepository/gdump.c @@ -119,6 +119,40 @@ invoke_error_quark (GModule *self, const char *symbol, GError **error) return sym (); } +/* A simpler version of g_strdup_value_contents(), but with stable + * output and less complex semantics + */ +static char * +value_to_string (const GValue *value) +{ + if (G_VALUE_HOLDS_STRING (value)) + { + const char *s = g_value_get_string (value); + + if (s == NULL) + return g_strdup ("NULL"); + + return g_strescape (s, NULL); + } + else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING)) + { + GValue tmp = G_VALUE_INIT; + char *s; + + g_value_init (&tmp, G_TYPE_STRING); + g_value_transform (value, &tmp); + s = g_strescape (g_value_get_string (&tmp), NULL); + g_value_unset (&tmp); + + if (s == NULL) + return g_strdup ("NULL"); + + return s; + } + else + return g_strdup ("NULL"); +} + static void dump_properties (GType type, GOutputStream *out) { @@ -147,9 +181,18 @@ dump_properties (GType type, GOutputStream *out) if (prop->owner_type != type) continue; - escaped_printf (out, " <property name=\"%s\" type=\"%s\" flags=\"%d\"/>\n", - prop->name, g_type_name (prop->value_type), prop->flags); + const GValue *v = g_param_spec_get_default_value (prop); + char *default_value = value_to_string (v); + + escaped_printf (out, " <property name=\"%s\" type=\"%s\" flags=\"%d\" default-value=\"%s\"/>\n", + prop->name, + g_type_name (prop->value_type), + prop->flags, + default_value); + + g_free (default_value); } + g_free (props); } |