changeset 10159:1299d37b51bb

(add_properties): Add gcpro's. (Fadd_text_properties, copy_text_properties): Likewise.
author Richard M. Stallman <rms@gnu.org>
date Wed, 14 Dec 1994 14:23:04 +0000
parents 4721ac2f48cb
children 29c400c63312
files src/textprop.c
diffstat 1 files changed, 40 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/textprop.c	Wed Dec 14 04:56:59 1994 +0000
+++ b/src/textprop.c	Wed Dec 14 14:23:04 1994 +0000
@@ -331,9 +331,18 @@
      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 @@
       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 @@
 	}
     }
 
+  UNGCPRO;
+
   return changed;
 }
 
@@ -783,6 +796,8 @@
   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 @@
 {
   register INTERVAL i, unchanged;
   register int s, len, modified = 0;
+  struct gcpro gcpro1;
 
   properties = validate_plist (properties);
   if (NILP (properties))
@@ -811,6 +827,10 @@
   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 @@
 
       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 @@
     }
 }
 
+/* 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 @@
    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 @@
   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 @@
       s = i->position;
     }
 
+  GCPRO2 (stuff, dest);
+
   while (! NILP (stuff))
     {
       res = Fcar (stuff);
@@ -1339,6 +1369,8 @@
       stuff = Fcdr (stuff);
     }
 
+  UNGCPRO;
+
   return modified ? Qt : Qnil;
 }