Mercurial > emacs
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; }