+
+G_DEFINE_POINTER_TYPE (GType, g_gtype)
+
+/**
+ * g_value_set_gtype:
+ * @value: a valid #GValue of type %G_TYPE_GTYPE
+ * @v_gtype: #GType to be set
+ *
+ * Set the contents of a %G_TYPE_GTYPE #GValue to @v_gtype.
+ *
+ * Since: 2.12
+ */
+void
+g_value_set_gtype (GValue *value,
+ GType v_gtype)
+{
+ g_return_if_fail (G_VALUE_HOLDS_GTYPE (value));
+
+ value->data[0].v_pointer = GSIZE_TO_POINTER (v_gtype);
+
+}
+
+/**
+ * g_value_get_gtype:
+ * @value: a valid #GValue of type %G_TYPE_GTYPE
+ *
+ * Get the contents of a %G_TYPE_GTYPE #GValue.
+ *
+ * Since: 2.12
+ *
+ * Returns: the #GType stored in @value
+ */
+GType
+g_value_get_gtype (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_GTYPE (value), 0);
+
+ return GPOINTER_TO_SIZE (value->data[0].v_pointer);
+}
+
+/**
+ * g_value_set_variant:
+ * @value: a valid #GValue of type %G_TYPE_VARIANT
+ * @variant: (allow-none): a #GVariant, or %NULL
+ *
+ * Set the contents of a variant #GValue to @variant.
+ * If the variant is floating, it is consumed.
+ *
+ * Since: 2.26
+ */
+void
+g_value_set_variant (GValue *value,
+ GVariant *variant)
+{
+ GVariant *old_variant;
+
+ g_return_if_fail (G_VALUE_HOLDS_VARIANT (value));
+
+ old_variant = value->data[0].v_pointer;
+
+ if (variant)
+ value->data[0].v_pointer = g_variant_ref_sink (variant);
+ else
+ value->data[0].v_pointer = NULL;
+
+ if (old_variant)
+ g_variant_unref (old_variant);
+}
+
+/**
+ * g_value_take_variant:
+ * @value: a valid #GValue of type %G_TYPE_VARIANT
+ * @variant: (allow-none): a #GVariant, or %NULL
+ *
+ * Set the contents of a variant #GValue to @variant, and takes over
+ * the ownership of the caller's reference to @variant;
+ * the caller doesn't have to unref it any more (i.e. the reference
+ * count of the variant is not increased).
+ *
+ * If @variant was floating then its floating reference is converted to
+ * a hard reference.
+ *
+ * If you want the #GValue to hold its own reference to @variant, use
+ * g_value_set_variant() instead.
+ *
+ * This is an internal function introduced mainly for C marshallers.
+ *
+ * Since: 2.26
+ */
+void
+g_value_take_variant (GValue *value,
+ GVariant *variant)
+{
+ GVariant *old_variant;
+
+ g_return_if_fail (G_VALUE_HOLDS_VARIANT (value));
+
+ old_variant = value->data[0].v_pointer;
+
+ if (variant)
+ value->data[0].v_pointer = g_variant_take_ref (variant);
+ else
+ value->data[0].v_pointer = NULL;
+
+ if (old_variant)
+ g_variant_unref (old_variant);
+}
+
+/**
+ * g_value_get_variant:
+ * @value: a valid #GValue of type %G_TYPE_VARIANT
+ *
+ * Get the contents of a variant #GValue.
+ *
+ * Returns: variant contents of @value
+ *
+ * Since: 2.26
+ */
+GVariant*
+g_value_get_variant (const GValue *value)
+{
+ g_return_val_if_fail (G_VALUE_HOLDS_VARIANT (value), NULL);
+
+ return value->data[0].v_pointer;
+}
+
+/**
+ * g_value_dup_variant:
+ * @value: a valid #GValue of type %G_TYPE_VARIANT
+ *
+ * Get the contents of a variant #GValue, increasing its refcount.
+ *
+ * Returns: variant contents of @value, should be unrefed using
+ * g_variant_unref() when no longer needed
+ *
+ * Since: 2.26
+ */
+GVariant*
+g_value_dup_variant (const GValue *value)
+{
+ GVariant *variant;
+
+ g_return_val_if_fail (G_VALUE_HOLDS_VARIANT (value), NULL);
+
+ variant = value->data[0].v_pointer;
+ if (variant)
+ g_variant_ref_sink (variant);
+
+ return variant;
+}
+
+/**
+ * g_strdup_value_contents:
+ * @value: #GValue which contents are to be described.
+ *
+ * Return a newly allocated string, which describes the contents of a
+ * #GValue. The main purpose of this function is to describe #GValue
+ * contents for debugging output, the way in which the contents are
+ * described may change between different GLib versions.
+ *
+ * Returns: Newly allocated string.
+ */
+gchar*
+g_strdup_value_contents (const GValue *value)
+{
+ const gchar *src;
+ gchar *contents;
+
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+ if (G_VALUE_HOLDS_STRING (value))
+ {
+ src = g_value_get_string (value);
+
+ if (!src)
+ contents = g_strdup ("NULL");
+ else
+ {
+ gchar *s = g_strescape (src, NULL);
+
+ contents = g_strdup_printf ("\"%s\"", s);
+ g_free (s);
+ }
+ }
+ else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING))
+ {
+ GValue tmp_value = G_VALUE_INIT;
+ gchar *s;
+
+ g_value_init (&tmp_value, G_TYPE_STRING);
+ g_value_transform (value, &tmp_value);
+ s = g_strescape (g_value_get_string (&tmp_value), NULL);
+ g_value_unset (&tmp_value);
+ if (G_VALUE_HOLDS_ENUM (value) || G_VALUE_HOLDS_FLAGS (value))
+ contents = g_strdup_printf ("((%s) %s)",
+ g_type_name (G_VALUE_TYPE (value)),
+ s);
+ else
+ contents = g_strdup (s ? s : "NULL");
+ g_free (s);
+ }
+ else if (g_value_fits_pointer (value))
+ {
+ gpointer p = g_value_peek_pointer (value);
+
+ if (!p)
+ contents = g_strdup ("NULL");
+ else if (G_VALUE_HOLDS_OBJECT (value))
+ contents = g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p), p);
+ else if (G_VALUE_HOLDS_PARAM (value))
+ contents = g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p), p);
+ else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
+ {
+ GStrv strv = g_value_get_boxed (value);
+ GString *tmp = g_string_new ("[");
+
+ while (*strv != NULL)
+ {
+ gchar *escaped = g_strescape (*strv, NULL);
+
+ g_string_append_printf (tmp, "\"%s\"", escaped);
+ g_free (escaped);
+
+ if (*++strv != NULL)
+ g_string_append (tmp, ", ");
+ }
+
+ g_string_append (tmp, "]");
+ contents = g_string_free (tmp, FALSE);
+ }
+ else if (G_VALUE_HOLDS_BOXED (value))
+ contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p);
+ else if (G_VALUE_HOLDS_POINTER (value))
+ contents = g_strdup_printf ("((gpointer) %p)", p);
+ else
+ contents = g_strdup ("???");
+ }
+ else
+ contents = g_strdup ("???");
+
+ return contents;
+}
+
+/**
+ * g_pointer_type_register_static:
+ * @name: the name of the new pointer type.
+ *
+ * Creates a new %G_TYPE_POINTER derived type id for a new
+ * pointer type with name @name.
+ *
+ * Returns: a new %G_TYPE_POINTER derived type id for @name.
+ */
+GType
+g_pointer_type_register_static (const gchar *name)
+{
+ const GTypeInfo type_info = {
+ 0, /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL /* value_table */
+ };
+ GType type;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (g_type_from_name (name) == 0, 0);
+
+ type = g_type_register_static (G_TYPE_POINTER, name, &type_info, 0);
+
+ return type;
+}