From c98da214420c9fd262e162f0e4678b1a4e1e1698 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Wed, 14 Dec 1994 14:23:04 +0000 Subject: [PATCH] (add_properties): Add gcpro's. (Fadd_text_properties, copy_text_properties): Likewise. --- src/textprop.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file 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; } -- 2.11.4.GIT