[glib: 1/2] gvalue: Do copy non-interned strings
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 1/2] gvalue: Do copy non-interned strings
- Date: Tue, 23 Jun 2020 10:31:12 +0000 (UTC)
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 (©, G_TYPE_STRING);
g_value_copy (&value, ©);
copystr = g_value_get_string (©);
- g_assert_true (copystr == static1);
+ g_assert_true (copystr != static1);
g_value_unset (©);
/* Setting a new string should change the contents */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]