Subject: Re: bug#38038: 27.0.50; Emacs freezes opening tabs.

From: martin rudalics <[email-masked]>
Date: Sat, 9 Nov 2019 09:09:13 +0100

> I removed the actual call in extend_face_to_end_of_line to merge_face
 > and the issue is still there. And it is actually the only place where
 > the :extend attribute is used now; the rest of the code does pretty much
 > the same than before.
 >
 > Just in case:
 >
 > I also made a rebase locally and removed all the commits related with
 > the extend attribute and the issue is still there. So it seems not be
 > related at all with the extend attribute...
 >
 > Any help here?. I am out of ideas. (and I don't have a clue about gc).

Thank you for all the work.  The most interesting aspect is that here it
neither hangs with

(set-face-attribute 'default nil :box t)
(set-face-attribute 'default nil :strike-through t)
(set-face-attribute 'default nil :overline t)

but definitely hangs with

(set-face-attribute 'tool-bar nil :underline t)

So what's so special about underline and the tool bar (or tab bar)?

Here on Windows the latter form hangs on line 2516 of w32term.c

		  Lisp_Object val
		    = buffer_local_value (Qunderline_minimum_offset,
		                          s->w->contents);

which continuously tries to signal an error with the backtrace

#0  xsignal2 (error_symbol=XIL(0xfd80), arg1=XIL(0x32d0), arg2=XIL(0)) at ../../src/eval.c:1713
#1  0x00000004002dcaa5 in wrong_type_argument (predicate=XIL(0x32d0), value=XIL(0)) at ../../src/data.c:155
#2  0x00000004001f82cb in CHECK_BUFFER (x=XIL(0)) at ../../src/buffer.h:707
#3  0x00000004001fed5c in buffer_local_value (variable=XIL(0xe670), buffer=XIL(0)) at ../../src/buffer.c:1205
#4  0x000000040049c84f in w32_draw_glyph_string (s=0xbfd2c0) at ../../src/w32term.c:2516
#5  0x00000004000adaba in draw_glyphs (w=0x5eba170, x=372, row=0x76248d0, area=TEXT_AREA, start=0, end=13, hl=DRAW_NORMAL_TEXT, overlaps=0) at ../../src/xdisp.c:28447
#6  0x00000004000b55a0 in gui_write_glyphs (w=0x5eba170, updated_row=0x76248d0, start=0x76f2ad0, updated_area=TEXT_AREA, len=13) at ../../src/xdisp.c:30474
#7  0x0000000400012021 in update_text_area (w=0x5eba170, updated_row=0x76248d0, vpos=0) at ../../src/dispnew.c:3832
#8  0x0000000400012b20 in update_window_line (w=0x5eba170, vpos=0, mouse_face_overwritten_p=0xbfd857) at ../../src/dispnew.c:4075
#9  0x00000004000115ab in update_window (w=0x5eba170, force_p=true) at ../../src/dispnew.c:3604
#10 0x0000000400010644 in update_frame (f=0x766c710, force_p=true, inhibit_hairy_id_p=false) at ../../src/dispnew.c:3206
#11 0x000000040007b0de in redisplay_internal () at ../../src/xdisp.c:15669
#12 0x0000000400078750 in redisplay () at ../../src/xdisp.c:14816
#13 0x00000004001b5665 in read_char (commandflag=1, map=XIL(0x770e293), prev_event=XIL(0), used_mouse_menu=0xbff25f, end_time=0x0) at ../../src/keyboard.c:2488
#14 0x00000004001c8842 in read_key_sequence (keybuf=0xbff490, prompt=XIL(0), dont_downcase_last=false, can_return_switch_frame=true, fix_current_buffer=true, prevent_redisplay=false) at ../../src/keyboard.c:9536
#15 0x00000004001b1dff in command_loop_1 () at ../../src/keyboard.c:1345
#16 0x00000004003194ef in internal_condition_case (bfun=0x4001b18e8 <command_loop_1>, handlers=XIL(0x90), hfun=0x4001b0d29 <cmd_error>) at ../../src/eval.c:1355
#17 0x00000004001b145e in command_loop_2 (ignore=XIL(0)) at ../../src/keyboard.c:1091
#18 0x0000000400318944 in internal_catch (tag=XIL(0xdfe0), func=0x4001b142c <command_loop_2>, arg=XIL(0)) at ../../src/eval.c:1116
#19 0x00000004001b13b4 in command_loop () at ../../src/keyboard.c:1070
#20 0x0000000000000000 in ?? ()

where frame #3 indicates that we probably should avoid asking for a buffer
local value in a pseudo window.  Right?

martin