Subject: bug#22873: Can we support multiple Cursors?

From: Keith David Bershatsky <[email-masked]>
Date: Mon, 14 Mar 2016 11:35:18 -0700

Help, please:  :)

I reached a roadblock on Emacs for Windows and I haven't the slightest idea why my cached list of multiple cursors is being converted into a value `<optimized out>` sporadically when holding down the arrow key and moving the active cursor repetitively through plain text in a fundamental-mode buffer.  Emacs crashes in that circumstance.  The cache is a Lisp_Object pointer defined in `window.h` named mc_cache (aka `w->mc_cache`).  The value of `w->mc_cache` is:

  '((
    (3 hbar [1.0 0.0 0.0])
    (4 bar [0.0 1.0 0.0])
    (5 box [0.0 0.0 1.0])
    (6 hollow [0.8 0.4 0.2])
    (7 (hbar 3) [1.0 0.0 1.0])
    (8 (bar 3) [0.0 1.0 1.0]))
   (
    ((3 hbar [1.0 0.0 0.0]) (22 20 2 0))
    ((4 bar [0.0 1.0 0.0]) (33 20 3 0))
    ((5 box [0.0 0.0 1.0]) (44 20 4 0))
    ((6 hollow [0.8 0.4 0.2]) (55 20 5 0))
    ((7 (hbar 3) [1.0 0.0 1.0]) (66 20 6 0))
    ((8 (bar 3) [0.0 1.0 1.0]) (77 20 7 0))
    ))

The "for" loop looks like this and Emacs crashes when reading the line containing "cursor_spec_list = XCAR (XCAR (vlist))".  `cursor_spec_list` and `vlist` are both Lisp_Object:

   for (vlist = XCAR (XCDR (w->mc_cache));
        CONSP (vlist);
        vlist = XCDR (vlist))
     {
       cursor_spec_list = XCAR (XCAR (vlist));
       ***

Here is the gdb backtrace:

Administrator@lawlistf0aa /c/docume~1/administrator/desktop/emacs
$ gdb /c/docume~1/administrator/desktop/trunk/bin/emacs.exe
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from c:\docume~1\administrator\desktop\trunk\bin\emacs.exe...don
e.
(gdb) run
Starting program: c:/docume~1/administrator/desktop/trunk/bin/emacs.exe
[New Thread 1784.0x360]
[New Thread 1784.0x310]
[New Thread 1784.0x75c]
[New Thread 1784.0x1e8]
[New Thread 1784.0x3ec]

Program received signal SIGSEGV, Segmentation fault.
mc_calc (w=w@entry=0x55d24b8) at xdisp.c:29025
29025             cursor_spec_list = XCAR (XCAR (vlist));
(gdb) print vlist
$1 = -1006130013
(gdb) print cursor_spec_list
$2 = <optimized out>
(gdb) backtrace
#0  mc_calc (w=w@entry=0x55d24b8) at xdisp.c:29025
#1  0x010448db in display_and_set_cursor (w=w@entry=0x55d24b8,
    on=on@entry=true, hpos=57, vpos=17, x=627, y=345) at xdisp.c:29286
#2  0x011665e0 in x_update_window_end (w=0x55d24b8, cursor_on_p=true,
    mouse_face_overwritten_p=false) at w32term.c:686
#3  0x01005c13 in update_window (w=w@entry=0x55d24b8,
    force_p=<optimized out>, force_p@entry=true) at dispnew.c:3539
#4  0x01006e72 in update_window_tree (w=w@entry=0x55d24b8,
    force_p=force_p@entry=true) at dispnew.c:3217
#5  0x01009450 in update_frame (f=f@entry=0x55d2350, force_p=<optimized out>,
    force_p@entry=false, inhibit_hairy_id_p=inhibit_hairy_id_p@entry=false)
    at dispnew.c:3106
#6  0x0103ab20 in redisplay_internal () at xdisp.c:14142
#7  0x0103b9d8 in redisplay () at xdisp.c:13171
#8  0x010a3aed in read_char (commandflag=commandflag@entry=1,
    map=map@entry=136502483, prev_event=0,
    used_mouse_menu=used_mouse_menu@entry=0x82f8db,
    end_time=end_time@entry=0x0) at keyboard.c:2483
#9  0x010a6006 in read_key_sequence (keybuf=keybuf@entry=0x82f978,
    prompt=prompt@entry=0, dont_downcase_last=dont_downcase_last@entry=false,
    can_return_switch_frame=can_return_switch_frame@entry=true,
    fix_current_buffer=fix_current_buffer@entry=true,
    prevent_redisplay=prevent_redisplay@entry=false, bufsize=30)
    at keyboard.c:9066
#10 0x010a786f in command_loop_1 () at keyboard.c:1369
#11 0x010ff9e7 in internal_condition_case (
    bfun=bfun@entry=0x10a7697 <command_loop_1>,
    handlers=handlers@entry=12256, hfun=hfun@entry=0x109f644 <cmd_error>)
    at eval.c:1309
#12 0x0109b233 in command_loop_2 (ignore=0) at keyboard.c:1100
#13 0x010ff9ab in internal_catch (tag=tag@entry=32480,
    func=func@entry=0x109b214 <command_loop_2>, arg=arg@entry=0)
    at eval.c:1074
#14 0x0109b1f5 in command_loop () at keyboard.c:1079
#15 0x0109f2fc in recursive_edit_1 () at keyboard.c:685
#16 0x0109f58c in Frecursive_edit () at keyboard.c:756
#17 0x011b76fa in main (argc=<optimized out>, argv=0xa428b0) at emacs.c:1617
(gdb)

Thanks,

Keith