From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9667 invoked from network); 30 Apr 1999 09:09:59 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 30 Apr 1999 09:09:59 -0000 Received: (qmail 13216 invoked by alias); 30 Apr 1999 09:09:43 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 6167 Received: (qmail 13209 invoked from network); 30 Apr 1999 09:09:42 -0000 Date: Fri, 30 Apr 1999 11:09:41 +0200 (MET DST) Message-Id: <199904300909.LAA22036@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: "Bart Schaefer"'s message of Thu, 29 Apr 1999 23:23:15 -0700 Subject: Re: PATCH and comments Re: PATCH: autoloaded parameters Bart Schaefer wrote: > First comment: This new code does not link with --disable-dynamic. Grrr, Sven, Wake Up. > Patch below. Thanks. > On Apr 28, 11:51am, Sven Wischnowsky wrote: > } Subject: PATCH: autoloaded parameters > } > } Autoloaded parameters are stored in it like normal parameters, but > } with a new flag (PM_AUTOLOAD). Then I changed the getnode-functions of > } paramtab to use a new function getparamnode() which calls > } gethashnode2() and then checks if the Param returned has the > } PM_AUTOLOAD flag set. If it has, the module is loaded. > [...] > } - To avoid having a `local' with the name of a parameter that will > } be autoloaded trigger the loading of the module, I had to change > } calls like `paramtab->getnode()' to `gethashnode2(paramtab,...)' > > Hrm. Is this really the only place to hook this in? Seems like doing > it there means that you load the module as soon as anybody references > the parameter, even if all that's done is to test whether it's set. > > Heck, it means the module gets loaded if "unset ..." is used on the > parameter! No, it doesn't. Because I've also hooked it into createparam(). But, yes, parameters are autoloaded when tested for settedness (err, well, you know what I mean). Somehow I liked that... To change this, we would, as you know, have to fiddle some more in paramsubst(). > And what happens in createparamtable() if there's an environment variable > with the same name as one of the autoloaded parameters? Or is it not > possible to have an autoloaded parameter at that point? Well, setupvals()->createparamtable() is called before init_bltinmods() registers autoloaded modules. So, currently there shouldn't be a problem. > } - For now, I made `typeset' without arguments not print the > } autoloaded parameters because we have virtually no information > } about them as long as the module is not loaded. But since `which' > } reports builtins even when their module isn't loaded yet, we might > } want to change this. (What exactly should it print then?) > > It should probably show the type as "undefined" the same as is done for > autoloaded functions. Hm, yes, sounds reasonable. Bye Sven --- os/params.c Thu Apr 29 11:57:27 1999 +++ Src/params.c Fri Apr 30 11:07:42 1999 @@ -2717,11 +2717,13 @@ Param p = (Param) hn; char *t, **u; - if (p->flags & (PM_UNSET | PM_AUTOLOAD)) + if (p->flags & PM_UNSET) return; /* Print the attributes of the parameter */ if (printflags & PRINT_TYPE) { + if (p->flags & PM_AUTOLOAD) + printf("undefined "); if (p->flags & PM_INTEGER) printf("integer "); else if (p->flags & PM_ARRAY) @@ -2755,6 +2757,11 @@ } quotedzputs(p->nam, stdout); + + if (p->flags & PM_AUTOLOAD) { + putchar('\n'); + return; + } if (printflags & PRINT_KV_PAIR) putchar(' '); else -- Sven Wischnowsky wischnow@informatik.hu-berlin.de