Пример #1
0
/**
 * g_value_init_from_instance:
 * @value: An uninitialized #GValue structure.
 * @instance: (type GObject.TypeInstance): the instance
 *
 * Initializes and sets @value from an instantiatable type via the
 * value_table's collect_value() function.
 *
 * Note: The @value will be initialised with the exact type of
 * @instance.  If you wish to set the @value's type to a different GType
 * (such as a parent class GType), you need to manually call
 * g_value_init() and g_value_set_instance().
 *
 * Since: 2.42
 */
void
g_value_init_from_instance (GValue  *value,
                            gpointer instance)
{
  g_return_if_fail (value != NULL && G_VALUE_TYPE(value) == 0);

  if (G_IS_OBJECT (instance))
    {
      /* Fast-path.
       * If G_IS_OBJECT() succeeds we know:
       * * that instance is present and valid
       * * that it is a GObject, and therefore we can directly
       *   use the collect implementation (g_object_ref) */
      value_meminit (value, G_TYPE_FROM_INSTANCE (instance));
      value->data[0].v_pointer = g_object_ref (instance);
    }
  else
    {  
      GType g_type;
      GTypeValueTable *value_table;
      GTypeCValue cvalue;
      gchar *error_msg;

      g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));

      g_type = G_TYPE_FROM_INSTANCE (instance);
      value_table = g_type_value_table_peek (g_type);
      g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);

      memset (&cvalue, 0, sizeof (cvalue));
      cvalue.v_pointer = instance;

      /* setup and collect */
      value_meminit (value, g_type);
      value_table->value_init (value);
      error_msg = value_table->collect_value (value, 1, &cvalue, 0);
      if (error_msg)
        {
          g_warning ("%s: %s", G_STRLOC, error_msg);
          g_free (error_msg);

          /* we purposely leak the value here, it might not be
           * in a sane state if an error condition occoured
           */
          value_meminit (value, g_type);
          value_table->value_init (value);
        }
    }
}
Пример #2
0
/**
 * g_value_set_instance:
 * @value: An initialized #GValue structure.
 * @instance: (allow-none): the instance
 *
 * Sets @value from an instantiatable type via the
 * value_table's collect_value() function.
 */
void
g_value_set_instance (GValue  *value,
                      gpointer instance)
{
    GType g_type;
    GTypeValueTable *value_table;
    GTypeCValue cvalue;
    gchar *error_msg;

    g_return_if_fail (G_IS_VALUE (value));
    if (instance)
    {
        g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance));
        g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value)));
    }

    g_type = G_VALUE_TYPE (value);
    value_table = g_type_value_table_peek (g_type);

    g_return_if_fail (strcmp (value_table->collect_format, "p") == 0);

    memset (&cvalue, 0, sizeof (cvalue));
    cvalue.v_pointer = instance;

    /* make sure value's value is free()d */
    if (value_table->value_free)
        value_table->value_free (value);

    /* setup and collect */
    value_meminit (value, g_type);
    error_msg = value_table->collect_value (value, 1, &cvalue, 0);
    if (error_msg)
    {
        g_warning ("%s: %s", G_STRLOC, error_msg);
        g_free (error_msg);

        /* we purposely leak the value here, it might not be
         * in a sane state if an error condition occoured
         */
        value_meminit (value, g_type);
        value_table->value_init (value);
    }
}