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.  */