From: Eli Zaretskii <eliz@gnu.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>, Miles Bader <miles@gnu.org>
Cc: michael_heerdegen@web.de, 7587@debbugs.gnu.org
Subject: bug#7587: 23.2; `format-mode-line' makes Emacs crash
Date: Sat, 11 Dec 2010 00:40:14 +0200 [thread overview]
Message-ID: <83fwu51cc1.fsf@gnu.org> (raw)
In-Reply-To: <jwvhbel5p5z.fsf-monnier+emacs@gnu.org>
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: michael_heerdegen@web.de, 7587@debbugs.gnu.org
> Date: Fri, 10 Dec 2010 15:50:31 -0500
>
> > This happens because, for some reason I don't understand, when
> > face-remapping-alist is non-nil, lookup_basic_face insists on getting
> > only one of the basic faces, and otherwise aborts:
>
> I don't know anything about this code
Who does? Miles, do you?
> but the name `lookup_basic_face' suggests it only works for basic
> faces
Actually, it works for non-basic faces as well--but only if
face-remapping-alist is nil. See this part of it, which I cited:
if (NILP (Vface_remapping_alist))
return face_id; /* Nothing to do. */
The patch I suggest simply make lookup_basic_face behave consistently
regardless of the value of face-remapping-alist.
> so maybe the problem is that the function gets incorrectly called
> for a non-basic face.
It _does_ get called with a basic face (`mode-line'), but that face
has been remapped. Remapping actually creates a new face ID in the
face cache, but lookup_basic_face gets an ID (an integer), not a
symbol Qmode_line etc. So if the face ID that lookup_basic_face gets
is not one of the IDs reserved for the 12 basic faces, _and_
face-remapping-alist is non-nil, lookup_basic_face always pukes.
Here's more context about the chain of calls that leads to the crash:
The call to lookup_basic_face comes from init_iterator:
/* Perhaps remap BASE_FACE_ID to a user-specified alternative. */
if (! NILP (Vface_remapping_alist))
remapped_base_face_id = lookup_basic_face (XFRAME (w->frame), base_face_id);
init_iterator does this because it expects a truly basic face in
base_face_id, and it wants to use its face-remapped variety, as the
user would expect. But in this case, we pass to it an already
remapped basic face, see this part of format-mode-line:
if (!NILP (face))
{
if (EQ (face, Qt))
face = (EQ (window, selected_window) ? Qmode_line : Qmode_line_inactive);
face_id = lookup_named_face (XFRAME (WINDOW_FRAME (w)), face, 0);
}
...
init_iterator (&it, w, -1, -1, NULL, face_id);
lookup_named_face returns the face ID of the remapped mode-line face.
So in this case, face_id is already an ID of the remapped mode-line
face, and returning it unaltered from lookup_basic_face is TRT.
As an alternative, we could refrain from calling lookup_basic_face in
init_iterator if the argument base_face_id is not one of the 12 basic
face IDs.
next prev parent reply other threads:[~2010-12-10 22:40 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-07 21:01 bug#7587: 23.2; `format-mode-line' makes Emacs crash Michael Heerdegen
2010-12-10 16:02 ` Eli Zaretskii
2010-12-10 16:39 ` Eli Zaretskii
2010-12-10 20:50 ` Stefan Monnier
2010-12-10 22:40 ` Eli Zaretskii [this message]
2010-12-16 2:17 ` Chong Yidong
2010-12-16 4:39 ` Drew Adams
2010-12-16 5:37 ` Eli Zaretskii
2010-12-16 5:35 ` Eli Zaretskii
2010-12-18 8:56 ` Eli Zaretskii
2010-12-20 15:29 ` Chong Yidong
2010-12-20 18:33 ` Eli Zaretskii
2010-12-25 10:18 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83fwu51cc1.fsf@gnu.org \
--to=eliz@gnu.org \
--cc=7587@debbugs.gnu.org \
--cc=michael_heerdegen@web.de \
--cc=miles@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.