Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Re: Two more wordcode problems, probably



Peter Stephenson wrote:

> These are presumably both a result of the wordcode changes:
> 
> 1) Bad results using ksh-format autoload:
> 
> % ./zsh -f
> % fpath=(.)
> % cat tst
> tst() {
>   print hello
> }
> % autoload tst
> % tst
> % which tst
> tst () {
> 
> }
> 
> Basically, every single line is messed up, although it doesn't seem to dump
> core (it has more fun without...)

The patch changes stripkshdef(). It seems like I forgot it change it
when I finally added the Patprog caching.

> 2) completion after `cvs add' dumps core.

The array created in ecgetarr() wasn't NULL-terminated. I had tested
this, obviously I was just (un)lucky to get a piece of memory with a
zero after it.

>  Do you want the whole backtrace?
> No? Bad luck.  (Phew.  I sometimes wonder what we've got ourselves into.)

That's why I want to change the execution code to be (mostly)
non-recursive some day (I don't think I'll try this any time soon,
though). That would leave us with only the frames for the shell
functions called (and some at the beginning/end, of course). I'd also
like to get rid of the func_wrapper() wrapper. I was really tempted to 
make the core keep a simple stack-allocated stack of functions
currently active (func_wrapper() only keeps track of the function
names for the $funcstack array).

Bye
 Sven

diff -ru ../z.old/Src/exec.c Src/exec.c
--- ../z.old/Src/exec.c	Fri Jan 21 09:25:08 2000
+++ Src/exec.c	Fri Jan 21 10:03:39 2000
@@ -3281,7 +3281,6 @@
 {
     Wordcode pc = prog->prog;
     wordcode code;
-    Eprog ret;
 
     if (!prog)
 	return NULL;
@@ -3301,16 +3300,33 @@
 	*pc != 1 || strcmp(name, ecrawstr(prog, pc + 1)))
 	return prog;
 
-    ret = (Eprog) zhalloc(sizeof(*prog));
-    ret->len = (WC_FUNCDEF_SKIP(code) - 3) * sizeof(wordcode);
-    ret->prog = pc + 3;
-    ret->strs = (char *) (pc + pc[3]);
-    ret->shf = NULL;
-    ret->pats = prog->pats;
-    ret->npats = prog->npats;
-    ret->heap = 1;
+    {
+	Eprog ret;
+	Wordcode end = pc + WC_FUNCDEF_SKIP(code);
+	int nprg = pc[2] - 4;
+	int npats = pc[3];
+	int plen, len, i;
+	Patprog *pp;
 
-    return ret;
+	pc += 4;
+
+	plen = (end - pc) * sizeof(wordcode);
+	len = plen + (npats * sizeof(Patprog));
+
+	ret = (Eprog) zhalloc(sizeof(*ret));
+	ret->heap = 1;
+	ret->len = len;
+	ret->npats = npats;
+	ret->pats = pp = (Patprog *) zhalloc(len);
+	ret->prog = (Wordcode) (ret->pats + npats);
+	for (i = npats; i--; pp++)
+	    *pp = dummy_patprog1;
+	memcpy(ret->prog, pc, plen);
+	ret->strs = (char *) (ret->prog + nprg);
+	ret->shf = NULL;
+
+	return ret;
+    }
 }
 
 /* check to see if AUTOCD applies here */
diff -ru ../z.old/Src/parse.c Src/parse.c
--- ../z.old/Src/parse.c	Fri Jan 21 09:25:10 2000
+++ Src/parse.c	Fri Jan 21 09:57:56 2000
@@ -2467,10 +2467,11 @@
 {
     char **ret, **rp;
 
-    ret = rp = (char **) zhalloc(num * sizeof(char *));
+    ret = rp = (char **) zhalloc((num + 1) * sizeof(char *));
 
     while (num--)
 	*rp++ = ecgetstr(s, dup);
+    *rp = NULL;
 
     return ret;
 }
diff -ru ../z.old/Src/text.c Src/text.c
--- ../z.old/Src/text.c	Fri Jan 21 09:25:11 2000
+++ Src/text.c	Fri Jan 21 10:00:51 2000
@@ -636,6 +636,7 @@
 			break;
 		    case COND_MOD:
 			taddstr(ecgetstr(state, 0));
+			taddchr(' ');
 			taddlist(state, WC_COND_SKIP(code));
 			stack = 1;
 			break;

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



Messages sorted by: Reverse Date, Date, Thread, Author