zsh-workers
 help / color / mirror / code / Atom feed
* Re: PATCH: Re: Two more wordcode problems, probably
@ 2000-01-21 12:01 Sven Wischnowsky
  0 siblings, 0 replies; 2+ messages in thread
From: Sven Wischnowsky @ 2000-01-21 12:01 UTC (permalink / raw)
  To: zsh-workers


I wrote:

> 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).

Does anyone object to me doing this?

We could also make the args and flags for the function available this
way but I don't see any uses for that yet...


Bye
 Sven

diff -ru ../z.old/Src/Modules/parameter.c Src/Modules/parameter.c
--- ../z.old/Src/Modules/parameter.c	Fri Jan 21 12:35:23 2000
+++ Src/Modules/parameter.c	Fri Jan 21 12:51:32 2000
@@ -555,42 +555,25 @@
 
 /* Functions for the funcstack special parameter. */
 
-static LinkList funcstack;
-
 /**/
 static char **
 funcstackgetfn(Param pm)
 {
+    Funcstack f;
+    int num;
     char **ret, **p;
-    LinkNode node;
 
-    ret = (char **) zhalloc((countlinknodes(funcstack) + 1) * sizeof(char *));
+    for (f = funcstack, num = 0; f; f = f->prev, num++);
+
+    ret = (char **) zhalloc((num + 1) * sizeof(char *));
 
-    for (node = firstnode(funcstack), p = ret; node; incnode(node), p++)
-	*p = (char *) getdata(node);
+    for (f = funcstack, p = ret; f; f = f->prev, p++)
+	*p = f->name;
     *p = NULL;
 
     return ret;
 }
 
-/**/
-static int
-func_wrapper(Eprog prog, FuncWrap w, char *name)
-{
-    PERMALLOC {
-	pushnode(funcstack, ztrdup(name));
-    } LASTALLOC;
-
-    runshfunc(prog, w, name);
-
-    DPUTS(strcmp(name, (char *) getdata(firstnode(funcstack))),
-	  "funcstack wrapper with wrong function");
-
-    zsfree((char *) remnode(funcstack, firstnode(funcstack)));
-
-    return 0;
-}
-
 /* Functions for the builtins special parameter. */
 
 /**/
@@ -1937,10 +1920,6 @@
     { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
 };
 
-static struct funcwrap wrapper[] = {
-    WRAPDEF(func_wrapper),
-};
-
 /**/
 int
 setup_(Module m)
@@ -1980,12 +1959,6 @@
 	    def->pm->unsetfn = def->unsetfn;
 	}
     }
-    PERMALLOC {
-	funcstack = newlinklist();
-    } LASTALLOC;
-
-    addwrapper(m, wrapper);
-
     return 0;
 }
 
@@ -2005,9 +1978,6 @@
 	    unsetparam_pm(pm, 0, 1);
 	}
     }
-    deletewrapper(m, wrapper);
-    freelinklist(funcstack, freestr);
-
     return 0;
 }
 
diff -ru ../z.old/Src/exec.c Src/exec.c
--- ../z.old/Src/exec.c	Fri Jan 21 12:35:14 2000
+++ Src/exec.c	Fri Jan 21 12:40:57 2000
@@ -124,6 +124,11 @@
 /**/
 struct execstack *exstack;
 
+/* Stack with names of functions currently active. */
+
+/**/
+mod_export Funcstack funcstack;
+
 #define execerr() if (!forked) { lastval = 1; return; } else _exit(1)
 
 static LinkList args;
@@ -3107,6 +3112,7 @@
     int oldzoptind, oldlastval, oldoptcind;
     char saveopts[OPT_SIZE], *oldscriptname;
     int obreaks = breaks;
+    struct funcstack fstack;
 
     HEAPALLOC {
 	pushheap();
@@ -3152,7 +3158,11 @@
 		argzero = ztrdup(argzero);
 	    }
 	}
-	runshfunc(prog, wrappers, dupstring(name));
+	fstack.name = dupstring(name);
+	fstack.prev = funcstack;
+	funcstack = &fstack;
+	runshfunc(prog, wrappers, fstack.name);
+	funcstack = fstack.prev;
 	if (retflag) {
 	    retflag = 0;
 	    breaks = obreaks;
diff -ru ../z.old/Src/zsh.h Src/zsh.h
--- ../z.old/Src/zsh.h	Fri Jan 21 12:35:18 2000
+++ Src/zsh.h	Fri Jan 21 12:37:45 2000
@@ -296,6 +296,7 @@
 typedef struct paramdef  *Paramdef;
 typedef struct cmdnam    *Cmdnam;
 typedef struct shfunc    *Shfunc;
+typedef struct funcstack *Funcstack;
 typedef struct funcwrap  *FuncWrap;
 typedef struct builtin   *Builtin;
 typedef struct nameddir  *Nameddir;
@@ -822,6 +823,13 @@
 #define SFC_WIDGET   4		/* user defined widget */
 #define SFC_COMPLETE 5		/* called from completion code */
 #define SFC_CWIDGET  6		/* new style completion widget */
+
+/* node in function stack */
+
+struct funcstack {
+    Funcstack prev;		/* previous in stack */
+    char *name;			/* name of function called */
+};
 
 /* node in list of function call wrappers */
 

--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 2+ messages in thread

* PATCH: Re: Two more wordcode problems, probably
@ 2000-01-21  9:09 Sven Wischnowsky
  0 siblings, 0 replies; 2+ messages in thread
From: Sven Wischnowsky @ 2000-01-21  9:09 UTC (permalink / raw)
  To: zsh-workers


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@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2000-01-21 12:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-01-21 12:01 PATCH: Re: Two more wordcode problems, probably Sven Wischnowsky
  -- strict thread matches above, loose matches on Subject: below --
2000-01-21  9:09 Sven Wischnowsky

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).