summaryrefslogtreecommitdiff
path: root/src/textprop.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-12-14 14:23:04 +0000
committerRichard M. Stallman <rms@gnu.org>1994-12-14 14:23:04 +0000
commit24f9d950a4f0df9def1385b72a7d0ef4bcbd2923 (patch)
treec6baae61889dd3d6fac7c3a3cf0dc384c227feb1 /src/textprop.c
parent3a8711025b362d10ca0e132bfa2dfd6110b6bacf (diff)
downloademacs-24f9d950a4f0df9def1385b72a7d0ef4bcbd2923.tar.gz
(add_properties): Add gcpro's.
(Fadd_text_properties, copy_text_properties): Likewise.
Diffstat (limited to 'src/textprop.c')
-rw-r--r--src/textprop.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/textprop.c b/src/textprop.c
index cc252dacef1..379cd2a7f80 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -331,9 +331,18 @@ add_properties (plist, i, object)
INTERVAL i;
Lisp_Object object;
{
- register Lisp_Object tail1, tail2, sym1, val1;
+ Lisp_Object tail1, tail2, sym1, val1;
register int changed = 0;
register int found;
+ struct gcpro gcpro1, gcpro2, gcpro3;
+
+ tail1 = plist;
+ sym1 = Qnil;
+ val1 = Qnil;
+ /* No need to protect OBJECT, because we can GC only in the case
+ where it is a buffer, and live buffers are always protected.
+ I and its plist are also protected, via OBJECT. */
+ GCPRO3 (tail1, sym1, val1);
/* Go through each element of PLIST. */
for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1)))
@@ -346,6 +355,8 @@ add_properties (plist, i, object)
for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2)))
if (EQ (sym1, Fcar (tail2)))
{
+ /* No need to gcpro, because tail2 protects this
+ and it must be a cons cell (we get an error otherwise). */
register Lisp_Object this_cdr;
this_cdr = Fcdr (tail2);
@@ -389,6 +400,8 @@ add_properties (plist, i, object)
}
}
+ UNGCPRO;
+
return changed;
}
@@ -783,6 +796,8 @@ back past position LIMIT; return LIMIT if nothing is found until LIMIT.")
return pos;
}
+/* Callers note, this can GC when OBJECT is a buffer (or nil). */
+
DEFUN ("add-text-properties", Fadd_text_properties,
Sadd_text_properties, 3, 4, 0,
"Add properties to the text from START to END.\n\
@@ -796,6 +811,7 @@ Return t if any property value actually changed, nil otherwise.")
{
register INTERVAL i, unchanged;
register int s, len, modified = 0;
+ struct gcpro gcpro1;
properties = validate_plist (properties);
if (NILP (properties))
@@ -811,6 +827,10 @@ Return t if any property value actually changed, nil otherwise.")
s = XINT (start);
len = XINT (end) - s;
+ /* No need to protect OBJECT, because we GC only if it's a buffer,
+ and live buffers are always protected. */
+ GCPRO1 (properties);
+
/* If we're not starting on an interval boundary, we have to
split this interval. */
if (i->position != s)
@@ -841,6 +861,11 @@ Return t if any property value actually changed, nil otherwise.")
if (LENGTH (i) >= len)
{
+ /* We can UNGCPRO safely here, because there will be just
+ one more chance to gc, in the next call to add_properties,
+ and after that we will not need PROPERTIES or OBJECT again. */
+ UNGCPRO;
+
if (interval_has_all_properties (properties, i))
return modified ? Qt : Qnil;
@@ -864,6 +889,8 @@ Return t if any property value actually changed, nil otherwise.")
}
}
+/* Callers note, this can GC when OBJECT is a buffer (or nil). */
+
DEFUN ("put-text-property", Fput_text_property,
Sput_text_property, 4, 5, 0,
"Set one property of the text from START to END.\n\
@@ -1254,13 +1281,13 @@ is the string or buffer containing the text.")
returns the text properties of a region as a list of ranges and
plists, and another which applies such a list to another object. */
-/* DEFUN ("copy-text-properties", Fcopy_text_properties,
- Scopy_text_properties, 5, 6, 0,
- "Add properties from SRC-START to SRC-END of SRC at DEST-POS of DEST.\n\
-SRC and DEST may each refer to strings or buffers.\n\
-Optional sixth argument PROP causes only that property to be copied.\n\
-Properties are copied to DEST as if by `add-text-properties'.\n\
-Return t if any property value actually changed, nil otherwise.") */
+/* Add properties from SRC to SRC of SRC, starting at POS in DEST.
+ SRC and DEST may each refer to strings or buffers.
+ Optional sixth argument PROP causes only that property to be copied.
+ Properties are copied to DEST as if by `add-text-properties'.
+ Return t if any property value actually changed, nil otherwise. */
+
+/* Note this can GC when DEST is a buffer. */
Lisp_Object
copy_text_properties (start, end, src, pos, dest, prop)
@@ -1271,6 +1298,7 @@ copy_text_properties (start, end, src, pos, dest, prop)
Lisp_Object stuff;
Lisp_Object plist;
int s, e, e2, p, len, modified = 0;
+ struct gcpro gcpro1, gcpro2;
i = validate_interval_range (src, &start, &end, soft);
if (NULL_INTERVAL_P (i))
@@ -1329,6 +1357,8 @@ copy_text_properties (start, end, src, pos, dest, prop)
s = i->position;
}
+ GCPRO2 (stuff, dest);
+
while (! NILP (stuff))
{
res = Fcar (stuff);
@@ -1339,6 +1369,8 @@ copy_text_properties (start, end, src, pos, dest, prop)
stuff = Fcdr (stuff);
}
+ UNGCPRO;
+
return modified ? Qt : Qnil;
}