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

Re: PATCH: Re: Two more wordcode problems, probably



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@xxxxxxxxxxxxxxxxxxxxxxx



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