* bug#26837: Wrong file in "autoloading failed to define" error
@ 2017-05-08 19:14 Glenn Morris
2017-05-09 0:04 ` Glenn Morris
0 siblings, 1 reply; 13+ messages in thread
From: Glenn Morris @ 2017-05-08 19:14 UTC (permalink / raw)
To: 26837; +Cc: agrambot
Package: emacs
Version: 26.0.50
Severity: minor
cat <<EOF > bar.el
(provide 'bar)
EOF
emacs -Q -L $PWD
(autoload 'bar "bar")
(bar)
-> (error "Autoloading file /path/to/bar.el failed to define function bar")
which is correct and good.
Now:
C-] ; exit debugger
(bar) ; repeat
-> (error "Autoloading file /path/to/help-mode.elc failed to define function bar")
Ie, the wrong file name is reported after the first time round.
Ref: http://lists.gnu.org/archive/html/emacs-devel/2016-10/msg00668.html
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-08 19:14 bug#26837: Wrong file in "autoloading failed to define" error Glenn Morris
@ 2017-05-09 0:04 ` Glenn Morris
2017-05-09 7:26 ` Alex
0 siblings, 1 reply; 13+ messages in thread
From: Glenn Morris @ 2017-05-09 0:04 UTC (permalink / raw)
To: 26837; +Cc: agrambot
Am I mistaken in the following patch to fix this, or has load not been
moving an already present file to the start of load-history since c 2005?
--- a/src/lread.c
+++ b/src/lread.c
@@ -1885,7 +1885,7 @@ PREDICATE can also be an integer to pass to the faccessat(2) function,
/* On the first cycle, we can easily test here
whether we are reading the whole buffer. */
if (b && first_sexp)
- whole_buffer = (PT == BEG && ZV == Z);
+ whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
instream = stream;
read_next:
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 0:04 ` Glenn Morris
@ 2017-05-09 7:26 ` Alex
2017-05-09 16:33 ` Glenn Morris
0 siblings, 1 reply; 13+ messages in thread
From: Alex @ 2017-05-09 7:26 UTC (permalink / raw)
To: Glenn Morris; +Cc: 26837
Glenn Morris <rgm@gnu.org> writes:
> Am I mistaken in the following patch to fix this, or has load not been
> moving an already present file to the start of load-history since c 2005?
>
> --- a/src/lread.c
> +++ b/src/lread.c
> @@ -1885,7 +1885,7 @@ PREDICATE can also be an integer to pass to the faccessat(2) function,
> /* On the first cycle, we can easily test here
> whether we are reading the whole buffer. */
> if (b && first_sexp)
> - whole_buffer = (PT == BEG && ZV == Z);
> + whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
>
> instream = stream;
> read_next:
I can't claim to know what is going on within that function, but your
patch seems to only work for some files (e.g. your bar.el). If bar
starts with a comment, then bar isn't moved to the top after evaluating
(load "bar").
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 7:26 ` Alex
@ 2017-05-09 16:33 ` Glenn Morris
2017-05-09 18:39 ` Glenn Morris
0 siblings, 1 reply; 13+ messages in thread
From: Glenn Morris @ 2017-05-09 16:33 UTC (permalink / raw)
To: Alex; +Cc: 26837
Alex wrote:
>> - whole_buffer = (PT == BEG && ZV == Z);
>> + whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
[...]
> I can't claim to know what is going on within that function, but your
> patch seems to only work for some files (e.g. your bar.el). If bar
> starts with a comment, then bar isn't moved to the top after evaluating
> (load "bar").
The intent of the code seems to be to only adjust an existing
load-history element for some file if the entire file is being loaded.
I guess in the leading comment case, something else has already moved
point looking for a significant leading comment (eg lexbind, script,
prop-line). Hmmm.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 16:33 ` Glenn Morris
@ 2017-05-09 18:39 ` Glenn Morris
2017-05-09 19:12 ` Eli Zaretskii
2017-05-18 20:11 ` Alex
0 siblings, 2 replies; 13+ messages in thread
From: Glenn Morris @ 2017-05-09 18:39 UTC (permalink / raw)
To: Alex; +Cc: 26837
Glenn Morris wrote:
>> I can't claim to know what is going on within that function, but your
>> patch seems to only work for some files (e.g. your bar.el). If bar
>> starts with a comment, then bar isn't moved to the top after evaluating
>> (load "bar").
>
> The intent of the code seems to be to only adjust an existing
> load-history element for some file if the entire file is being loaded.
> I guess in the leading comment case, something else has already moved
> point looking for a significant leading comment (eg lexbind, script,
> prop-line). Hmmm.
I think it was the lexical-binding thing. Following seems to work:
--- i/src/lread.c
+++ w/src/lread.c
@@ -1885,7 +1885,7 @@ PREDICATE can also be an integer to pass to the faccessat(2) function,
/* On the first cycle, we can easily test here
whether we are reading the whole buffer. */
if (b && first_sexp)
- whole_buffer = (PT == BEG && ZV == Z);
+ whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
instream = stream;
read_next:
@@ -2008,6 +2008,7 @@ BUFFER is the buffer to evaluate (nil means use current buffer),
record_unwind_protect (save_excursion_restore, save_excursion_save ());
BUF_TEMP_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
specbind (Qlexical_binding, lisp_file_lexically_bound_p (buf) ? Qt : Qnil);
+ BUF_TEMP_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
readevalloop (buf, 0, filename,
!NILP (printflag), unibyte, Qnil, Qnil, Qnil);
unbind_to (count, Qnil);
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 18:39 ` Glenn Morris
@ 2017-05-09 19:12 ` Eli Zaretskii
2017-05-09 23:49 ` Glenn Morris
2017-05-18 20:11 ` Alex
1 sibling, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2017-05-09 19:12 UTC (permalink / raw)
To: Glenn Morris; +Cc: 26837, agrambot
> From: Glenn Morris <rgm@gnu.org>
> Date: Tue, 09 May 2017 14:39:24 -0400
> Cc: 26837@debbugs.gnu.org
>
> I think it was the lexical-binding thing. Following seems to work:
>
> --- i/src/lread.c
> +++ w/src/lread.c
> @@ -1885,7 +1885,7 @@ PREDICATE can also be an integer to pass to the faccessat(2) function,
> /* On the first cycle, we can easily test here
> whether we are reading the whole buffer. */
> if (b && first_sexp)
> - whole_buffer = (PT == BEG && ZV == Z);
> + whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
You are saying that set_buffer_internal didn't do its job? Of that
the call was bypassed?
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 19:12 ` Eli Zaretskii
@ 2017-05-09 23:49 ` Glenn Morris
2017-05-10 2:43 ` Eli Zaretskii
0 siblings, 1 reply; 13+ messages in thread
From: Glenn Morris @ 2017-05-09 23:49 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 26837, agrambot
Eli Zaretskii wrote:
>> - whole_buffer = (PT == BEG && ZV == Z);
>> + whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
>
> You are saying that set_buffer_internal didn't do its job? Of that
> the call was bypassed?
When START = nil (eg when called from eval-buffer), set_buffer_internal
is never called.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 23:49 ` Glenn Morris
@ 2017-05-10 2:43 ` Eli Zaretskii
2017-05-10 6:23 ` Glenn Morris
0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2017-05-10 2:43 UTC (permalink / raw)
To: Glenn Morris; +Cc: 26837, agrambot
> From: Glenn Morris <rgm@gnu.org>
> Cc: agrambot@gmail.com, 26837@debbugs.gnu.org
> Date: Tue, 09 May 2017 19:49:17 -0400
>
> Eli Zaretskii wrote:
>
> >> - whole_buffer = (PT == BEG && ZV == Z);
> >> + whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
> >
> > You are saying that set_buffer_internal didn't do its job? Of that
> > the call was bypassed?
>
> When START = nil (eg when called from eval-buffer), set_buffer_internal
> is never called.
What's the use case when this goes together with b not being the
current buffer?
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-10 2:43 ` Eli Zaretskii
@ 2017-05-10 6:23 ` Glenn Morris
0 siblings, 0 replies; 13+ messages in thread
From: Glenn Morris @ 2017-05-10 6:23 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 26837, agrambot
Eli Zaretskii wrote:
> What's the use case when this goes together with b not being the
> current buffer?
(load "file.el")
-> load-source-file-function
-> load-with-code-conversion
-> (eval-buffer buffer ...)
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-09 18:39 ` Glenn Morris
2017-05-09 19:12 ` Eli Zaretskii
@ 2017-05-18 20:11 ` Alex
2017-05-20 23:17 ` Glenn Morris
1 sibling, 1 reply; 13+ messages in thread
From: Alex @ 2017-05-18 20:11 UTC (permalink / raw)
To: Glenn Morris; +Cc: 26837
Glenn Morris <rgm@gnu.org> writes:
> Glenn Morris wrote:
>
> I think it was the lexical-binding thing. Following seems to work:
>
> --- i/src/lread.c
> +++ w/src/lread.c
> @@ -1885,7 +1885,7 @@ PREDICATE can also be an integer to pass to the faccessat(2) function,
> /* On the first cycle, we can easily test here
> whether we are reading the whole buffer. */
> if (b && first_sexp)
> - whole_buffer = (PT == BEG && ZV == Z);
> + whole_buffer = (BUF_PT (b) == BUF_BEG (b) && BUF_ZV (b) == BUF_Z (b));
>
> instream = stream;
> read_next:
> @@ -2008,6 +2008,7 @@ BUFFER is the buffer to evaluate (nil means use current buffer),
> record_unwind_protect (save_excursion_restore, save_excursion_save ());
> BUF_TEMP_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
> specbind (Qlexical_binding, lisp_file_lexically_bound_p (buf) ? Qt : Qnil);
> + BUF_TEMP_SET_PT (XBUFFER (buf), BUF_BEGV (XBUFFER (buf)));
> readevalloop (buf, 0, filename,
> !NILP (printflag), unibyte, Qnil, Qnil, Qnil);
> unbind_to (count, Qnil);
That seems to work for me as well. Should it be documented that
reevaluations of a file update the position of the file in load-history?
I assumed this was already the case when making my autoload patch
because of the "history" in load-history, but documentation would help
to make that clear.
PS: I realized that I was a bit careless in using SDATA without checking
that the argument is necessarily a string. I don't think it matters much
if your above patch is applied, but it's probably not a good idea to
leave it in, just in case there's a bug somewhere else in the future.
What do you think about the following diff? This removes the dependency
on load-history altogether:
--- a/src/eval.c
+++ b/src/eval.c
@@ -2021,7 +2021,10 @@ it defines a macro. */)
if (!NILP (Fequal (fun, fundef)))
error ("Autoloading file %s failed to define function %s",
- SDATA (Fcar (Fcar (Vload_history))),
+ SDATA (Flocate_file_internal (Fcar (Fcdr (fundef)),
+ Vload_path,
+ Vload_suffixes,
+ Qnil)),
SDATA (SYMBOL_NAME (funname)));
else
return fun;
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-18 20:11 ` Alex
@ 2017-05-20 23:17 ` Glenn Morris
2017-05-20 23:24 ` Glenn Morris
2017-05-21 21:59 ` Alex
0 siblings, 2 replies; 13+ messages in thread
From: Glenn Morris @ 2017-05-20 23:17 UTC (permalink / raw)
To: Alex; +Cc: 26837
Alex wrote:
> That seems to work for me as well. Should it be documented that
> reevaluations of a file update the position of the file in load-history?
I think it's mentioned in the doc of load:
Loading a file records its definitions, and its `provide' and
`require' calls, in an element of `load-history' whose
car is the file name loaded. See `load-history'.
^^^^^^^^^^^^^^^^^^^^^^^^^^^
but that did seem to be the only mention I found in a quick search.
> PS: I realized that I was a bit careless in using SDATA without checking
> that the argument is necessarily a string. I don't think it matters much
> if your above patch is applied, but it's probably not a good idea to
> leave it in, just in case there's a bug somewhere else in the future.
In 58326f0 I check if the car is nil (though I don't see how it could be).
Could add the same thing to eval.c.
> What do you think about the following diff? This removes the dependency
> on load-history altogether:
>
> --- a/src/eval.c
> +++ b/src/eval.c
> @@ -2021,7 +2021,10 @@ it defines a macro. */)
>
> if (!NILP (Fequal (fun, fundef)))
> error ("Autoloading file %s failed to define function %s",
> - SDATA (Fcar (Fcar (Vload_history))),
> + SDATA (Flocate_file_internal (Fcar (Fcdr (fundef)),
> + Vload_path,
> + Vload_suffixes,
> + Qnil)),
> SDATA (SYMBOL_NAME (funname)));
> else
> return fun;
I don't have an informed opinion right now.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-20 23:17 ` Glenn Morris
@ 2017-05-20 23:24 ` Glenn Morris
2017-05-21 21:59 ` Alex
1 sibling, 0 replies; 13+ messages in thread
From: Glenn Morris @ 2017-05-20 23:24 UTC (permalink / raw)
To: Alex; +Cc: 26837
Glenn Morris wrote:
> I think it's mentioned in the doc of load:
>
> Loading a file records its definitions, and its `provide' and
> `require' calls, in an element of `load-history' whose
> car is the file name loaded. See `load-history'.
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Duh, re-reading that I see it doesn't say what I thought it said.
So I guess it isn't documented, though it was clearly the intent of the
code. I don't know if it should be mentioned explicitly.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#26837: Wrong file in "autoloading failed to define" error
2017-05-20 23:17 ` Glenn Morris
2017-05-20 23:24 ` Glenn Morris
@ 2017-05-21 21:59 ` Alex
1 sibling, 0 replies; 13+ messages in thread
From: Alex @ 2017-05-21 21:59 UTC (permalink / raw)
To: Glenn Morris; +Cc: 26837
Glenn Morris <rgm@gnu.org> writes:
> In 58326f0 I check if the car is nil (though I don't see how it could be).
> Could add the same thing to eval.c.
According to the docstring of load-history:
As an exception, one of the alist elements may have FILE-NAME nil,
for symbols and features not associated with any file.
With your proposed patch I don't think it's really an issue anymore, but
previously it could have triggered a segfault under that rare condition.
> I don't know if it should be mentioned explicitly.
If the intention is that someone can expect the position of files in
load-history to be updated so that it provides a history of some sort
(i.e. use (caar load-history) to get the last file evaluated), then I
would think that there should be a line mentioning it somewhere.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2017-05-21 21:59 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-08 19:14 bug#26837: Wrong file in "autoloading failed to define" error Glenn Morris
2017-05-09 0:04 ` Glenn Morris
2017-05-09 7:26 ` Alex
2017-05-09 16:33 ` Glenn Morris
2017-05-09 18:39 ` Glenn Morris
2017-05-09 19:12 ` Eli Zaretskii
2017-05-09 23:49 ` Glenn Morris
2017-05-10 2:43 ` Eli Zaretskii
2017-05-10 6:23 ` Glenn Morris
2017-05-18 20:11 ` Alex
2017-05-20 23:17 ` Glenn Morris
2017-05-20 23:24 ` Glenn Morris
2017-05-21 21:59 ` Alex
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.