[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#20153: 24.4.91; destructive add-face-text-property and string deep c
From: |
Lars Ingebrigtsen |
Subject: |
bug#20153: 24.4.91; destructive add-face-text-property and string deep copying |
Date: |
Wed, 09 Oct 2019 05:04:03 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) |
I've never really worked with the interval internals before, so I
thought this was going to be easy to fix. :-/ But the problem is that
copy_intervals doesn't do a "deep" copy of the text properties, so this
has no effect, really.
(Patch included for reference.)
Instead I've now changed add_properties (and add_text_properties_1) to
take a bool parameter to say whether they're allowed to be destructive
or not, and make the add-face-text-property call that with false as the
parameter if the object is a string. This fixes the test case for me
and should hopefully have no measurable performance impact.
diff --git a/src/textprop.c b/src/textprop.c
index d36b9e14a6..dcd3284209 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -1334,6 +1334,18 @@ face(s) are retained. This is done by setting the
`face' property to
Lisp_Object append, Lisp_Object object)
{
AUTO_LIST2 (properties, Qface, face);
+
+ /* If we're adding face properties to a string, and the face
+ property is already a list, then copy the list first to avoid
+ destructively altering it. */
+ if (STRINGP (object))
+ {
+ INTERVAL copy = copy_intervals (string_intervals (object),
+ 0, SCHARS (object));
+ set_interval_object (copy, object);
+ set_string_intervals (object, copy);
+ }
+
add_text_properties_1 (start, end, properties, object,
(NILP (append)
? TEXT_PROPERTY_PREPEND
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no