[glib: 1/2] gvalue: Do copy non-interned strings



commit e21ab81ce039eab1992b5741e3b14ea785124a5f
Author: Edward Hervey <bilboed bilboed com>
Date:   Tue Jun 23 10:30:55 2020 +0000

    gvalue: Do copy non-interned strings
    
    The G_VALUE_NOCOPY_CONTENTS for strings can only be used when collecting them
    and not when copying them.
    
    Instead only avoid copies for strings that are interned.
    
    Fixes #2141

 gobject/gvalue.h      | 3 ++-
 gobject/gvaluetypes.c | 4 ++--
 gobject/tests/value.c | 4 ++--
 3 files changed, 6 insertions(+), 5 deletions(-)
---
diff --git a/gobject/gvalue.h b/gobject/gvalue.h
index 1c6d7377c..dc6e5ac3b 100644
--- a/gobject/gvalue.h
+++ b/gobject/gvalue.h
@@ -171,7 +171,8 @@ void        g_value_register_transform_func (GType           src_type,
  *
  * If passed to G_VALUE_COLLECT(), allocated data won't be copied
  * but used verbatim. This does not affect ref-counted types like
- * objects.
+ * objects. This does not affect usage of g_value_copy(), the data will
+ * be copied if it is not ref-counted.
  */
 #define G_VALUE_NOCOPY_CONTENTS (1 << 27)
 
diff --git a/gobject/gvaluetypes.c b/gobject/gvaluetypes.c
index 9eaba43ce..732ea2b08 100644
--- a/gobject/gvaluetypes.c
+++ b/gobject/gvaluetypes.c
@@ -264,7 +264,7 @@ static void
 value_copy_string (const GValue *src_value,
                   GValue       *dest_value)
 {
-  if (src_value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
+  if (src_value->data[1].v_uint & G_VALUE_INTERNED_STRING)
     {
       dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
       dest_value->data[1].v_uint = src_value->data[1].v_uint;
@@ -272,7 +272,7 @@ value_copy_string (const GValue *src_value,
   else
     {
       dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
-      dest_value->data[1].v_uint = src_value->data[1].v_uint;
+      /* Don't copy over *any* flags, we're restarting from scratch */
     }
 }
 
diff --git a/gobject/tests/value.c b/gobject/tests/value.c
index af918dde9..e21b23445 100644
--- a/gobject/tests/value.c
+++ b/gobject/tests/value.c
@@ -148,11 +148,11 @@ test_value_string (void)
   g_assert_cmpstr (str2, ==, static1);
   g_free (str2);
 
-  /* Copying a static string gvalue should *not* copy the contents */
+  /* Copying a static string gvalue should *actually* copy the contents */
   g_value_init (&copy, G_TYPE_STRING);
   g_value_copy (&value, &copy);
   copystr = g_value_get_string (&copy);
-  g_assert_true (copystr == static1);
+  g_assert_true (copystr != static1);
   g_value_unset (&copy);
 
   /* Setting a new string should change the contents */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]