Mercurial > emacs
changeset 30154:f8e2064c56b1
(Fsubstitute_command_keys): Handle case that a GC
in Fwhere_is_internal or get_keymap_1 relocates string contents.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 11 Jul 2000 19:59:06 +0000 |
parents | 1eb41ec71ea5 |
children | 70b49546d0d0 |
files | src/doc.c |
diffstat | 1 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doc.c Tue Jul 11 19:58:43 2000 +0000 +++ b/src/doc.c Tue Jul 11 19:59:06 2000 +0000 @@ -648,10 +648,12 @@ else if (strp[0] == '\\' && strp[1] == '[') { Lisp_Object firstkey; + int start_idx; changed = 1; strp += 2; /* skip \[ */ start = strp; + start_idx = start - XSTRING (string)->data; while ((strp - (unsigned char *) XSTRING (string)->data < STRING_BYTES (XSTRING (string))) @@ -664,7 +666,12 @@ /* Save STRP in IDX. */ idx = strp - (unsigned char *) XSTRING (string)->data; tem = Fintern (make_string (start, length_byte), Qnil); + + /* Note the Fwhere_is_internal can GC, so we have to take + relocation of string contents into account. */ tem = Fwhere_is_internal (tem, keymap, Qt, Qnil); + strp = XSTRING (string)->data + idx; + start = XSTRING (string)->data + start_idx; /* Disregard menu bar bindings; it is positively annoying to mention them when there's no menu bar, and it isn't terribly @@ -701,10 +708,12 @@ else if (strp[0] == '\\' && (strp[1] == '{' || strp[1] == '<')) { struct buffer *oldbuf; + int start_idx; changed = 1; strp += 2; /* skip \{ or \< */ start = strp; + start_idx = start - XSTRING (string)->data; while ((strp - (unsigned char *) XSTRING (string)->data < XSTRING (string)->size) @@ -726,7 +735,12 @@ { tem = Fsymbol_value (name); if (! NILP (tem)) - tem = get_keymap_1 (tem, 0, 1); + { + tem = get_keymap_1 (tem, 0, 1); + /* Note that get_keymap_1 can GC. */ + strp = XSTRING (string)->data + idx; + start = XSTRING (string)->data + start_idx; + } } /* Now switch to a temp buffer. */