--- Begin Message ---
Subject: |
25.0.50; "Args out of range" with help-window-select t |
Date: |
Thu, 04 Jun 2015 21:47:08 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) |
From
./emacs -Q
Eval:
(progn
(setq help-window-select t
debug-on-error t)
(split-window)
(switch-to-buffer "*Messages*")
(message (make-string 9999 ?x)))
Hit: C-h f if RET
I get:
Debugger entered--Lisp error: (args-out-of-range 20077)
(no backtrace is shown).
We can however get a gdb backtrace (I put a breakpoint in Fsignal, but
it breaks more often than needed, so I say "continue" a few times in
order to get the following) :
#2 0x081ec7fe in xsignal1 (error_symbol=4392, arg=40270) at eval.c:1596
No locals.
#3 0x0824bd80 in get_char_property_and_overlay (position=40270, prop=8640,
object=140654805, overlay=0xbfffeec0) at textprop.c:636
noverlays = 22
overlay_vec = 0x20
obuf = 0x853b698
sa_avail = 22
sa_count = -1073746264
sa_must_free = 8
w = 0x8696cd0
#4 0x08163623 in adjust_point_for_property (last_pt=22, modified=true) at
keyboard.c:1704
beg = 139541880
end = -1073746216
val = 135666171
overlay = 0
tmp = -1073746216
check_composition = false
check_display = true
check_invisible = true
orig_pt = 10067
#5 0x081633b4 in command_loop_1 () at keyboard.c:1636
cmd = 1695712
keybuf = {34, 410, 0, 139555992, 0, 1, -1073745932, 143526584,
139555992, 0, 0, 0, -1073746040, 136237958, 2, 141273859, 3, 59, -1220163913,
141710811, 0, 2, 135640074, 141710811, -1073746008, 135668881,
141710811, 0, 0, -1073746008}
i = 2
prev_modiff = 10542
prev_buffer = 0x853b698
already_adjusted = false
#6 0x081ebfe8 in internal_condition_case (bfun=0x8162727 <command_loop_1>,
handlers=9288, hfun=0x8161f3d <cmd_error>) at eval.c:1348
val = -1073745960
c = 0x88f54f0
#7 0x08162449 in command_loop_2 (ignore=0) at keyboard.c:1139
val = 0
#8 0x081eb8f2 in internal_catch (tag=23016, func=0x816241e <command_loop_2>,
arg=0) at eval.c:1108
val = 23016
c = 0x88e0ac0
#9 0x081623e3 in command_loop () at keyboard.c:1118
No locals.
#10 0x08161b9c in recursive_edit_1 () at keyboard.c:728
count = 1
val = 136247918
#11 0x08161d0e in Frecursive_edit () at keyboard.c:799
count = 0
buffer = 0
#12 0x0815fcfa in main (argc=10, argv=0xbffff1f4) at emacs.c:1626
dummy = -1073745664
stack_bottom_variable = 8 '\b'
do_initial_setlocale = true
dumping = false
skip_args = 0
rlim = {rlim_cur = 8388608, rlim_max = 18446744073709551615}
no_loadup = false
junk = 0x0
dname_arg = 0x0
ch_to_dir = 0x0
original_pwd = 0x0
Looking at recent history shows that adjust_point_for_property was
touched recently :
Commit 18338b1dff981b17426048dfa20a4c6e6e12c5aa
Author: Eli Zaretskii <address@hidden>
AuthorDate: Tue May 19 18:39:25 2015 +0300
Commit: Eli Zaretskii <address@hidden>
CommitDate: Tue May 19 18:39:25 2015 +0300
Fix display of overlapping window-specific overlays
* src/keyboard.c (adjust_point_for_property): When adjusting point
due to display strings, ignore overlays that are specific to
windows other than the currently selected one.
* src/xdisp.c (handle_single_display_spec): If the display
property comes from an overlay, arrange for buffer iteration to
resume only after the end of that overlay. (Bug#20607)
I understand that
get_char_property_and_overlay
(make_number (PT), Qdisplay, selected_window,
&overlay))
should not refer to PT but to "PT in selected_window", but I don't know
how to do that.
--
Nico.
--- End Message ---
--- Begin Message ---
Subject: |
Re: bug#20734: 25.0.50; "Args out of range" with help-window-select t |
Date: |
Sat, 06 Jun 2015 10:44:26 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux) |
>> Ok. I think I understand now. What about adding an assertion to make
>> sure current_buffer is shown in selected_window at that point?
>
> That'd be fine with me.
I can suggest :
>From 52cd3204743442fc6d8fc281ed3d9b0b0e6a88e4 Mon Sep 17 00:00:00 2001
From: Nicolas Richard <address@hidden>
Date: Sat, 6 Jun 2015 10:05:07 +0200
Subject: [PATCH] Add assertion in adjust_point_for_property
* src/keyboard.c (adjust_point_for_property): Add eassert for
current buffer being shown in selected window.
---
src/keyboard.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/keyboard.c b/src/keyboard.c
index bedd10b..23f7ce7 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1687,6 +1687,8 @@ adjust_point_for_property (ptrdiff_t last_pt, bool
modified)
bool check_composition = ! modified, check_display = 1, check_invisible = 1;
ptrdiff_t orig_pt = PT;
+ eassert (XBUFFER (XWINDOW (selected_window)->contents) == current_buffer);
+
/* FIXME: cycling is probably not necessary because these properties
can't be usefully combined anyway. */
while (check_composition || check_display || check_invisible)
--
1.9.1
>> && EQ (XBUFFER (XWINDOW (selected_window)->contents), current_buffer)
> in that case, you don't need EQ, just use == to
> compare 2 C pointers.
Ok, I pushed that solution as d31cd49 and I mark the bug as done. Thanks
for your guidance.
--
Nico.
--- End Message ---