Commit c98da214 authored by Richard M. Stallman's avatar Richard M. Stallman

(add_properties): Add gcpro's.

(Fadd_text_properties, copy_text_properties): Likewise.
parent 05469d1a
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment