1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

lread.c (Vload_history): Enhance doc-string to say that the file is the

absolute truename of the loaded file.

lread.c (Vafter_load_alist): doc-string: state that an element now has a
regexp to match file names, not a file name as such.

lread.c (readevalloop): Call file-truename on the name for load-history,
except at preloading time.

lread.c (Fload): At preloading time, preserve the extension of the
filename which goes into load-history.  New variable hist_file_name.

lread.c (Fload): Do eval-after-load stuff by calling the lisp function
do-after-load-evaluation.
This commit is contained in:
Alan Mackenzie 2006-05-24 13:24:21 +00:00
parent 33d74677e7
commit 6bb6da3ec1

View file

@ -87,6 +87,7 @@ Lisp_Object Qascii_character, Qload, Qload_file_name;
Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction; Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
Lisp_Object Qinhibit_file_name_operation; Lisp_Object Qinhibit_file_name_operation;
Lisp_Object Qeval_buffer_list, Veval_buffer_list; Lisp_Object Qeval_buffer_list, Veval_buffer_list;
Lisp_Object Qfile_truename, Qdo_after_load_evaluation; /* ACM 2006/5/16 */
extern Lisp_Object Qevent_symbol_element_mask; extern Lisp_Object Qevent_symbol_element_mask;
extern Lisp_Object Qfile_exists_p; extern Lisp_Object Qfile_exists_p;
@ -718,8 +719,8 @@ Return t if the file exists and loads successfully. */)
register int fd = -1; register int fd = -1;
int count = SPECPDL_INDEX (); int count = SPECPDL_INDEX ();
Lisp_Object temp; Lisp_Object temp;
struct gcpro gcpro1, gcpro2; struct gcpro gcpro1, gcpro2, gcpro3;
Lisp_Object found, efound; Lisp_Object found, efound, hist_file_name;
/* 1 means we printed the ".el is newer" message. */ /* 1 means we printed the ".el is newer" message. */
int newer = 0; int newer = 0;
/* 1 means we are loading a compiled file. */ /* 1 means we are loading a compiled file. */
@ -727,6 +728,7 @@ Return t if the file exists and loads successfully. */)
Lisp_Object handler; Lisp_Object handler;
int safe_p = 1; int safe_p = 1;
char *fmode = "r"; char *fmode = "r";
Lisp_Object tmp[2];
#ifdef DOS_NT #ifdef DOS_NT
fmode = "rt"; fmode = "rt";
#endif /* DOS_NT */ #endif /* DOS_NT */
@ -743,7 +745,7 @@ Return t if the file exists and loads successfully. */)
the need to gcpro noerror, nomessage and nosuffix. the need to gcpro noerror, nomessage and nosuffix.
(Below here, we care only whether they are nil or not.) (Below here, we care only whether they are nil or not.)
The presence of this call is the result of a historical accident: The presence of this call is the result of a historical accident:
it used to be in every file-operations and when it got removed it used to be in every file-operation and when it got removed
everywhere, it accidentally stayed here. Since then, enough people everywhere, it accidentally stayed here. Since then, enough people
supposedly have things like (load "$PROJECT/foo.el") in their .emacs supposedly have things like (load "$PROJECT/foo.el") in their .emacs
that it seemed risky to remove. */ that it seemed risky to remove. */
@ -763,7 +765,6 @@ Return t if the file exists and loads successfully. */)
if (SCHARS (file) > 0) if (SCHARS (file) > 0)
{ {
int size = SBYTES (file); int size = SBYTES (file);
Lisp_Object tmp[2];
found = Qnil; found = Qnil;
GCPRO2 (file, found); GCPRO2 (file, found);
@ -847,6 +848,13 @@ Return t if the file exists and loads successfully. */)
Vloads_in_progress = Fcons (found, Vloads_in_progress); Vloads_in_progress = Fcons (found, Vloads_in_progress);
} }
/* Get the name for load-history. */
hist_file_name = (! NILP (Vpurify_flag)
? Fconcat (2, (tmp[0] = Ffile_name_directory (file),
tmp[1] = Ffile_name_nondirectory (found),
tmp))
: found) ;
if (!bcmp (SDATA (found) + SBYTES (found) - 4, if (!bcmp (SDATA (found) + SBYTES (found) - 4,
".elc", 4)) ".elc", 4))
/* Load .elc files directly, but not when they are /* Load .elc files directly, but not when they are
@ -857,7 +865,7 @@ Return t if the file exists and loads successfully. */)
struct stat s1, s2; struct stat s1, s2;
int result; int result;
GCPRO2 (file, found); GCPRO3 (file, found, hist_file_name);
if (!safe_to_load_p (fd)) if (!safe_to_load_p (fd))
{ {
@ -911,14 +919,14 @@ Return t if the file exists and loads successfully. */)
if (fd >= 0) if (fd >= 0)
emacs_close (fd); emacs_close (fd);
val = call4 (Vload_source_file_function, found, file, val = call4 (Vload_source_file_function, found, hist_file_name,
NILP (noerror) ? Qnil : Qt, NILP (noerror) ? Qnil : Qt,
NILP (nomessage) ? Qnil : Qt); NILP (nomessage) ? Qnil : Qt);
return unbind_to (count, val); return unbind_to (count, val);
} }
} }
GCPRO2 (file, found); GCPRO3 (file, found, hist_file_name);
#ifdef WINDOWSNT #ifdef WINDOWSNT
emacs_close (fd); emacs_close (fd);
@ -957,14 +965,15 @@ Return t if the file exists and loads successfully. */)
load_descriptor_list load_descriptor_list
= Fcons (make_number (fileno (stream)), load_descriptor_list); = Fcons (make_number (fileno (stream)), load_descriptor_list);
load_in_progress++; load_in_progress++;
readevalloop (Qget_file_char, stream, (! NILP (Vpurify_flag) ? file : found), readevalloop (Qget_file_char, stream, hist_file_name,
Feval, 0, Qnil, Qnil, Qnil, Qnil); Feval, 0, Qnil, Qnil, Qnil, Qnil);
unbind_to (count, Qnil); unbind_to (count, Qnil);
/* Run any load-hooks for this file. */ /* Run any eval-after-load forms for this file */
temp = Fassoc (file, Vafter_load_alist); if (NILP (Vpurify_flag)
if (!NILP (temp)) && (!NILP (Ffboundp (Qdo_after_load_evaluation))))
Fprogn (Fcdr (temp)); call1 (Qdo_after_load_evaluation, hist_file_name) ;
UNGCPRO; UNGCPRO;
if (saved_doc_string) if (saved_doc_string)
@ -1391,6 +1400,12 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
GCPRO4 (sourcename, readfun, start, end); GCPRO4 (sourcename, readfun, start, end);
/* Try to ensure sourcename is a truename, except whilst preloading. */
if (NILP (Vpurify_flag)
&& !NILP (sourcename) && Ffile_name_absolute_p (sourcename)
&& (!NILP (Ffboundp (Qfile_truename))))
sourcename = call1 (Qfile_truename, sourcename) ;
LOADHIST_ATTACH (sourcename); LOADHIST_ATTACH (sourcename);
continue_reading_p = 1; continue_reading_p = 1;
@ -3971,16 +3986,17 @@ customize `jka-compr-load-suffixes' rather than the present variable. */);
DEFVAR_LISP ("after-load-alist", &Vafter_load_alist, DEFVAR_LISP ("after-load-alist", &Vafter_load_alist,
doc: /* An alist of expressions to be evalled when particular files are loaded. doc: /* An alist of expressions to be evalled when particular files are loaded.
Each element looks like (FILENAME FORMS...). Each element looks like (REGEXP-OR-FEATURE FORMS...).
When `load' is run and the file-name argument is FILENAME,
the FORMS in the corresponding element are executed at the end of loading.
FILENAME must match exactly! Normally FILENAME is the name of a library, REGEXP-OR-FEATURE is either a regular expression to match file names, or
with no directory specified, since that is how `load' is normally called. a symbol \(a feature name).
An error in FORMS does not undo the load,
but does prevent execution of the rest of the FORMS. When `load' is run and the file-name argument matches an element's
FILENAME can also be a symbol (a feature) and FORMS are then executed REGEXP-OR-FEATURE, or when `provide' is run and provides the symbol
when the corresponding call to `provide' is made. */); REGEXP-OR-FEATURE, the FORMS in the element are executed.
An error in FORMS does not undo the load, but does prevent execution of
the rest of the FORMS. */);
Vafter_load_alist = Qnil; Vafter_load_alist = Qnil;
DEFVAR_LISP ("load-history", &Vload_history, DEFVAR_LISP ("load-history", &Vload_history,
@ -3988,6 +4004,10 @@ when the corresponding call to `provide' is made. */);
Each alist element is a list that starts with a file name, Each alist element is a list that starts with a file name,
except for one element (optional) that starts with nil and describes except for one element (optional) that starts with nil and describes
definitions evaluated from buffers not visiting files. definitions evaluated from buffers not visiting files.
The file name is absolute and is the true file name (i.e. it doesn't
contain symbolic links) of the loaded file.
The remaining elements of each list are symbols defined as variables The remaining elements of each list are symbols defined as variables
and cons cells of the form `(provide . FEATURE)', `(require . FEATURE)', and cons cells of the form `(provide . FEATURE)', `(require . FEATURE)',
`(defun . FUNCTION)', `(autoload . SYMBOL)', and `(t . SYMBOL)'. `(defun . FUNCTION)', `(autoload . SYMBOL)', and `(t . SYMBOL)'.
@ -4118,6 +4138,12 @@ to load. See also `load-dangerous-libraries'. */);
Qeval_buffer_list = intern ("eval-buffer-list"); Qeval_buffer_list = intern ("eval-buffer-list");
staticpro (&Qeval_buffer_list); staticpro (&Qeval_buffer_list);
Qfile_truename = intern ("file-truename");
staticpro (&Qfile_truename) ;
Qdo_after_load_evaluation = intern ("do-after-load-evaluation");
staticpro (&Qdo_after_load_evaluation) ;
staticpro (&dump_path); staticpro (&dump_path);
staticpro (&read_objects); staticpro (&read_objects);