mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-13 01:31:18 +02:00
zsh-workers/9966
This commit is contained in:
parent
c41f9e8f8b
commit
097e2d70cd
3 changed files with 24 additions and 14 deletions
|
@ -1304,9 +1304,10 @@ noderef(Functions)
|
||||||
for a description of how autoloaded functions are searched).
|
for a description of how autoloaded functions are searched).
|
||||||
|
|
||||||
If there is at least one var(function) argument, the wordcode for all
|
If there is at least one var(function) argument, the wordcode for all
|
||||||
these functions will be put in the created wordcode var(file). Such
|
these functions will be put in the created wordcode var(file) (if that
|
||||||
files containing the code for multiple functions are intended to be
|
name does not end in tt(.zwc), this extension is automatically
|
||||||
used as elements of the tt(FPATH)/tt(fpath) special array.
|
appended). Such files containing the code for multiple functions are
|
||||||
|
intended to be used as elements of the tt(FPATH)/tt(fpath) special array.
|
||||||
|
|
||||||
If the tt(-U) option is given, aliases in the var(function)s will not
|
If the tt(-U) option is given, aliases in the var(function)s will not
|
||||||
be expanded. If the tt(-r) option is given, the function(s) in the
|
be expanded. If the tt(-r) option is given, the function(s) in the
|
||||||
|
|
|
@ -52,7 +52,9 @@ example(fpath=(~/myfuncs $fpath)
|
||||||
autoload myfunc1 myfunc2 ...)
|
autoload myfunc1 myfunc2 ...)
|
||||||
|
|
||||||
The elements of the tt(fpath) array may also name wordcode files
|
The elements of the tt(fpath) array may also name wordcode files
|
||||||
directly. This is mostly useful for wordcode files containing multiple
|
directly. The names of these files must have the tt(.zwc) extension
|
||||||
|
but in tt(fpath) the names may be given with or without it. This is
|
||||||
|
mostly useful for wordcode files containing multiple
|
||||||
functions, in which case the file is treated like a directory
|
functions, in which case the file is treated like a directory
|
||||||
containing files for functions and will be searched for the definition
|
containing files for functions and will be searched for the definition
|
||||||
of the function.
|
of the function.
|
||||||
|
|
27
Src/parse.c
27
Src/parse.c
|
@ -2361,9 +2361,12 @@ build_dump(char *nam, char *dump, char **files, int ali, int map)
|
||||||
LinkNode node;
|
LinkNode node;
|
||||||
struct fdhead head;
|
struct fdhead head;
|
||||||
wordcode pre[FD_PRELEN];
|
wordcode pre[FD_PRELEN];
|
||||||
char *file, **ofiles = files, **oofiles = files, *name, *tail;
|
char *file, **ofiles = files, **oofiles = files, *tail;
|
||||||
Eprog prog;
|
Eprog prog;
|
||||||
|
|
||||||
|
if (!strsfx(FD_EXT, dump))
|
||||||
|
dump = dyncat(dump, FD_EXT);
|
||||||
|
|
||||||
if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) {
|
if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) {
|
||||||
zerrnam(nam, "can't write dump file: %s", dump, 0);
|
zerrnam(nam, "can't write dump file: %s", dump, 0);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -2436,9 +2439,10 @@ build_dump(char *nam, char *dump, char **files, int ali, int map)
|
||||||
head.strs = prog->strs - ((char *) prog->prog);
|
head.strs = prog->strs - ((char *) prog->prog);
|
||||||
head.hlen = (sizeof(struct fdhead) / sizeof(wordcode)) +
|
head.hlen = (sizeof(struct fdhead) / sizeof(wordcode)) +
|
||||||
(strlen(*ofiles) + sizeof(wordcode)) / sizeof(wordcode);
|
(strlen(*ofiles) + sizeof(wordcode)) / sizeof(wordcode);
|
||||||
for (name = tail = *ofiles; *name; name++)
|
if ((tail = strrchr(*ofiles, '/')))
|
||||||
if (*name == '/')
|
tail++;
|
||||||
tail = name + 1;
|
else
|
||||||
|
tail= *ofiles;
|
||||||
head.tail = tail - *ofiles;
|
head.tail = tail - *ofiles;
|
||||||
if (other)
|
if (other)
|
||||||
fdswap((Wordcode) &head, sizeof(head) / sizeof(wordcode));
|
fdswap((Wordcode) &head, sizeof(head) / sizeof(wordcode));
|
||||||
|
@ -2539,20 +2543,23 @@ load_dump_file(char *dump, int other, int len)
|
||||||
Eprog
|
Eprog
|
||||||
try_dump_file(char *dump, char *name, char *func)
|
try_dump_file(char *dump, char *name, char *func)
|
||||||
{
|
{
|
||||||
|
char *file;
|
||||||
int isrec = 0;
|
int isrec = 0;
|
||||||
Wordcode d;
|
Wordcode d;
|
||||||
FDHead h;
|
FDHead h;
|
||||||
FuncDump f;
|
FuncDump f;
|
||||||
|
|
||||||
|
file = (strsfx(FD_EXT, dump) ? dump : dyncat(dump, FD_EXT));
|
||||||
|
|
||||||
rec:
|
rec:
|
||||||
|
|
||||||
d = NULL;
|
d = NULL;
|
||||||
for (f = dumps; f; f = f->next)
|
for (f = dumps; f; f = f->next)
|
||||||
if (!strcmp(dump, f->name)) {
|
if (!strcmp(file, f->name)) {
|
||||||
d = f->map;
|
d = f->map;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!f && (isrec || !(d = load_dump_header(dump)))) {
|
if (!f && (isrec || !(d = load_dump_header(file)))) {
|
||||||
if (!isrec) {
|
if (!isrec) {
|
||||||
struct stat stc, stn;
|
struct stat stc, stn;
|
||||||
char *p = (char *) zhalloc(strlen(dump) + strlen(name) +
|
char *p = (char *) zhalloc(strlen(dump) + strlen(name) +
|
||||||
|
@ -2561,10 +2568,10 @@ try_dump_file(char *dump, char *name, char *func)
|
||||||
sprintf(p, "%s/%s%s", dump, name, FD_EXT);
|
sprintf(p, "%s/%s%s", dump, name, FD_EXT);
|
||||||
|
|
||||||
/* Ignore the dump file if it is older than the normal one. */
|
/* Ignore the dump file if it is older than the normal one. */
|
||||||
if (stat(p, &stc) || stat(func, &stn) || stn.st_mtime > stc.st_mtime)
|
if (stat(p, &stc) || (!stat(func, &stn) && stn.st_mtime > stc.st_mtime))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!(d = load_dump_header(dump = p)))
|
if (!(d = load_dump_header(file = p)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
} else
|
} else
|
||||||
|
@ -2594,7 +2601,7 @@ try_dump_file(char *dump, char *name, char *func)
|
||||||
|
|
||||||
return prog;
|
return prog;
|
||||||
} else if (fdflags(d) & FDF_MAP) {
|
} else if (fdflags(d) & FDF_MAP) {
|
||||||
load_dump_file(dump, (fdflags(d) & FDF_OTHER), fdother(d));
|
load_dump_file(file, (fdflags(d) & FDF_OTHER), fdother(d));
|
||||||
isrec = 1;
|
isrec = 1;
|
||||||
goto rec;
|
goto rec;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2602,7 +2609,7 @@ try_dump_file(char *dump, char *name, char *func)
|
||||||
Patprog *pp;
|
Patprog *pp;
|
||||||
int np, fd, po = h->npats * sizeof(Patprog);
|
int np, fd, po = h->npats * sizeof(Patprog);
|
||||||
|
|
||||||
if ((fd = open(dump, O_RDONLY)) < 0 ||
|
if ((fd = open(file, O_RDONLY)) < 0 ||
|
||||||
lseek(fd, ((h->start * sizeof(wordcode)) +
|
lseek(fd, ((h->start * sizeof(wordcode)) +
|
||||||
((fdflags(d) & FDF_OTHER) ? fdother(d) : 0)), 0) < 0) {
|
((fdflags(d) & FDF_OTHER) ? fdother(d) : 0)), 0) < 0) {
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
|
|
Loading…
Reference in a new issue