about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Doc/Zsh/builtins.yo5
-rw-r--r--Src/lex.c4
-rw-r--r--Src/parse.c57
3 files changed, 43 insertions, 23 deletions
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 6435078ec..e4c4598ce 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -1317,7 +1317,10 @@ will be mapped into the shell's memory. This is done in such a way
 that multiple instances of the shell running on the same host will
 share this mapped function. If neither tt(-r) nor tt(-m) are given,
 the tt(zcompile) builtin decides which style is used based on the size 
-of the resulting wordcode file.
+of the resulting wordcode file. On some systems it is impossible to
+map wordcode files into memory. On such systems, the functions will
+only be read from the files, independent on the mode selected when the 
+file was created.
 
 In every case, the created file contains two versions of the wordcode, 
 one for big-endian machines and one for small-endian machines. The
diff --git a/Src/lex.c b/Src/lex.c
index 333aa403b..ce245429d 100644
--- a/Src/lex.c
+++ b/Src/lex.c
@@ -191,7 +191,7 @@ struct lexstack {
     void (*hwend) _((void));
     void (*addtoline) _((int));
 
-    int eclen, ecused, ecfree, ecnpats;
+    int eclen, ecused, ecnpats;
     Wordcode ecbuf;
     Eccstr ecstrs;
     int ecsoffs, ecssub, ecnfunc;
@@ -250,7 +250,6 @@ lexsave(void)
     ls->addtoline = addtoline;
     ls->eclen = eclen;
     ls->ecused = ecused;
-    ls->ecfree = ecfree;
     ls->ecnpats = ecnpats;
     ls->ecbuf = ecbuf;
     ls->ecstrs = ecstrs;
@@ -311,7 +310,6 @@ lexrestore(void)
     addtoline = lstack->addtoline;
     eclen = lstack->eclen;
     ecused = lstack->ecused;
-    ecfree = lstack->ecfree;
     ecnpats = lstack->ecnpats;
     ecbuf = lstack->ecbuf;
     ecstrs = lstack->ecstrs;
diff --git a/Src/parse.c b/Src/parse.c
index 680828c64..64f821752 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -225,7 +225,7 @@ struct heredocs *hdocs;
  */
 
 /**/
-int eclen, ecused, ecfree, ecnpats;
+int eclen, ecused, ecnpats;
 /**/
 Wordcode ecbuf;
 /**/
@@ -240,13 +240,12 @@ ecispace(int p, int n)
 {
     int m;
 
-    if (ecfree < n) {
+    if ((eclen - ecused) < n) {
 	int a = (n > 256 ? n : 256);
 
 	ecbuf = (Wordcode) hrealloc((char *) ecbuf, eclen * sizeof(wordcode),
 				    (eclen + a) * sizeof(wordcode));
 	eclen += a;
-	ecfree += a;
     }
     if ((m = ecused - p) > 0)
 	memmove(ecbuf + p + n, ecbuf + p, m * sizeof(wordcode));
@@ -258,15 +257,13 @@ ecispace(int p, int n)
 static int
 ecadd(wordcode c)
 {
-    if (ecfree < 1) {
+    if ((eclen - ecused) < 1) {
 	ecbuf = (Wordcode) hrealloc((char *) ecbuf, eclen * sizeof(wordcode),
 				    (eclen + 256) * sizeof(wordcode));
 	eclen += 256;
-	ecfree += 256;
     }
     ecbuf[ecused] = c;
     ecused++;
-    ecfree--;
 
     return ecused - 1;
 }
@@ -347,7 +344,7 @@ ecstr(char *s)
 static void
 init_parse(void)
 {
-    ecbuf = (Wordcode) zhalloc((eclen = ecfree = 256) * sizeof(wordcode));
+    ecbuf = (Wordcode) zhalloc((eclen = 256) * sizeof(wordcode));
     ecused = 0;
     ecstrs = NULL;
     ecsoffs = ecnpats = 0;
@@ -2209,14 +2206,17 @@ struct fdhead {
 #define fdheaderlen(f) (((Wordcode) (f))[FD_PRELEN])
 
 #define fdmagic(f)       (((Wordcode) (f))[0])
-#define fdbyte(f, i)     ((wordcode) (((unsigned char *) (((Wordcode) (f)) + 1))[i]))
+#define fdsetbyte(f,i,v) \
+    ((((unsigned char *) (((Wordcode) (f)) + 1))[i]) = ((unsigned char) (v)))
+#define fdbyte(f,i)      ((wordcode) (((unsigned char *) (((Wordcode) (f)) + 1))[i]))
 #define fdflags(f)       fdbyte(f, 0)
+#define fdsetflags(f,v)  fdsetbyte(f, 0, v)
 #define fdother(f)       (fdbyte(f, 1) + (fdbyte(f, 2) << 8) + (fdbyte(f, 3) << 16))
 #define fdsetother(f, o) \
     do { \
-        fdbyte(f, 1) = (o & 0xff); \
-        fdbyte(f, 2) = (o >> 8) & 0xff; \
-        fdbyte(f, 3) = (o >> 16) & 0xff; \
+        fdsetbyte(f, 1, ((o) & 0xff)); \
+        fdsetbyte(f, 2, (((o) >> 8) & 0xff)); \
+        fdsetbyte(f, 3, (((o) >> 16) & 0xff)); \
     } while (0)
 #define fdversion(f)     ((char *) ((f) + 2))
 
@@ -2423,7 +2423,7 @@ build_dump(char *nam, char *dump, char **files, int ali, int map)
 
     for (ohlen = hlen; ; hlen = ohlen) {
 	fdmagic(pre) = (other ? FD_OMAGIC : FD_MAGIC);
-	fdflags(pre) = (map ? FDF_MAP : 0) | other;
+	fdsetflags(pre, ((map ? FDF_MAP : 0) | other));
 	fdsetother(pre, tlen);
 	strcpy(fdversion(pre), ZSH_VERSION);
 	write(dfd, pre, FD_PRELEN * sizeof(wordcode));
@@ -2536,6 +2536,8 @@ load_dump_file(char *dump, int other, int len)
     d->count = 0;
 }
 
+#endif
+
 /* See if `dump' is the name of a dump file and it has the definition
  * for the function `name'. If so, return an eprog for it. */
 
@@ -2551,14 +2553,28 @@ try_dump_file(char *dump, char *name, char *func)
 
     file = (strsfx(FD_EXT, dump) ? dump : dyncat(dump, FD_EXT));
 
+#ifdef USE_MMAP
+
  rec:
 
+#endif
+
     d = NULL;
+
+#ifdef USE_MMAP
+
     for (f = dumps; f; f = f->next)
 	if (!strcmp(file, f->name)) {
 	    d = f->map;
 	    break;
 	}
+
+#else
+
+    f = NULL;
+
+#endif
+
     if (!f && (isrec || !(d = load_dump_header(file)))) {
 	if (!isrec) {
 	    struct stat stc, stn;
@@ -2580,6 +2596,9 @@ try_dump_file(char *dump, char *name, char *func)
     if ((h = dump_find_func(d, name))) {
 	/* Found the name. If the file is already mapped, return the eprog,
 	 * otherwise map it and just go up. */
+
+#ifdef USE_MMAP
+
 	if (f) {
 	    Eprog prog = (Eprog) zalloc(sizeof(*prog));
 	    Patprog *pp;
@@ -2604,7 +2623,11 @@ try_dump_file(char *dump, char *name, char *func)
 	    load_dump_file(file, (fdflags(d) & FDF_OTHER), fdother(d));
 	    isrec = 1;
 	    goto rec;
-	} else {
+	} else
+
+#endif
+
+	    {
 	    Eprog prog;
 	    Patprog *pp;
 	    int np, fd, po = h->npats * sizeof(Patprog);
@@ -2646,6 +2669,8 @@ try_dump_file(char *dump, char *name, char *func)
     return NULL;
 }
 
+#ifdef USE_MMAP
+
 /* Increment the reference counter for a dump file. */
 
 /**/
@@ -2680,12 +2705,6 @@ decrdumpcount(FuncDump f)
 
 #else
 
-Eprog
-try_dump_file(char *dump, char *name, char *func)
-{
-    return NULL;
-}
-
 void
 incrdumpcount(FuncDump f)
 {