GNU bug report logs - #7728
24.0.50; GDB backtrace from abort

Previous Next

Package: emacs;

Reported by: "Drew Adams" <drew.adams <at> oracle.com>

Date: Fri, 24 Dec 2010 16:51:02 UTC

Severity: normal

Found in version 24.0.50

Done: Chong Yidong <cyd <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #44 received at 7728 <at> debbugs.gnu.org (full text, mbox):

From: martin rudalics <rudalics <at> gmx.at>
To: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 7728 <at> debbugs.gnu.org
Subject: Re: bug#7728: 24.0.50; GDB backtrace from abort
Date: Wed, 12 Jan 2011 08:54:17 +0100
>>  2) Change the code of Fset_window_configuration and Fselect_window,
>>     to have some other way of preventing the latter from storing point
>>     in the old selected window, without setting selected_window to
>>     nil.
>
> That sounds like a better solution.  E.g. move the code of
> Fselect_window to another function, add a third argument to it
> specifying whether to swap-out point in selected_window, and make
> Fset_window_configuration call that new internal function.

The

      /* Store the current buffer's actual point into the
	 old selected window.  It belongs to that window,
	 and when the window is not selected, must be in the window.  */
      if (!NILP (selected_window))
	{
	  ow = XWINDOW (selected_window);
	  if (! NILP (ow->buffer))
	    ...

part of Fselect_window should be executed _before_ the

      sf = SELECTED_FRAME ();
      if (XFRAME (WINDOW_FRAME (w)) != sf)
	{
	  ...

part, so the selected window would have been already set.  Unfortunately
this would make not_selected_before false when Fselect_window is called
back by Fselect_frame and the remaining parts of Fselect_window starting
with

  Fset_buffer (w->buffer);

  if (NILP (norecord))
  ...

would not get executed in that case.  Probably, there should be a common
subroutine of Fselect_window and Fselect_frame such that the two won't
have to call each other mutually.  (That common subroutine would have to
be robust in the sense that it can't call back neither Fselect_frame nor
Fselect_window.)

> But maybe Fselect_frame should simply not be run in this case.

If I understand Eli's backtrace correctly, the problem was caused within
the following part of Fset_window_configuration

      selected_window = Qnil;

      /* Arrange *not* to restore point in the buffer that was
	 current when the window configuration was saved.  */
      if (EQ (XWINDOW (data->current_window)->buffer, new_current_buffer))
	set_marker_restricted (XWINDOW (data->current_window)->pointm,
			       make_number (old_point),
			       XWINDOW (data->current_window)->buffer);

      Fselect_window (data->current_window, Qnil);

so apparently the frame of data->current_window is _not_ the selected
frame.  Would you select the window and keep the old frame selected?

martin




This bug report was last modified 12 years and 357 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.