* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
@ 2022-08-13 16:17 Andrea Greselin
2022-08-13 17:30 ` Eli Zaretskii
0 siblings, 1 reply; 10+ messages in thread
From: Andrea Greselin @ 2022-08-13 16:17 UTC (permalink / raw)
To: 57179
[-- Attachment #1: Type: text/plain, Size: 5294 bytes --]
Hi all,
I have this function (the part at issue here should be the first
line):
(defun my-recenter-after-jump (window _window-start-after)
"Recenter the point after a non-scroll command brings it out of view.
This function is meant to be called from the hook
‘window-scroll-functions’."
(with-selected-window window
(unless (or (> 0.001 (float-time (time-subtract (current-time)
buffer-display-time))) ; Don’t run this function after a change of buffer.
Non-nil here means the selected window displayed the current buffer less
than a thousandth of a second ago, so it was most likely a change of buffer
that triggered ‘window-scroll-functions’, not a scroll. See also
https://emacs.stackexchange.com/questions/63558/how-to-distinguish-a-scroll-from-a-change-of-buffer-in-a-function-called-from-w
;; Don’t recenter for these
;; - major modes
(memq major-mode '(help-mode ;
‘my-recenter-after-jump’ breaks scrolling with SPC/<backspace>
in Help mode and Info mode because they don’t obey
‘scroll-preserve-screen-position’ and ‘scroll-error-top-bottom’.
Info-mode))
;; - minor modes
isearch-mode ;
For Isearch, change the value of ‘scroll-conservatively’ and
‘hscroll-step’ in ‘isearch-update-post-hook’ and ‘isearch-mode-end-hook’.
Doing so allows recentering the point even after a purely horizontal scroll.
(bound-and-true-p view-mode) ;
‘my-recenter-after-jump’ breaks scrolling with SPC/<backspace>
in View mode because View mode doesn’t obey
‘scroll-preserve-screen-position’ and ‘scroll-error-top-bottom’.
(bound-and-true-p follow-mode)
;; - commands
(and (symbolp last-command) (get last-command
'scroll-command)) ; Don’t check the value of the ‘scroll-command’ property
for anonymous commands (it can’t be t anyway).
(memq last-command '(recenter-top-bottom
query-replace query-replace-regexp
; Query replacement is taken care of by the ‘recentering-on-jump’
advice to ‘perform-replace’, which allows recentering the point after a
purely horizontal scroll.
previous-line next-line ;
Don’t let these commands trigger ‘my-recenter-after-jump’. It
happens when Emacs has a moment of lag during which the point slips beyond
the scroll margin.
previous-logical-line
next-logical-line)))
(let* ((bottom-line-before (line-number-at-pos (window-end)))
(bottom-line-after (line-number-at-pos (window-end nil
'update))) ; NB: ‘window-start’ doesn’t take the ‘update’ argument.
(vertical-displacement (- bottom-line-after
bottom-line-before)))
(unless (> 2 (abs vertical-displacement)) ; The purpose of
having the first ‘unless’ separate from this one is to call
‘line-number-at-pos’ only when it’s needed, because it can be slow. See (2
links)
https://emacs.stackexchange.com/questions/51648/how-to-detect-the-number-of-lines-scrolled-from-scroll-up-down/51664#51664,
https://emacs.stackexchange.com/questions/3821/a-faster-method-to-obtain-line-number-at-pos-in-large-buffers
(recenter)
(when truncate-lines
(my-horizontal-recenter))))))) ; REVIEW: Isn’t there a
built-in function for recentering the point horizontally?
which I call from `window-scroll-functions` like this
(add-hook 'window-scroll-functions #'my-recenter-after-jump)
It's worked until I upgraded from v. 28.1 (from Fedora’s repos) to
29.0.50 (commit 6de88b6b02). Now I get
Error in window-scroll-functions (my-recenter-after-jump):
(wrong-number-of-arguments (lambda (window _window-start-after) "Recenter
the point after a non-scroll command brings it out of view.
This function is meant to be called from the hook
‘window-scroll-functions’." (let ((save-selected-window--state
(internal--before-with-selected-window window))) (save-current-buffer
(unwind-protect (progn (select-window (car save-selected-window--state)
'norecord) (if (or (> 0.001 (float-time (time-subtract (current-time)
buffer-display-time))) (memq major-mode '(help-mode Info-mode))
isearch-mode (and (boundp 'view-mode) view-mode) (and (boundp 'follow-mode)
follow-mode) (and (symbolp last-command) (get last-command
'scroll-command)) (memq last-command '(recenter-top-bottom query-replace
query-replace-regexp previous-line next-line previous-logical-line
next-logical-line))) nil (let* ((bottom-line-before (line-number-at-pos
(window-end))) (bottom-line-after (line-number-at-pos (window-end nil
'update))) (vertical-displacement (- bottom-line-after
bottom-line-before))) (if (> 2 (abs vertical-displacement)) nil (recenter)
(if truncate-lines (progn (my-horizontal-recenter)))))))
(internal--after-with-selected-window save-selected-window--state))))) 0)
All the best,
Andrea
[-- Attachment #2: Type: text/html, Size: 6326 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-13 16:17 bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions' Andrea Greselin
@ 2022-08-13 17:30 ` Eli Zaretskii
2022-08-13 20:50 ` Michael Heerdegen
2022-08-13 23:07 ` Andrea Greselin
0 siblings, 2 replies; 10+ messages in thread
From: Eli Zaretskii @ 2022-08-13 17:30 UTC (permalink / raw)
To: Andrea Greselin; +Cc: 57179
> From: Andrea Greselin <greselin.andrea@gmail.com>
> Date: Sat, 13 Aug 2022 18:17:54 +0200
>
> It's worked until I upgraded from v. 28.1 (from Fedora’s repos) to
> 29.0.50 (commit 6de88b6b02). Now I get
>
> Error in window-scroll-functions (my-recenter-after-jump):
> (wrong-number-of-arguments (lambda (window _window-start-after) "Recenter
> the point after a non-scroll command brings it out of view.
> This function is meant to be called from the hook
> ‘window-scroll-functions’." (let ((save-selected-window--state
> (internal--before-with-selected-window window))) (save-current-buffer
> (unwind-protect (progn (select-window (car save-selected-window--state)
The backtrace seems to show that a function that is called is
different from the one you show as your hook function. So I think you
should look closer into how you set up window-scroll-functions.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-13 17:30 ` Eli Zaretskii
@ 2022-08-13 20:50 ` Michael Heerdegen
2022-08-14 0:19 ` Michael Heerdegen
2022-08-15 12:24 ` Alan Mackenzie
2022-08-13 23:07 ` Andrea Greselin
1 sibling, 2 replies; 10+ messages in thread
From: Michael Heerdegen @ 2022-08-13 20:50 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Andrea Greselin, 57179
Eli Zaretskii <eliz@gnu.org> writes:
> The backtrace seems to show that a function that is called is
> different from the one you show as your hook function. So I think you
> should look closer into how you set up window-scroll-functions.
I too have seen this problem just yesterday. There must be something
going on, it is unlikely that this is a coincidence.
In the backtrace I saw that the function had been called by name with
zero arguments. But on top of the backtrace the symbol-function had
been shown (a closure). I also wondered about that.
I verified that the function was only accessible via
`window-scroll-functions'. My code did not use the function in any
other place.
Some entries below in the backtrace was `redisplay' - so... somehow
`redisplay' is sometimes calling functions in `window-scroll-functions'
with zero arguments. Maybe the buffer local binding of
`window-scroll-functions'.
Please tell whether this information suffices and you already have some
idea or if I should try to create a recipe. I guess this must be
related to a recent change from within the last few days.
Michael.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-13 17:30 ` Eli Zaretskii
2022-08-13 20:50 ` Michael Heerdegen
@ 2022-08-13 23:07 ` Andrea Greselin
1 sibling, 0 replies; 10+ messages in thread
From: Andrea Greselin @ 2022-08-13 23:07 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 57179
[-- Attachment #1: Type: text/plain, Size: 388 bytes --]
On Sat, 13 Aug 2022 at 19:30, Eli Zaretskii <eliz@gnu.org> wrote:
>
> > The backtrace seems to show that a function that is called is
> > different from the one you show as your hook function. So I think you
> > should look closer into how you set up window-scroll-functions.
>
‘my-recenter-after-jump’ is the only thing I add to
‘window-scroll-functions’.
Andrea
[-- Attachment #2: Type: text/html, Size: 708 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-13 20:50 ` Michael Heerdegen
@ 2022-08-14 0:19 ` Michael Heerdegen
2022-08-14 7:18 ` Eli Zaretskii
2022-08-14 13:22 ` Alan Mackenzie
2022-08-15 12:24 ` Alan Mackenzie
1 sibling, 2 replies; 10+ messages in thread
From: Michael Heerdegen @ 2022-08-14 0:19 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Alan Mackenzie, Andrea Greselin, 57179
[-- Attachment #1: Type: text/plain, Size: 420 bytes --]
Michael Heerdegen <michael_heerdegen@web.de> writes:
> Please tell whether this information suffices and you already have some
> idea or if I should try to create a recipe. I guess this must be
> related to a recent change from within the last few days.
Reverting a part of
48215c41d1 New debugging facility: backtraces from errors in Lisp called
from redisplay (Alan Mackenzie <acm@muc.de> 2022-08-11)
like this:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Test-for-57179.patch --]
[-- Type: text/x-diff, Size: 944 bytes --]
From ffb7c3d558b599bcc84f1bf4fb4388569892d927 Mon Sep 17 00:00:00 2001
From: Michael Heerdegen <michael_heerdegen@web.de>
Date: Sun, 14 Aug 2022 02:14:58 +0200
Subject: [PATCH] Test for #57179
---
src/xdisp.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/xdisp.c b/src/xdisp.c
index 719b131baa..47eaddabce 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -18221,8 +18221,8 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp)
{
specpdl_ref count = SPECPDL_INDEX ();
specbind (Qinhibit_quit, Qt);
- safe_run_hooks_2
- (Qwindow_scroll_functions, window, make_fixnum (CHARPOS (startp)));
+ run_hook_with_args_2 (Qwindow_scroll_functions, window,
+ make_fixnum (CHARPOS (startp)));
unbind_to (count, Qnil);
SET_TEXT_POS_FROM_MARKER (startp, w->start);
/* In case the hook functions switch buffers. */
--
2.30.2
[-- Attachment #3: Type: text/plain, Size: 106 bytes --]
seems to fix my incarnation of this problem. Can it be that? CC'ing
Alan (the author).
TIA,
Michael.
^ permalink raw reply related [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-14 0:19 ` Michael Heerdegen
@ 2022-08-14 7:18 ` Eli Zaretskii
2022-08-14 13:22 ` Alan Mackenzie
1 sibling, 0 replies; 10+ messages in thread
From: Eli Zaretskii @ 2022-08-14 7:18 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: acm, greselin.andrea, 57179
> From: Michael Heerdegen <michael_heerdegen@web.de>
> Cc: Andrea Greselin <greselin.andrea@gmail.com>, 57179@debbugs.gnu.org,
> Alan Mackenzie <acm@muc.de>
> Date: Sun, 14 Aug 2022 02:19:31 +0200
>
> Michael Heerdegen <michael_heerdegen@web.de> writes:
>
> > Please tell whether this information suffices and you already have some
> > idea or if I should try to create a recipe. I guess this must be
> > related to a recent change from within the last few days.
>
> Reverting a part of
>
> 48215c41d1 New debugging facility: backtraces from errors in Lisp called
> from redisplay (Alan Mackenzie <acm@muc.de> 2022-08-11)
Indeed, the new function safe_run_hooks_2 has a bug. In a build with
enable-checking I get an assertion violation in safe_run_hook_funcall,
because nargs is not 2 but 4.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-14 0:19 ` Michael Heerdegen
2022-08-14 7:18 ` Eli Zaretskii
@ 2022-08-14 13:22 ` Alan Mackenzie
2022-08-14 23:00 ` Michael Heerdegen
2022-08-15 9:42 ` Andrea Greselin
1 sibling, 2 replies; 10+ messages in thread
From: Alan Mackenzie @ 2022-08-14 13:22 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: acm, Eli Zaretskii, 57179, Andrea Greselin
Hello, Michael and Andrea.
On Sun, Aug 14, 2022 at 02:19:31 +0200, Michael Heerdegen wrote:
> Michael Heerdegen <michael_heerdegen@web.de> writes:
> > Please tell whether this information suffices and you already have some
> > idea or if I should try to create a recipe. I guess this must be
> > related to a recent change from within the last few days.
> Reverting a part of
> 48215c41d1 New debugging facility: backtraces from errors in Lisp called
> from redisplay (Alan Mackenzie <acm@muc.de> 2022-08-11)
> like this:
> From ffb7c3d558b599bcc84f1bf4fb4388569892d927 Mon Sep 17 00:00:00 2001
> From: Michael Heerdegen <michael_heerdegen@web.de>
> Date: Sun, 14 Aug 2022 02:14:58 +0200
> Subject: [PATCH] Test for #57179
>
> ---
> src/xdisp.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/src/xdisp.c b/src/xdisp.c
> index 719b131baa..47eaddabce 100644
> --- a/src/xdisp.c
> +++ b/src/xdisp.c
> @@ -18221,8 +18221,8 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp)
> {
> specpdl_ref count = SPECPDL_INDEX ();
> specbind (Qinhibit_quit, Qt);
> - safe_run_hooks_2
> - (Qwindow_scroll_functions, window, make_fixnum (CHARPOS (startp)));
> + run_hook_with_args_2 (Qwindow_scroll_functions, window,
> + make_fixnum (CHARPOS (startp)));
> unbind_to (count, Qnil);
> SET_TEXT_POS_FROM_MARKER (startp, w->start);
> /* In case the hook functions switch buffers. */
> --
> 2.30.2
>
> seems to fix my incarnation of this problem. Can it be that? CC'ing
> Alan (the author).
Yes, this was indeed the problem. Can I ask you please, instead of
applying your patch (above) to try out the following patch, which works
for me.
Thanks!
diff --git a/src/keyboard.c b/src/keyboard.c
index 8a2b7d58c4..1d7125a0a3 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1832,8 +1832,16 @@ adjust_point_for_property (ptrdiff_t last_pt, bool modified)
static Lisp_Object
safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs == 2);
- return call0 (args[1]);
+ eassert (nargs >= 2 && nargs <= 4);
+ switch (nargs)
+ {
+ case 2:
+ return call0 (args[1]);
+ case 3:
+ return call1 (args[1], args[2]);
+ default:
+ return call2 (args[1], args[2], args[3]);
+ }
}
/* Subroutine for safe_run_hooks: handle an error by clearing out the function
@@ -1878,11 +1886,27 @@ safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
static Lisp_Object
safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs == 2);
+ eassert (nargs >= 2 && nargs <= 4);
/* Yes, run_hook_with_args works with args in the other order. */
- internal_condition_case_n (safe_run_hooks_1,
- 2, ((Lisp_Object []) {args[1], args[0]}),
- Qt, safe_run_hooks_error);
+ switch (nargs)
+ {
+ case 2:
+ internal_condition_case_n (safe_run_hooks_1,
+ 2, ((Lisp_Object []) {args[1], args[0]}),
+ Qt, safe_run_hooks_error);
+ break;
+ case 3:
+ internal_condition_case_n (safe_run_hooks_1,
+ 3, ((Lisp_Object []) {args[1], args[0], args[2]}),
+ Qt, safe_run_hooks_error);
+ break;
+ default:
+ internal_condition_case_n (safe_run_hooks_1,
+ 4, ((Lisp_Object [])
+ {args[1], args[0], args[2], args[3]}),
+ Qt, safe_run_hooks_error);
+ break;
+ }
return Qnil;
}
> TIA,
> Michael.
--
Alan Mackenzie (Nuremberg, Germany).
^ permalink raw reply related [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-14 13:22 ` Alan Mackenzie
@ 2022-08-14 23:00 ` Michael Heerdegen
2022-08-15 9:42 ` Andrea Greselin
1 sibling, 0 replies; 10+ messages in thread
From: Michael Heerdegen @ 2022-08-14 23:00 UTC (permalink / raw)
To: Alan Mackenzie; +Cc: Eli Zaretskii, 57179, Andrea Greselin
Alan Mackenzie <acm@muc.de> writes:
> Hello, Michael and Andrea.
> [patch...]
Thanks. Yes, seems my case is fixed, and I didn't see any new problems
so far.
Michael.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-14 13:22 ` Alan Mackenzie
2022-08-14 23:00 ` Michael Heerdegen
@ 2022-08-15 9:42 ` Andrea Greselin
1 sibling, 0 replies; 10+ messages in thread
From: Andrea Greselin @ 2022-08-15 9:42 UTC (permalink / raw)
To: Alan Mackenzie; +Cc: Michael Heerdegen, Eli Zaretskii, 57179
[-- Attachment #1: Type: text/plain, Size: 219 bytes --]
On Sun, 14 Aug 2022 at 15:22, Alan Mackenzie <acm@muc.de> wrote:
> > Can I ask you please, instead of applying your patch (above) to try
> > out the following patch, which works for me.
>
It fixes my bug too.
Andrea
[-- Attachment #2: Type: text/html, Size: 567 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions'
2022-08-13 20:50 ` Michael Heerdegen
2022-08-14 0:19 ` Michael Heerdegen
@ 2022-08-15 12:24 ` Alan Mackenzie
1 sibling, 0 replies; 10+ messages in thread
From: Alan Mackenzie @ 2022-08-15 12:24 UTC (permalink / raw)
To: Michael Heerdegen, Andrea Greselin; +Cc: Eli Zaretskii, 57179-done
Hello, Michael and Andrea.
Thanks for testing my patch. I have just committed the patch to master,
and I am closing the bug with this post.
On Sat, Aug 13, 2022 at 22:50:47 +0200, Michael Heerdegen wrote:
> Eli Zaretskii <eliz@gnu.org> writes:
> > The backtrace seems to show that a function that is called is
> > different from the one you show as your hook function. So I think you
> > should look closer into how you set up window-scroll-functions.
> I too have seen this problem just yesterday. There must be something
> going on, it is unlikely that this is a coincidence.
> In the backtrace I saw that the function had been called by name with
> zero arguments. But on top of the backtrace the symbol-function had
> been shown (a closure). I also wondered about that.
> I verified that the function was only accessible via
> `window-scroll-functions'. My code did not use the function in any
> other place.
> Some entries below in the backtrace was `redisplay' - so... somehow
> `redisplay' is sometimes calling functions in `window-scroll-functions'
> with zero arguments. Maybe the buffer local binding of
> `window-scroll-functions'.
> Please tell whether this information suffices and you already have some
> idea or if I should try to create a recipe. I guess this must be
> related to a recent change from within the last few days.
> Michael.
--
Alan Mackenzie (Nuremberg, Germany).
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-08-15 12:24 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-08-13 16:17 bug#57179: 29.0.50: 'wrong-number-of-arguments' for function of two arguments called from 'window-scroll-functions' Andrea Greselin
2022-08-13 17:30 ` Eli Zaretskii
2022-08-13 20:50 ` Michael Heerdegen
2022-08-14 0:19 ` Michael Heerdegen
2022-08-14 7:18 ` Eli Zaretskii
2022-08-14 13:22 ` Alan Mackenzie
2022-08-14 23:00 ` Michael Heerdegen
2022-08-15 9:42 ` Andrea Greselin
2022-08-15 12:24 ` Alan Mackenzie
2022-08-13 23:07 ` Andrea Greselin
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).