summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2022-08-30 23:43:51 +0100
committerEmmanuele Bassi <ebassi@gmail.com>2023-01-08 14:03:20 +0000
commitbfe4b306506547bd7bbc25123c1323e561b5096e (patch)
tree3cc49113f7c84c77e888e82bb856abe0b79dddfb
parentd32cc77e70fb5ce93f005e87587203167306be31 (diff)
downloadgobject-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.
-rw-r--r--girepository/gdump.c47
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);
}