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:
parent
33d74677e7
commit
6bb6da3ec1
1 changed files with 47 additions and 21 deletions
68
src/lread.c
68
src/lread.c
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue