zsh-workers
 help / color / mirror / code / Atom feed
* ksh autoloading
@ 1997-03-26 17:46 Zefram
  1997-03-27 18:15 ` Roderick Schertler
  0 siblings, 1 reply; 6+ messages in thread
From: Zefram @ 1997-03-26 17:46 UTC (permalink / raw)
  To: zsh-workers

-----BEGIN PGP SIGNED MESSAGE-----

This patch changes the way ksh autoloading is handled.  Currently it is
a kludge in execshfunc(), that if a function that was just autoloaded
redefines itself on first execution, it is executed again.  This breaks
on functions that really want to redefine themselves, which some do,
and in any case isn't applied to functions autoloaded for other purposes,
such as chpwd or widget functions.

The new scheme is that when a list has been read from the file and parsed,
it is examined to see if it is *in its entirety* a definition of the
function being loaded.  If it is, then the contents of that definition
is used, rather than the complete list.  This has much better defined
semantics than the old method.

 -zefram

      *** Src/exec.c	1997/03/22 07:00:53	1.53
      --- Src/exec.c	1997/03/26 02:57:18
      ***************
      *** 2482,2505 ****
        	if (!(funcdef = getfpfunc(nam))) {
        	    zerr("function not found: %s", nam, 0);
        	    lastval = 1;
      ! 	} else {
      ! 	    PERMALLOC {
      ! 		shf->flags &= ~PM_UNDEFINED;
      ! 		funcdef = shf->funcdef = (List) dupstruct(funcdef);
      ! 	    } LASTALLOC;
      ! 
      ! 	    /* Execute the function definition, we just retrived */
      ! 	    doshfunc(shf->funcdef, cmd->args, shf->flags, 0);
      ! 
      ! 	    /* See if this file defined the autoloaded function *
      ! 	     * by name.  If so, we execute it again.            */
      ! 	    if ((shf = (Shfunc) shfunctab->getnode(shfunctab, nam))
      ! 		&& shf->funcdef && shf->funcdef != funcdef)
      ! 		doshfunc(shf->funcdef, cmd->args, shf->flags, 0);
      ! 	}
      !     } else
      ! 	/* Normal shell function execution */
      ! 	doshfunc(shf->funcdef, cmd->args, shf->flags, 0);
            if (!list_pipe)
        	deletefilelist(last_file_list);
        }
      --- 2482,2497 ----
        	if (!(funcdef = getfpfunc(nam))) {
        	    zerr("function not found: %s", nam, 0);
        	    lastval = 1;
      ! 	    goto end;
      ! 	}
      ! 	shf->flags &= ~PM_UNDEFINED;
      ! 	PERMALLOC {
      ! 	    shf->funcdef = (List) dupstruct(funcdef);
      ! 	} LASTALLOC;
      !     }
      !     doshfunc(shf->funcdef, cmd->args, shf->flags, 0);
      ! 
      !     end:
            if (!list_pipe)
        	deletefilelist(last_file_list);
        }
      ***************
      *** 2658,2664 ****
        			r = parse_string(d);
        		    } LASTALLOC;
        		    zfree(d, len + 1);
      ! 		    return r;
        		} else {
        		    zfree(d, len + 1);
        		    close(fd);
      --- 2650,2656 ----
        			r = parse_string(d);
        		    } LASTALLOC;
        		    zfree(d, len + 1);
      ! 		    return stripkshdef(r, s);
        		} else {
        		    zfree(d, len + 1);
        		    close(fd);
      ***************
      *** 2669,2674 ****
      --- 2661,2697 ----
        	}
            }
            return NULL;
      + }
      + 
      + /* Handle ksh-style autoloading.  Given the list read from an autoload file, *
      +  * and the name of the function being defined, check to see if the file      *
      +  * consists entirely of a single definition for that function.  If so,       *
      +  * use the contents of that definition.  Otherwise, use the entire file.     */
      + 
      + /**/
      + List
      + stripkshdef(List l, char *name)
      + {
      +     Sublist s;
      +     Pline p;
      +     Cmd c;
      +     if(!l)
      + 	return NULL;
      +     if(l->type != Z_SYNC || l->right)
      + 	return l;
      +     s = l->left;
      +     if(s->flags || s->right)
      + 	return l;
      +     p = s->left;
      +     if(p->right)
      + 	return l;
      +     c = p->left;
      +     if(c->type != FUNCDEF || c->flags ||
      + 	nonempty(c->redir) || nonempty(c->vars) ||
      + 	empty(c->args) || lastnode(c->args) != firstnode(c->args) ||
      + 	strcmp(name, peekfirst(c->args)))
      + 	return l;
      +     return c->u.list;
        }
        
        /* check to see if AUTOCD applies here */

-----BEGIN PGP SIGNATURE-----
Version: 2.6.3ia
Charset: ascii

iQCVAwUBMziTIXD/+HJTpU/hAQHmbQP7B++6X39X6L344dwuvXKO23W22kvhWW/T
P0Vc60AOgL/09xfzQO68nOlwawQFFLedtznwwMExpPbAn5lARw81JjTDG1jONyJN
sEtoK31eQHcbBYtbOk17MWF5TeFlsPm7aap2/seKXE/djuS9yUZP6tTjCwN/6A0J
FDwUrNL2yek=
=MxJ5
-----END PGP SIGNATURE-----


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

* Re: ksh autoloading
  1997-03-26 17:46 ksh autoloading Zefram
@ 1997-03-27 18:15 ` Roderick Schertler
  1997-03-27 18:36   ` Zefram
  0 siblings, 1 reply; 6+ messages in thread
From: Roderick Schertler @ 1997-03-27 18:15 UTC (permalink / raw)
  To: Zefram; +Cc: zsh-workers

On Wed, 26 Mar 1997 17:46:21 GMT, Zefram <zefram@dcs.warwick.ac.uk> said:
> 
> The new scheme is that when a list has been read from the file and parsed,
> it is examined to see if it is *in its entirety* a definition of the
> function being loaded.  If it is, then the contents of that definition
> is used, rather than the complete list.  This has much better defined
> semantics than the old method.

One of the nicest things about the ksh semantics are that you can define
the function plus run some initialization code.  It sounds like your
patch will disallow that.

-- 
Roderick Schertler
roderick@argon.org


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

* Re: ksh autoloading
  1997-03-27 18:15 ` Roderick Schertler
@ 1997-03-27 18:36   ` Zefram
  1997-03-27 18:57     ` Roderick Schertler
  0 siblings, 1 reply; 6+ messages in thread
From: Zefram @ 1997-03-27 18:36 UTC (permalink / raw)
  To: Roderick Schertler; +Cc: Z Shell workers mailing list

Roderick Schertler wrote:
>One of the nicest things about the ksh semantics are that you can define
>the function plus run some initialization code.  It sounds like your
>patch will disallow that.

Not at all.  Using the zsh style, we can autoload a function foo from
a file saying:

foodate=`date`
foo () {
  echo $foodate
}
foo

whereas the ksh equivalent merely omits that last line.  One could even do

foodate=`date`
foo () {
  echo $foodate
}
[[ -n "${ZSH_VERSION+set}" ]] && foo

to make it work the same under both ksh and zsh.

Remember that the zsh form of autoloading is the canonical one, to be
preferred, and technically superior in some ways to the ksh semantics.
I think it's more important for self-modifying functions using the
zsh style to work correctly than it is for ksh style functions with
initialisation code to work exactly the way they do in ksh.  Not to
mention that the new system is simpler.

-zefram


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

* Re: ksh autoloading
  1997-03-27 18:36   ` Zefram
@ 1997-03-27 18:57     ` Roderick Schertler
  1997-03-27 19:11       ` Zefram
  0 siblings, 1 reply; 6+ messages in thread
From: Roderick Schertler @ 1997-03-27 18:57 UTC (permalink / raw)
  To: Zefram; +Cc: Z Shell workers mailing list

On Thu, 27 Mar 1997 18:36:04 +0000 (GMT), Zefram <zefram@dcs.warwick.ac.uk> said:
> Roderick Schertler wrote:
>>
>> One of the nicest things about the ksh semantics are that you can define
>> the function plus run some initialization code.  It sounds like your
>> patch will disallow that.
>
> Not at all.  Using the zsh style, we can autoload a function foo from
> a file saying:

Well, of course, if the function is written knowing it could run under
ksh or zsh then it can be made to work.  The problem is that a function
which was written in ksh style will suddenly stop working (on first
invocation).

> Remember that the zsh form of autoloading is the canonical one, to be
> preferred, and technically superior in some ways to the ksh semantics.

I don't see how the zsh behavior is superior, and I do see advantages to
the ksh behavior.  I always figured it was an oversight/misunderstanding
on the part of pws, like the [16]ff business.

Consider a file which provides 3 tightly related functions and runs some
initialization code.  I used such a think for directory stack handling
in ksh, eg.  In ksh you link it to the 3 names.  In zsh you have to do
some work.  I can't think of a real example which zsh makes easier than
ksh.

> I think it's more important for self-modifying functions using the zsh
> style to work correctly than it is for ksh style functions with
> initialisation code to work exactly the way they do in ksh.

I wanted to be sure you knew you were breaking ksh compatibility.  Since
you know and you still think it's right that's okay with me.  I don't
feel strongly about the issue because there are workarounds.  I used to
use these workarounds before zsh provided any ksh autoloading, I could
go back to using them if I found I needed to start using ksh again.

-- 
Roderick Schertler
roderick@argon.org


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

* Re: ksh autoloading
  1997-03-27 18:57     ` Roderick Schertler
@ 1997-03-27 19:11       ` Zefram
  0 siblings, 0 replies; 6+ messages in thread
From: Zefram @ 1997-03-27 19:11 UTC (permalink / raw)
  To: Roderick Schertler; +Cc: Z Shell workers mailing list

Roderick Schertler wrote:
>Well, of course, if the function is written knowing it could run under
>ksh or zsh then it can be made to work.  The problem is that a function
>which was written in ksh style will suddenly stop working (on first
>invocation).

That used to be the case for *all* ksh style functions.  With this
patch in place, the most common case by far -- a single function with
no initialisation code -- is handled properly.

>I don't see how the zsh behavior is superior, and I do see advantages to
>the ksh behavior.

With zsh, you can have a file that is used both as an autoloaded shell
function and as a shell script.  It also makes it impossible to have
an autoloaded shell function that, when successfully autoloaded, still
isn't defined.

>Consider a file which provides 3 tightly related functions and runs some
>initialization code.  I used such a think for directory stack handling
>in ksh, eg.  In ksh you link it to the 3 names.  In zsh you have to do
>some work.

OK, use the line

[[ -n "${ZSH_VERSION+set}" ]] && "$0" "$@"

instead of what I previously suggested.

>I wanted to be sure you knew you were breaking ksh compatibility.

We never had complete ksh compatibility anyway.  Perhaps we need an
option to behave exactly like ksh here, i.e., just source the file before
running the function.

I look on the patch as improving zsh compatibility.  It means that any
function written in the zsh style (except for the one perverse case of
a function that does nothing but redefine itself) will work as expected.

-zefram


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

* ksh autoloading
@ 1997-04-01  0:08 Zefram
  0 siblings, 0 replies; 6+ messages in thread
From: Zefram @ 1997-04-01  0:08 UTC (permalink / raw)
  To: zsh-workers

-----BEGIN PGP SIGNED MESSAGE-----

This patch makes autoloading work *exactly* like ksh -- at least, it does
in ksh emulation mode.  There is a new option, KSH_AUTOLOAD (the 110th
option if all my recent ones are accepted), which makes the function
definition file just be sourced, regardless of what (if anything) it does.

The autoloading mechanism is also changed.  Rather than sorting out the
autoloading when looking up the function definition, the autoloading
*is* the definition -- a special type of command, used only in undefined
functions.  When this command gets executed, it autoloads and then calls
the function.  What this buys, other than simplicity and maintainability,
is that in the KSH_AUTOLOAD case it sources the file in the context of the
function execution, as ksh does.  In fact, the file can even declare local
parameters, that are still in scope during the first function execution,
but go out of scope thereafter.

There is one remaining incompatibility between ksh and zsh autoloading.
In ksh, if a command can't be found in $PATH, it is treated as
an autoloaded function and searched for in $FPATH as a fallback.
I'll implement this in a separate patch.

This patch depends on my previous autoloading patch, of course.

 -zefram

begin 644 autoload_patch.gz
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
B6#W2Y:TEQ684J\8<H_94H[FBTAS$DM%Z\=_4Y80:(C\`````
`
end

-----BEGIN PGP SIGNATURE-----
Version: 2.6.3ia
Charset: ascii

iQCVAwUBMz9tknD/+HJTpU/hAQHjZgQAhPHc5ysXCTYTVbGI4543WqPEpm2d+THE
+MzTSOJScCJ3ki78cHVtpMJ3xRhTF9lh8PX05dKV0UJYOai5QLARgtd7Dc1QxgyF
pnPHfaJBfij8AiA4QRc6uVknHja+JBlXzA+quWt0t4tivOqAGZw7nTJ0+8x1j5qi
qWvydubJoEo=
=8CMI
-----END PGP SIGNATURE-----


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

end of thread, other threads:[~1997-04-01  0:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1997-03-26 17:46 ksh autoloading Zefram
1997-03-27 18:15 ` Roderick Schertler
1997-03-27 18:36   ` Zefram
1997-03-27 18:57     ` Roderick Schertler
1997-03-27 19:11       ` Zefram
1997-04-01  0:08 Zefram

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