Subject: NS Emacs crashing (since stipples?)

From: Ship Mints <[email-masked]>
Date: Sat, 31 May 2025 17:46:11 -0400

I'm thinking it might have been this (I cc'd Ben)
commit 9cbbdcee132588a11dc03c3da371176aaa13927c it's the only one that
looks relevant.  That said, it is possible I'm tickling a bug that's been
there longer.

I pulled a master today and recompiled from clean and it still happens.
It's a bit spurious, but regular over the last few days.  There are no
stipples used in the buffer in question, so this looks like a side effect
of that change, I'm guessing.  There are specified spaces in the body of
the buffer and also in the header-line that are "stretch" glyphs.

This comes up as I go through a battery of tests for the revised vtable
that has image content in a test jig and with multiple vtables sharing the
same buffer (I doubt that has any bearing).

I will try to see if I can reproduce without images if that indicates
anything.

$ uname -a

Darwin host.local 21.6.0 Darwin Kernel Version 21.6.0: Mon Jun 24 00:56:10
PDT 2024; root:xnu-8020.240.18.709.2~1/RELEASE_X86_64 x86_64

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS
(code=1, address=0xa8)
  * frame #0: 0x00000001000e79bb
emacs`prepare_face_for_display(f=0x0000000102f41b70,
face=0x0000000000000000) at xfaces.c:4657:16 [opt]
    frame #1: 0x000000010025d599
emacs`ns_draw_stretch_glyph_string(s=0x00007ff7bfef9eb0) at nsterm.m:4176:8
[opt]
    frame #2: 0x000000010025a532
emacs`ns_draw_glyph_string(s=0x00007ff7bfef9eb0) at nsterm.m:4571:7 [opt]
    frame #3: 0x000000010004bab4 emacs`draw_glyphs(w=0x0000000112f01140,
x=917, row=<unavailable>, area=TEXT_AREA, start=<unavailable>,
end=<unavailable>, hl=DRAW_CURSOR, overlaps=0) at xdisp.c:31666:5 [opt]
    frame #4: 0x00000001000501d1
emacs`draw_phys_cursor_glyph(w=0x0000000112f01140, row=0x0000000181f1e100,
hl=DRAW_CURSOR) at xdisp.c:34369:12 [opt]
    frame #5: 0x000000010025c091
emacs`ns_draw_window_cursor(w=0x0000000112f01140,
glyph_row=0x0000000181f1e100, x=<unavailable>, y=<unavailable>,
cursor_type=<unavailable>, cursor_width=<unavailable>, on_p=<unavailable>,
active_p=true) at nsterm.m:3126:7 [opt]
    frame #6: 0x0000000100050d78
emacs`display_and_set_cursor(w=0x0000000112f01140, on=true, hpos=0, vpos=1,
x=0, y=21) at xdisp.c:34637:5 [opt]
    frame #7: 0x000000010000b71b
emacs`gui_update_window_end(w=0x0000000112f01140, cursor_on_p=true,
mouse_face_overwritten_p=true) at dispnew.c:4653:2 [opt]
    frame #8: 0x000000010000a931 emacs`update_window(w=<unavailable>) at
dispnew.c:4587:3 [opt]
    frame #9: 0x000000010000effc
emacs`update_window_tree(w=0x0000000112f01140) at dispnew.c:4234:2 [opt]
    frame #10: 0x000000010000efbe
emacs`update_window_tree(w=0x0000000113224260) at dispnew.c:4232:2 [opt]
    frame #11: 0x0000000100009257 emacs`update_frame [inlined]
update_window_frame(f=0x0000000102f41b70) at dispnew.c:3866:3 [opt]
    frame #12: 0x00000001000091e3 emacs`update_frame(f=0x0000000102f41b70,
inhibit_scrolling=<unavailable>) at dispnew.c:4118:5 [opt]
    frame #13: 0x0000000100037573 emacs`redisplay_internal at
xdisp.c:17736:5 [opt]
    frame #14: 0x000000010003d0b6
emacs`redisplay_preserve_echo_area(from_where=9) at xdisp.c:18001:5 [opt]
    frame #15: 0x00000001001eed97
emacs`wait_reading_process_output(time_limit=<unavailable>, nsecs=0,
read_kbd=<unavailable>, do_display=true, wait_for_cell=0x0000000000000000,
wait_proc=0x0000000000000000, just_wait_proc=0) at process.c:5457:3 [opt]
    frame #16: 0x000000010000ca35 emacs`sit_for(timeout=<unavailable>,
reading=true, display_option=1) at dispnew.c:6979:7 [opt]
    frame #17: 0x00000001000fefd1 emacs`read_char(commandflag=1,
map=0x000000010f3b77c3, prev_event=0x0000000000000000,
used_mouse_menu=0x00007ff7bfefc46f, end_time=0x0000000000000000) at
keyboard.c:2925:11 [opt]
    frame #18: 0x00000001000fb4b4
emacs`read_key_sequence(keybuf=0x00007ff7bfefc560, prompt=<unavailable>,
dont_downcase_last=false, can_return_switch_frame=true,
fix_current_buffer=true, prevent_redisplay=<unavailable>,
disable_text_conversion_p=<unavailable>) at keyboard.c:10848:12 [opt]
    frame #19: 0x00000001000f9529 emacs`command_loop_1 at
keyboard.c:1424:15 [opt]
    frame #20: 0x000000010019197b
emacs`internal_condition_case(bfun=(emacs`command_loop_1 at
keyboard.c:1319), handlers=0x0000000000000090, hfun=(emacs`cmd_error at
keyboard.c:965)) at eval.c:1684:25 [opt]
    frame #21: 0x00000001000f915e
emacs`command_loop_2(handlers=0x0000000000000090) at keyboard.c:1163:11
[opt]
    frame #22: 0x0000000100190e4f
emacs`internal_catch(tag=0x0000000000011ac0, func=(emacs`command_loop_2 at
keyboard.c:1159), arg=0x0000000000000090) at eval.c:1364:25 [opt]
    frame #23: 0x0000000100288a58 emacs`command_loop.cold.1 at
keyboard.c:1141:2 [opt]
    frame #24: 0x00000001000f89d4 emacs`command_loop at keyboard.c:1138:5
[opt]
    frame #25: 0x00000001000f889f emacs`recursive_edit_1 at
keyboard.c:749:9 [opt]
    frame #26: 0x00000001000f8b40 emacs`Frecursive_edit at keyboard.c:832:3
[opt]
    frame #27: 0x00000001000f79dd emacs`main(argc=<unavailable>,
argv=0x00007ff7bfefcae0) at emacs.c:2582:3 [opt]
    frame #28: 0x00000001004d152e dyld`start + 462

-Stephane