(Fsubstitute_command_keys): Handle case that a GC
in Fwhere_is_internal or get_keymap_1 relocates string contents.
This commit is contained in:
parent
64f26cf542
commit
11f9d6e1a3
1 changed files with 15 additions and 1 deletions
16
src/doc.c
16
src/doc.c
|
@ -648,10 +648,12 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
|
||||||
else if (strp[0] == '\\' && strp[1] == '[')
|
else if (strp[0] == '\\' && strp[1] == '[')
|
||||||
{
|
{
|
||||||
Lisp_Object firstkey;
|
Lisp_Object firstkey;
|
||||||
|
int start_idx;
|
||||||
|
|
||||||
changed = 1;
|
changed = 1;
|
||||||
strp += 2; /* skip \[ */
|
strp += 2; /* skip \[ */
|
||||||
start = strp;
|
start = strp;
|
||||||
|
start_idx = start - XSTRING (string)->data;
|
||||||
|
|
||||||
while ((strp - (unsigned char *) XSTRING (string)->data
|
while ((strp - (unsigned char *) XSTRING (string)->data
|
||||||
< STRING_BYTES (XSTRING (string)))
|
< STRING_BYTES (XSTRING (string)))
|
||||||
|
@ -664,7 +666,12 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
|
||||||
/* Save STRP in IDX. */
|
/* Save STRP in IDX. */
|
||||||
idx = strp - (unsigned char *) XSTRING (string)->data;
|
idx = strp - (unsigned char *) XSTRING (string)->data;
|
||||||
tem = Fintern (make_string (start, length_byte), Qnil);
|
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);
|
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
|
/* Disregard menu bar bindings; it is positively annoying to
|
||||||
mention them when there's no menu bar, and it isn't terribly
|
mention them when there's no menu bar, and it isn't terribly
|
||||||
|
@ -701,10 +708,12 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
|
||||||
else if (strp[0] == '\\' && (strp[1] == '{' || strp[1] == '<'))
|
else if (strp[0] == '\\' && (strp[1] == '{' || strp[1] == '<'))
|
||||||
{
|
{
|
||||||
struct buffer *oldbuf;
|
struct buffer *oldbuf;
|
||||||
|
int start_idx;
|
||||||
|
|
||||||
changed = 1;
|
changed = 1;
|
||||||
strp += 2; /* skip \{ or \< */
|
strp += 2; /* skip \{ or \< */
|
||||||
start = strp;
|
start = strp;
|
||||||
|
start_idx = start - XSTRING (string)->data;
|
||||||
|
|
||||||
while ((strp - (unsigned char *) XSTRING (string)->data
|
while ((strp - (unsigned char *) XSTRING (string)->data
|
||||||
< XSTRING (string)->size)
|
< XSTRING (string)->size)
|
||||||
|
@ -726,7 +735,12 @@ thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ int
|
||||||
{
|
{
|
||||||
tem = Fsymbol_value (name);
|
tem = Fsymbol_value (name);
|
||||||
if (! NILP (tem))
|
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. */
|
/* Now switch to a temp buffer. */
|
||||||
|
|
Loading…
Add table
Reference in a new issue