GNU bug report logs - #11464
24.1.50; pos-visible-in-window-p returns a false positive with bidi text

Previous Next

Package: emacs;

Reported by: Ari Roponen <ari.roponen <at> gmail.com>

Date: Sun, 13 May 2012 15:56:01 UTC

Severity: normal

Found in version 24.1.50

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Ari Roponen <ari.roponen <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 11464 <at> debbugs.gnu.org, mwd <at> cert.org
Subject: bug#11464: 24.1.50; pos-visible-in-window-p returns a false positive with bidi text
Date: Fri, 18 May 2012 13:47:26 +0300
Eli Zaretskii <eliz <at> gnu.org> writes:

> And if that happens, the correction code below, viz.:
>
>       if (bottom_y <= it.last_visible_y
> 	  && it.bidi_p && it.bidi_it.scan_dir == -1
> 	  && IT_CHARPOS (it) < charpos)
>
> would evaluate to false, and visible_p would have stayed at its 1
> value, which is wrong.
>
> So could you please clarify this case?

Yes, pos_visible_p indeed returns incorrect value (1), but it is called
from Fpos_visible_in_window_p, which returns the correct value.  For
longer description, see below.

>
> Also, what was the value of top_y in your first case, i.e.:
>
>> bottom_y = 300
>> it.last_visible_y = 304

That case has the following values now (in emacs-24 rev. 108005):

bottom_y = 302
it.last_visible_y = 304
top_y = 285

I'm not sure why bottom_y has changed its value.  I guess that is
because I installed some new fonts.

>
> Again, sorry for bothering you with the details.  I just must
> understand what is going on here and where did I err in my original
> change.

No worries.  Here are some logs from my debugging sessions.  I don't
pretend to know the code, but this shows why the bug didn't happen in
the last case ("emacs -fn fixed").

I tried emacs-24 revision 108005, compiled with "-O0 -ggdb".

File bug.el contains this:

(progn
  (pop-to-buffer (get-buffer-create "test"))
  (erase-buffer)
  (dotimes (i (* 2 (window-height)))
    (insert "\u05d0\n"))		; HEBREW LETTER ALEF
  (insert "Last line\n")
  (goto-char (point-min))
  (insert "a")
  (message "Should be nil: %S" (pos-visible-in-window-p (point-max))))


The function pos_visible_p returns the incorrect value (1):

[src]$ gdb --quiet --args ./emacs -Q -fn fixed -l bug.el
Reading symbols from /usr/local/repos/bzr/emacs/emacs-24/src/emacs...done.
warning: File "/usr/local/repos/bzr/emacs/emacs-24/src/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "/usr/share/gdb/auto-load:/usr/lib/debug:/usr/bin/mono-gdb.py".
(gdb) source .gdbinit
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) [answered Y; input not from terminal]
DISPLAY = :0
TERM = xterm
Breakpoint 1 at 0x5623fd: file emacs.c, line 394.
Temporary breakpoint 2 at 0x588153: file sysdep.c, line 859.
(gdb) b xdisp.c:1311
Breakpoint 3 at 0x4311d1: file xdisp.c, line 1311.
(gdb) b xdisp.c:1566
Breakpoint 4 at 0x4324d2: file xdisp.c, line 1566.
(gdb) r
Starting program: /usr/local/repos/bzr/emacs/emacs-24/src/emacs -Q -fn fixed -l bug.el
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7fffe4578700 (LWP 28308)]
[New Thread 0x7fffe3d77700 (LWP 28309)]

Breakpoint 3, pos_visible_p (w=0x13dbd90, charpos=80, x=0x7fffffffb78c, y=
    0x7fffffffb788, rtop=0x7fffffffb79c, rbot=0x7fffffffb798, rowh=
    0x7fffffffb794, vpos=0x7fffffffb790) at xdisp.c:1312
1312	      if (top_y < window_top_y)
Missing separate debuginfos, use: debuginfo-install [...]
(gdb) p visible_p
$1 = 0
(gdb) n
1314	      else if (top_y < it.last_visible_y)
(gdb) 
1315		visible_p = 1;
(gdb) 
1316	      if (bottom_y <= it.last_visible_y
(gdb) 
1341	      if (visible_p)
(gdb) p visible_p
$2 = 1
(gdb) c
Continuing.

Breakpoint 4, pos_visible_p (w=0x13dbd90, charpos=80, x=0x7fffffffb78c, y=
    0x7fffffffb788, rtop=0x7fffffffb79c, rbot=0x7fffffffb798, rowh=
    0x7fffffffb794, vpos=0x7fffffffb790) at xdisp.c:1566
1566	  return visible_p;
(gdb) p visible_p
$3 = 1
(gdb)


The reason the test case works is that the function
Fpos_visible_in_window_p contains this:

  /* If position is above window start or outside buffer boundaries,
     or if window start is out of range, position is not visible.  */
  if ((EQ (pos, Qt)
       || (posint >= CHARPOS (top) && posint <= BUF_ZV (buf)))
      && CHARPOS (top) >= BUF_BEGV (buf)
      && CHARPOS (top) <= BUF_ZV (buf)
      && pos_visible_p (w, posint, &x, &y, &rtop, &rbot, &rowh, &vpos)
      && (fully_p = !rtop && !rbot, (!NILP (partially) || fully_p)))
    in_window = Qt;

Here pos_visible_p returns 1, but the next condition evaluates to false, since
(!NILP (partially) || fully_p) is false.

[src]$ gdb --quiet --args ./emacs -Q -fn fixed -l bug.el
Reading symbols from /usr/local/repos/bzr/emacs/emacs-24/src/emacs...done.
warning: File "/usr/local/repos/bzr/emacs/emacs-24/src/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "/usr/share/gdb/auto-load:/usr/lib/debug:/usr/bin/mono-gdb.py".
(gdb) source .gdbinit
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) [answered Y; input not from terminal]
DISPLAY = :0
TERM = xterm
Breakpoint 1 at 0x5623fd: file emacs.c, line 394.
Temporary breakpoint 2 at 0x588153: file sysdep.c, line 859.
(gdb) b Fpos_visible_in_window_p
Breakpoint 3 at 0x48a5db: file window.c, line 1431.
(gdb) r
Starting program: /usr/local/repos/bzr/emacs/emacs-24/src/emacs -Q -fn fixed -l bug.el
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7fffe4578700 (LWP 28471)]
[New Thread 0x7fffe3d77700 (LWP 28472)]

Breakpoint 3, Fpos_visible_in_window_p (pos=320, window=12763682, partially=
    12763682) at window.c:1431
1431	  Lisp_Object in_window = Qnil;
Missing separate debuginfos, use: debuginfo-install [..]
(gdb) n
1432	  int rtop, rbot, rowh, vpos, fully_p = 1;
(gdb) 
1435	  w = decode_window (window);
(gdb) 
1436	  buf = XBUFFER (w->buffer);
(gdb) 
1437	  SET_TEXT_POS_FROM_MARKER (top, w->start);
(gdb) 
1439	  if (EQ (pos, Qt))
(gdb) 
1441	  else if (!NILP (pos))
(gdb) 
1443	      CHECK_NUMBER_COERCE_MARKER (pos);
(gdb) 
1444	      posint = XINT (pos);
(gdb) 
1453	  if ((EQ (pos, Qt)
(gdb) 
1454	       || (posint >= CHARPOS (top) && posint <= BUF_ZV (buf)))
(gdb) 
1455	      && CHARPOS (top) >= BUF_BEGV (buf)
(gdb) 
1456	      && CHARPOS (top) <= BUF_ZV (buf)
(gdb) 
1457	      && pos_visible_p (w, posint, &x, &y, &rtop, &rbot, &rowh, &vpos)
(gdb) 
1458	      && (fully_p = !rtop && !rbot, (!NILP (partially) || fully_p)))
(gdb) 
1461	  if (!NILP (in_window) && !NILP (partially))
(gdb) xprintsym in_window
"nil"(gdb) p fully_p
$1 = 0
(gdb) xprintsym partially
"nil"(gdb) n
1471	  return in_window;
(gdb) 

-- 
Ari Roponen




This bug report was last modified 13 years and 56 days ago.

Previous Next


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