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

Re: Strange behavior creating functions



Bart Schaefer wrote:

> I wanted to create a function with a unique name, so I tried this:
> 
> function foo$$ () { echo $0 }
> 
> This works as expected in 3.0.7, creating a function named foo31679 (or
> whatever the PID is).  Same for 3.1.6-dev-14.
> 
> However, in 3.1.6-dev-16 (the first "foo" is an autoloaded function I use
> for testing):
> 
> zagzig[60] functions -m foo\*
> foo () {
>         # undefined
>         builtin autoload -X
> }
> foo () {
>         echo $0
> }
> zagzig[61] zmodload parameter; print -l ${functions[(I)foo*]}
> foo
> foo$$
> zagzig[62] foo$$
> zsh: command not found: foo29406
> zagzig[63] 'foo$$'
> zsh: command not found: foo$$

Urgh. Names in function definitions should be expanded.

Bye
 Sven

diff -ru ../z.old/Src/exec.c Src/exec.c
--- ../z.old/Src/exec.c	Mon Jan 31 09:10:16 2000
+++ Src/exec.c	Mon Jan 31 10:46:05 2000
@@ -2917,25 +2917,24 @@
 {
     Shfunc shf;
     char *s;
-    int signum, nprg, npats, num, len, plen, i;
-    Wordcode beg = state->pc, end, names;
+    int signum, nprg, npats, len, plen, i;
+    Wordcode beg = state->pc, end;
     Eprog prog;
     Patprog *pp;
+    LinkList names;
 
     end = beg + WC_FUNCDEF_SKIP(state->pc[-1]);
-    num = state->pc[0];
-    names = state->pc + 1;
-    nprg = state->pc[1 + num] - 4;
-    npats = state->pc[2 + num];
-
-    state->pc += num + 3;
+    names = ecgetlist(state, *state->pc++, 1);
+    nprg = *state->pc++ - 4;
+    npats = *state->pc++;
 
     plen = (end - state->pc) * sizeof(wordcode);
     len = plen + (npats * sizeof(Patprog));
 
+    execsubst(names);
+
     PERMALLOC {
-	while (num--) {
-	    s = ecrawstr(state->prog, names++);
+	while ((s = (char *) ugetnode(names))) {
 	    prog = (Eprog) zalloc(sizeof(*prog));
 	    prog->heap = 0;
 	    prog->len = len;

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



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