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

[PATCH] Eliminate getparamnode() and the distinction between getnode() and getnode2()



This patch uses the functions newly introduced by workers/55145 to replace all [real]paramtab->getnode() and ->getnode2() calls with calls to getparam(), loadparam(), and resolveparam() that explicitly state what is intended. Most tab->getnode(tab, name) calls are replaced with an equivalent resolveparam(name, /*load=*/1) call and most tab->getnode2(tab, name) calls with an equivalent getparam(name) call but some calls are replaced by calls that do slightly less or more than their equivalent call. For example, there are cases where there is no need to load the resolved parameter or cases where the looked up parameter should not only exist but also be one that is set. For an easier review, the different replacements are split into separate commits on GitHub.

Once all getnode() calls have been replaced, there is no longer any need to have distinct getnode() and getnode2() functions for the parameter table. Both can use gethashnode2(), i.e., simply return the node/parameter with the requested name, and getparamnode() can be eliminated.

Eliminate getparamnode() and the distinction between getnode() and getnode2()
  (depends on workers/55145)

Philippe

diff --git a/Src/Modules/db_gdbm.c b/Src/Modules/db_gdbm.c
index 4df86089e..0cd9a23d4 100644
--- a/Src/Modules/db_gdbm.c
+++ b/Src/Modules/db_gdbm.c
@@ -130,8 +130,7 @@ bin_ztie(char *nam, char **args, Options ops, UNUSED(int func))
     resource_name = OPT_ARG(ops, 'f');
     pmname = *args;
 
-    if ((tied_param = (Param)realparamtab->getnode(realparamtab, pmname)) &&
-	!(tied_param->node.flags & PM_UNSET)) {
+    if ((tied_param = asset_pm(resolveparam(pmname, 0)))) {
 	/*
 	 * Unset any existing parameter.  Note there's no implicit
 	 * "local" here, but if the existing parameter is local
@@ -203,8 +202,8 @@ bin_zuntie(char *nam, char **args, Options ops, UNUSED(int func))
     int ret = 0;
 
     for (pmname = *args; *args++; pmname = *args) {
-	pm = (Param) realparamtab->getnode(realparamtab, pmname);
-	if(!pm) {
+	pm = resolveparam(pmname, 0);
+	if (!isset_pm(pm)) {
 	    zwarnnam(nam, "cannot untie %s", pmname);
 	    ret = 1;
 	    continue;
@@ -243,8 +242,8 @@ bin_zgdbmpath(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
         return 1;
     }
 
-    pm = (Param) realparamtab->getnode(realparamtab, pmname);
-    if(!pm) {
+    pm = resolveparam(pmname, 0);
+    if (!isset_pm(pm)) {
         zwarnnam(nam, "no such parameter: %s", pmname);
         return 1;
     }
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index 2bcfe81a3..972496d42 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -92,9 +92,8 @@ paramtypestr(Param pm, int append)
 	val = dupstring("");
 
     if (append) {
-	if ((pm->node.flags & PM_NAMEREF) && pm->u.str && *(pm->u.str) &&
-		(pm = (Param) realparamtab->getnode(realparamtab, pm->node.nam)) &&
-		!(pm->node.flags & PM_UNSET)) {
+	if ((pm->node.flags & PM_NAMEREF) &&
+	    (pm = asset_pm(resolveparam_pm(pm, 0)))) {
 	    val = zhtricat(val, "-", paramtypestr(pm, 0));
 	}
     }
@@ -111,8 +110,7 @@ getpmparameter(UNUSED(HashTable ht), const char *name)
     pm->node.nam = dupstring(name);
     pm->node.flags = PM_SCALAR | PM_READONLY;
     pm->gsu.s = &nullsetscalar_gsu;
-    if ((rpm = (Param) realparamtab->getnode2(realparamtab, name)) &&
-	!(rpm->node.flags & PM_UNSET)) {
+    if ((rpm = asset_pm(getparam(name)))) {
 	pm->u.str = paramtypestr(rpm, 1);
     } else {
 	pm->u.str = dupstring("");
diff --git a/Src/Modules/watch.c b/Src/Modules/watch.c
index dc601619f..4124ed665 100644
--- a/Src/Modules/watch.c
+++ b/Src/Modules/watch.c
@@ -747,9 +747,9 @@ boot_(UNUSED(Module m))
     /* These two parameters are only set to defaults if not set.
      * So setting them in .zshrc will not be enough to load the
      * module. It's useless until the watch array is set anyway. */
-    if (!realparamtab->getnode2(realparamtab, "WATCHFMT"))
+    if (!isset_pm(getparam("WATCHFMT")))
 	setsparam("WATCHFMT", ztrdup_metafy(default_watchfmt));
-    if (!realparamtab->getnode2(realparamtab, "LOGCHECK"))
+    if (!isset_pm(getparam("LOGCHECK")))
 	setiparam("LOGCHECK", 60);
 
     addprepromptfn(&checksched);
diff --git a/Src/Modules/zftp.c b/Src/Modules/zftp.c
index b631c57cf..cc32b29f8 100644
--- a/Src/Modules/zftp.c
+++ b/Src/Modules/zftp.c
@@ -493,8 +493,7 @@ zfsetparam(char *name, void *val, int flags)
     Param pm = NULL;
     int type = (flags & ZFPM_INTEGER) ? PM_INTEGER : PM_SCALAR;
 
-    if (!(pm = (Param) realparamtab->getnode2(realparamtab, name))
-	|| (pm->node.flags & PM_UNSET)) {
+    if (!(pm = asset_pm(getparam(name)))) {
 	/*
 	 * just make it readonly when creating, in case user
 	 * *really* knows what they're doing
@@ -527,7 +526,7 @@ zfunsetparam(char *name)
 {
     Param pm;
 
-    if ((pm = (Param) realparamtab->getnode2(realparamtab, name))) {
+    if ((pm = asset_pm(getparam(name)))) {
 	pm->node.flags &= ~PM_READONLY;
 	unsetparam_pm(pm, 0, 1);
     }
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index 96d58d380..60bf6eb6b 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1352,7 +1352,7 @@ makecompparams(void)
     if (!(cpm = createparam(
 	      COMPSTATENAME,
 	      PM_SPECIAL|PM_REMOVABLE|PM_SINGLE|PM_LOCAL|PM_HASHED)))
-	cpm = (Param) realparamtab->getnode2(realparamtab, COMPSTATENAME);
+	cpm = getparam(COMPSTATENAME);
     DPUTS1(!cpm, "param %s not set in makecompparams", COMPSTATENAME);
 
     comprpms[CPN_COMPSTATE] = cpm;
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index e8a6b6422..0ac758fbe 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1082,7 +1082,7 @@ do_single(Cmatch m)
 			} else
 			    n = p + 1;
 
-			if ((pm = (Param) realparamtab->getnode(realparamtab, n)) &&
+			if ((pm = resolveparam(n, 1)) ||
 			    PM_TYPE(pm->node.flags) != PM_SCALAR)
 			    tryit = 0;
 		    }
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 921ebb9ec..8aca7a0cb 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1867,7 +1867,7 @@ bin_vared(char *name, char **args, Options ops, UNUSED(int func))
 	createparam(args[0], type);
     }
     queue_signals();
-    pm = (Param) realparamtab->getnode(realparamtab, args[0]);
+    pm = asset_pm(resolveparam(args[0], 1));
     if (pm && (PM_TYPE(pm->node.flags) & (PM_ARRAY|PM_HASHED))) {
 	char **a;
 
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index b828e145c..5305ef23c 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -200,7 +200,7 @@ makezleparams(int ro)
 	Param pm = createparam(zp->name, (zp->type |PM_SPECIAL|PM_REMOVABLE|
 					  PM_LOCAL|(ro ? PM_READONLY : 0)));
 	if (!pm)
-	    pm = (Param) realparamtab->getnode2(realparamtab, zp->name);
+	    pm = getparam(zp->name);
 	DPUTS1(!pm, "param %s not set in makezleparams", zp->name);
 
 	pm->level = locallevel + 1;
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index ce9639531..41cd9d460 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -683,8 +683,7 @@ bin_zle_flags(char *name, char **args, UNUSED(Options ops), UNUSED(char func))
 		    if (invicmdmode()) {
 			startvichange(-1);
 			if (zmod.flags & (MOD_MULT|MOD_TMULT)) {
-			    Param pm = (Param)
-				realparamtab->getnode2(realparamtab, "NUMERIC");
+			    Param pm = getparam("NUMERIC");
 			    if (pm && pm->node.flags & PM_SPECIAL)
 				pm->node.flags &= ~PM_UNSET;
 			}
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 8f8776da3..b3ff29c2f 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -1512,8 +1512,7 @@ get_comp_string(void)
 	    zlemetacs_qsub - wb) {
 	    s = NULL;
 	    inwhat = IN_MATH;
-	    if ((keypm = (Param)
-		 realparamtab->getnode(realparamtab, varname)) &&
+	    if ((keypm = asset_pm(resolveparam(varname, 1))) &&
 		(keypm->node.flags & PM_HASHED))
 		insubscr = 2;
 	    else
@@ -1613,8 +1612,7 @@ get_comp_string(void)
 		zsfree(varname);
 		varname = ztrdup(nb);
 		*ne = sav;
-		if ((keypm = (Param)
-		     realparamtab->getnode(realparamtab, varname)) &&
+		if ((keypm = asset_pm(resolveparam(varname, 1))) &&
 		    (keypm->node.flags & PM_HASHED))
 		    insubscr = 2;
 	    }
@@ -1695,8 +1693,7 @@ get_comp_string(void)
 	    if (wptr < sqbr) {
 		zsfree(varname);
 		varname = ztrduppfx(wptr, sqbr - wptr);
-		if ((keypm = (Param)
-		     realparamtab->getnode(realparamtab, varname)) &&
+		if ((keypm = asset_pm(resolveparam(varname, 1))) &&
 		    (keypm->node.flags & PM_HASHED)) {
 		    if (insubscr != 3)
 			insubscr = 2;
diff --git a/Src/builtin.c b/Src/builtin.c
index 794da3062..15d669cef 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -804,13 +804,13 @@ set_pwd_env(void)
 
     /* update the PWD and OLDPWD shell parameters */
 
-    pm = (Param) realparamtab->getnode2(realparamtab, "PWD");
+    pm = getparam("PWD");
     if (pm && PM_TYPE(pm->node.flags) != PM_SCALAR) {
 	pm->node.flags &= ~PM_READONLY;
 	unsetparam_pm(pm, 0, 1);
     }
 
-    pm = (Param) realparamtab->getnode2(realparamtab, "OLDPWD");
+    pm = getparam("OLDPWD");
     if (pm && PM_TYPE(pm->node.flags) != PM_SCALAR) {
 	pm->node.flags &= ~PM_READONLY;
 	unsetparam_pm(pm, 0, 1);
@@ -819,10 +819,10 @@ set_pwd_env(void)
     assignsparam("PWD", ztrdup(pwd), 0);
     assignsparam("OLDPWD", ztrdup(oldpwd), 0);
 
-    pm = (Param) realparamtab->getnode2(realparamtab, "PWD");
+    pm = getparam("PWD");
     if (!(pm->node.flags & PM_EXPORTED))
 	addenv(pm, pwd);
-    pm = (Param) realparamtab->getnode2(realparamtab, "OLDPWD");
+    pm = getparam("OLDPWD");
     if (!(pm->node.flags & PM_EXPORTED))
 	addenv(pm, oldpwd);
 }
@@ -2410,8 +2410,7 @@ typeset_single(char *cname, char *pname, Param pm, int func,
 	tpm = (Param) zshcalloc(sizeof *tpm);
 
 	tpm->node.nam = pm->node.nam;
-	if (pm->ename &&
-	    (pm2 = (Param) paramtab->getnode(paramtab, pm->ename)) &&
+	if (pm->ename && (pm2 = resolveparam(pm->ename, 1)) &&
 	    pm2->level == locallevel) {
 	    /* This is getting silly, but anyway:  if one of a path/PATH
 	     * pair has already been made local at the current level, we
@@ -2476,10 +2475,7 @@ typeset_single(char *cname, char *pname, Param pm, int func,
 	    return NULL;
 	} else if ((on & PM_LOCAL) && locallevel) {
 	    *subscript = 0;
-	    pm = (Param) (paramtab == realparamtab ?
-			  /* getnode2() to avoid autoloading */
-			  paramtab->getnode2(paramtab, pname) :
-			  paramtab->getnode(paramtab, pname));
+	    pm = getparam(pname);
 	    *subscript = '[';
 	    if (!pm || pm->level != locallevel) {
 		zerrnam(cname,
@@ -2531,7 +2527,7 @@ typeset_single(char *cname, char *pname, Param pm, int func,
      * not entirely clear to me isident() should reject
      * specially named parameters given that it accepts digits.
      */
-    else if ((isident(pname) || paramtab->getnode(paramtab, pname))
+    else if ((isident(pname) || getparam(pname))
 	     && (!idigit(*pname) || !strcmp(pname, "0"))) {
 	/*
 	 * Create a new node for a parameter with the flags in `on' minus the
@@ -2913,8 +2909,8 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	else
 	    joinchar = *joinstr;
 
-	pm = (Param) paramtab->getnode(paramtab, asg0.name);
-	apm = (Param) paramtab->getnode(paramtab, asg->name);
+	pm = resolveparam(asg0.name, 1);
+	apm = resolveparam(asg->name, 1);
 
 	if (pm && (pm->node.flags & (PM_SPECIAL|PM_TIED)) == (PM_SPECIAL|PM_TIED)) {
 	    /*
@@ -3001,9 +2997,7 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	asg2.name = asg->name;
 	asg2.flags = 0;
 	asg2.value.array = (LinkList)0;
-	if (!(apm=typeset_single(name, asg->name,
-				 (Param)paramtab->getnode(paramtab,
-							  asg->name),
+	if (!(apm=typeset_single(name, asg->name, resolveparam(asg->name, 1),
 				 func, (on | PM_ARRAY) & ~PM_EXPORTED,
 				 off, roff, &asg2, NULL, ops, 0))) {
 	    if (oldval)
@@ -3116,13 +3110,10 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 
     /* Take arguments literally.  Don't glob */
     while ((asg = getasg(&argv, assigns))) {
-	HashNode hn = (paramtab == realparamtab ?
-		       /* getnode2() to avoid autoloading */
-		       paramtab->getnode2(paramtab, asg->name) :
-		       paramtab->getnode(paramtab, asg->name));
+	pm = getparam(asg->name);
 	if (OPT_ISSET(ops,'p')) {
-	    if (hn)
-		paramtab->printnode(hn, printflags);
+	    if (pm)
+		paramtab->printnode((HashNode) pm, printflags);
 	    else {
 		zwarnnam(name, "no such variable: %s", asg->name);
 		returnval = 1;
@@ -3130,8 +3121,7 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	    continue;
 	}
 
-	if (!typeset_single(name, asg->name, (Param)hn,
-			    func, on, off, roff, asg, NULL,
+	if (!typeset_single(name, asg->name, pm, func, on, off, roff, asg, NULL,
 			    ops, 0))
 	    returnval = 1;
     }
diff --git a/Src/exec.c b/Src/exec.c
index b0794abab..68f793aed 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -4485,7 +4485,7 @@ save_params(Estate state, Wordcode pc, LinkList *restore_p, LinkList *remove_p)
 	char *ss = itype_end(s, INAMESPC, 0);
 	int slen = *ss == '[' || *ss == Inbrack ? ss - s : strlen(s);
 	addlinknode(*remove_p, s = dupstring_wlen(s, slen));
-	if ((pm = (Param) paramtab->getnode(paramtab, s))) {
+	if ((pm = resolveparam(s, 1))) {
 	    Param tpm = NULL;
 	    if (pm->env)
 		delenv(pm);
@@ -4533,7 +4533,7 @@ restore_params(LinkList restorelist, LinkList removelist)
 
     /* remove temporary parameters */
     while ((s = (char *) ugetnode(removelist))) {
-	if ((pm = (Param) paramtab->getnode(paramtab, s)) &&
+	if ((pm = resolveparam(s, 1)) &&
 	    !(pm->node.flags & PM_SPECIAL)) {
 	    pm->node.flags &= ~PM_READONLY;
 	    unsetparam_pm(pm, 0, 0);
@@ -4544,7 +4544,7 @@ restore_params(LinkList restorelist, LinkList removelist)
 	/* restore saved parameters */
 	while ((pm = (Param) ugetnode(restorelist))) {
 	    if (pm->node.flags & PM_SPECIAL) {
-		Param tpm = (Param) paramtab->getnode(paramtab, pm->node.nam);
+		Param tpm = resolveparam(pm->node.nam, 1);
 
 		DPUTS(!tpm || PM_TYPE(pm->node.flags) != PM_TYPE(tpm->node.flags) ||
 		      !(pm->node.flags & PM_SPECIAL),
diff --git a/Src/init.c b/Src/init.c
index c5e915bb1..048ec061b 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -190,7 +190,7 @@ loop(int toplevel, int justonce)
 	    non_empty = 1;
 	    if (toplevel &&
 		(getshfunc("preexec") ||
-		 realparamtab->getnode2(realparamtab, "preexec" HOOK_SUFFIX))) {
+		 isset_pm(resolveparam("preexec" HOOK_SUFFIX, 1)))) {
 		LinkList args;
 		char *cmdstr;
 
diff --git a/Src/math.c b/Src/math.c
index 517c18118..b778b1f22 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -979,12 +979,10 @@ setmathvar(struct mathvalue *mvp, mnumber v)
 	 * Be ultra-paranoid in checking the variable is still valid.
 	 */
 	char *s = mvp->lval, *ptr;
-	Param pm;
 	DPUTS(!mvp->lval, "no variable name but variable value in math");
 	if ((ptr = strchr(s, '[')))
 	    s = dupstrpfx(s, ptr - s);
-	pm = (Param) paramtab->getnode(paramtab, s);
-	if (pm == mvp->pval->pm) {
+	if (resolveparam(s, 0) == mvp->pval->pm) {
 	    if (noeval)
 		return v;
 	    setnumvalue(mvp->pval, v);
diff --git a/Src/module.c b/Src/module.c
index 9577cc278..c95dbb4a8 100644
--- a/Src/module.c
+++ b/Src/module.c
@@ -1026,7 +1026,7 @@ checkaddparam(const char *nam, int opt_i)
 {
     Param pm;
 
-    if (!(pm = (Param) realparamtab->getnode2(realparamtab, nam)))
+    if (!(pm = getparam(nam)))
 	return 0;
 
     if (pm->level || !(pm->node.flags & PM_AUTOLOAD)) {
@@ -1070,7 +1070,7 @@ addparamdef(Paramdef d)
 	    return 1;
     }
     else if (!(pm = createparam(d->name, d->flags)) &&
-	!(pm = (Param) realparamtab->getnode2(realparamtab, d->name)))
+	     !(pm = getparam(d->name)))
 	return 1;
 
     d->pm = pm;
@@ -1127,7 +1127,7 @@ addparamdef(Paramdef d)
 int
 deleteparamdef(Paramdef d)
 {
-    Param pm = (Param) realparamtab->getnode2(realparamtab, d->name);
+    Param pm = getparam(d->name);
 
     if (!pm)
 	return 1;
@@ -1238,7 +1238,7 @@ add_autoparam(const char *module, const char *pnam, int flags)
 static int
 del_autoparam(UNUSED(const char *modnam), const char *pnam, int flags)
 {
-    Param pm = (Param) realparamtab->getnode2(realparamtab, pnam);
+    Param pm = getparam(pnam);
 
     if (!pm) {
 	if (!(flags & FEAT_IGNORE))
diff --git a/Src/params.c b/Src/params.c
index c5248a40f..03ab0479f 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -564,7 +564,7 @@ newparamtable(int size, char const *name)
     ht->filltable   = NULL;
     ht->cmpnodes    = strcmp;
     ht->addnode     = addhashnode;
-    ht->getnode     = gethashnode2; /* getparamnode for realparamtab */
+    ht->getnode     = gethashnode2;
     ht->getnode2    = gethashnode2;
     ht->removenode  = removehashnode;
     ht->disablenode = NULL;
@@ -575,14 +575,6 @@ newparamtable(int size, char const *name)
     return ht;
 }
 
-/**/
-static HashNode
-getparamnode(HashTable ht, const char *nam)
-{
-    DPUTS(ht != realparamtab, "BUG: getparamnode: ht != realparamtab");
-    return (HashNode) resolveparam_pm(getparam(nam), 1);
-}
-
 /* Returns whether the parameter is set. */
 
 /**/
@@ -1035,8 +1027,6 @@ createparamtable(void)
 #endif
 
     paramtab = realparamtab = newparamtable(151, "paramtab");
-    paramtab->getnode = getparamnode;
-
     /* Add the special parameters to the hash table */
     for (ip = special_params; ip->node.nam; ip++)
 	paramtab->addnode(paramtab, ztrdup(ip->node.nam), ip);
@@ -1051,7 +1041,7 @@ createparamtable(void)
     argvparam = (Param) &argvparam_pm;
     argnparams = zshcalloc(8 * sizeof(Param));
     argnparams_size = 8;
-    argnparams[0] = (Param) paramtab->getnode(paramtab, "0");
+    argnparams[0] = getparam("0");
 
     noerrs = 2;
 
@@ -1114,8 +1104,7 @@ createparamtable(void)
 		 * aren't special to the shell, so it's always OK to
 		 * import.  Otherwise, check parameter flags.
 		 */
-		if ((!(pm = (Param) paramtab->getnode(paramtab, iname)) ||
-		     !dontimport(pm->node.flags)) &&
+		if ((!(pm = getparam(iname)) || !dontimport(pm->node.flags)) &&
 		    (pm = assignsparam(iname, metafy(ivalue, -1, META_DUP),
 				       ASSPM_ENV_IMPORT))) {
 		    pm->node.flags |= PM_EXPORTED;
@@ -1141,7 +1130,7 @@ createparamtable(void)
      * For native emulation we always set the variable home
      * (see setupvals()).
      */
-    pm = (Param) realparamtab->getnode2(realparamtab, "HOME");
+    pm = getparam("HOME");
     if (EMULATION(EMULATE_ZSH))
     {
 	pm->node.flags &= ~PM_UNSET;
@@ -1149,10 +1138,10 @@ createparamtable(void)
 	    addenv(pm, home);
     } else if (!home)
 	pm->node.flags |= PM_UNSET;
-    pm = (Param) realparamtab->getnode2(realparamtab, "LOGNAME");
+    pm = getparam("LOGNAME");
     if (!(pm->node.flags & PM_EXPORTED))
 	addenv(pm, pm->u.str);
-    pm = (Param) realparamtab->getnode2(realparamtab, "SHLVL");
+    pm = getparam("SHLVL");
     sprintf(buf, "%d", (int)++shlvl);
     /* shlvl value in environment needs updating unconditionally */
     addenv(pm, buf);
@@ -1250,7 +1239,7 @@ createparam(char *name, int flags)
 	    DPUTS(paramtab != realparamtab, "BUG: createparam/ro-by-design: paramtab != realparamtab");
 	    if (!(flags & PM_LOCAL)) {
 		/* Must call the API for namerefs and specials to work */
-		pm = (Param) paramtab->getnode2(paramtab, oldpm->node.nam);
+		pm = getparam(oldpm->node.nam);
 		if (!pm || ((pm->node.flags & PM_NAMEREF) &&
 			    pm->level != locallevel)) {
 		    zerr("%s: can't modify read-only parameter", name);
@@ -1329,8 +1318,7 @@ createparam(char *name, int flags)
 		oldpm->node.flags &= ~PM_UNSET;
 		if ((oldpm->node.flags & PM_SPECIAL) && oldpm->ename) {
 		    DPUTS(paramtab != realparamtab, "BUG: createparam/ename: paramtab != realparamtab");
-		    Param altpm =
-			(Param) paramtab->getnode(paramtab, oldpm->ename);
+		    Param altpm = resolveparam(oldpm->ename, 1);
 		    if (altpm)
 			altpm->node.flags &= ~PM_UNSET;
 		}
@@ -3839,7 +3827,7 @@ assignnparam(char *s, mnumber val, int flags)
 	    unqueue_signals();
 	    return NULL;
 	}
-	if (!pm && !(pm = (Param) paramtab->getnode(paramtab, t))) {
+	if (!pm && !(pm = resolveparam(t, 1))) {
 	    DPUTS(!pm, "BUG: parameter not created");
 	    if (!errflag)
 		zerr("%s: parameter not found", t);
@@ -3933,10 +3921,7 @@ resetparam(Param pm, int flags)
     DPUTS(paramtab != realparamtab, "BUG: resetparam: paramtab != realparamtab");
     char *s = pm->node.nam;
     queue_signals();
-    if (pm != (Param)(paramtab == realparamtab ?
-	       /* getnode2() to avoid autoloading */
-	       paramtab->getnode2(paramtab, s) :
-	       paramtab->getnode(paramtab, s))) {
+    if (pm != getparam(s)) {
 	unqueue_signals();
 	zerr("can't change type of hidden variable: %s", s);
 	return 1;
@@ -3958,8 +3943,7 @@ unsetparam(char *s)
 
     queue_signals();
     if ((pm = (Param) (paramtab == realparamtab ?
-		       /* getnode2() to avoid autoloading */
-		       paramtab->getnode2(paramtab, s) :
+		       (HashNode) getparam(s) :
 		       paramtab->getnode(paramtab, s))) &&
 	!(pm->node.flags & PM_NAMEREF))
 	unsetparam_pm(pm, 0, 1);
@@ -4000,7 +3984,7 @@ unsetparam_pm(Param pm, int altflag, int exp)
     /* remove it under its alternate name if necessary */
     if (altremove) {
 	DPUTS(paramtab != realparamtab, "BUG: unsetparam_pm/ename: paramtab != realparamtab");
-	altpm = (Param) paramtab->getnode(paramtab, altremove);
+	altpm = resolveparam(altremove, 1);
 	/* tied parameters are at the same local level as each other */
 	oldpm = NULL;
 	/*
@@ -4053,11 +4037,8 @@ unsetparam_pm(Param pm, int altflag, int exp)
      * Global variables can only be deleted if they aren't hidden by a
      * local one with the same name.
      */
-    if (!pm->level &&
-	pm != (Param) (paramtab == realparamtab ?
-		       /* getnode2() to avoid autoloading */
-		       paramtab->getnode2(paramtab, pm->node.nam) :
-		       paramtab->getnode(paramtab, pm->node.nam))) {
+    if (!pm->level && paramtab == realparamtab &&
+	pm != getparam(pm->node.nam)) {
 	LinkList refs;
 	if (!scoperefs)
 	    scoperefs = zshcalloc((scoperefs_num = 8) * sizeof(refs));
@@ -4512,7 +4493,7 @@ tiedarrsetfn(Param pm, char *x)
     if (*dptr->arrptr)
 	freearray(*dptr->arrptr);
     else if (pm->ename) {
-	Param altpm = (Param) paramtab->getnode(paramtab, pm->ename);
+	Param altpm = resolveparam(pm->ename, 1);
 	if (altpm)
 	    altpm->node.flags &= ~PM_DEFAULTED;
     }
@@ -5485,8 +5466,8 @@ arrfixenv(char *s, char **t)
     if (t == path)
 	cmdnamtab->emptytable(cmdnamtab);
 
-    pm = (Param) paramtab->getnode(paramtab, s);
-    
+    pm = resolveparam(s, 1);
+
     /*
      * Only one level of a parameter can be exported.  Unless
      * ALLEXPORT is set, this must be global.
@@ -6473,7 +6454,7 @@ printparamnode(HashNode hn, int printflags)
 	     * (same for (a b:c)...)
 	     */
 	    DPUTS(paramtab != realparamtab, "BUG: printparamnode_pm/ename: paramtab != realparamtab");
-	    Param tmp = (Param) paramtab->getnode(paramtab, p->ename);
+	    Param tmp = resolveparam(p->ename, 1);
 
 	    /*
 	     * Swap param and tied peer for typeset -p output
diff --git a/Src/utils.c b/Src/utils.c
index 372d2a828..acb4317e7 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1254,8 +1254,7 @@ getnameddir(char *name)
     /* Check if there is a scalar parameter with this name whose value *
      * begins with a `/'.  If there is, add it to the hash table and   *
      * return the new value.                                           */
-    if ((pm = (Param) realparamtab->getnode2(realparamtab, name)) &&
-	!pm->level &&
+    if ((pm = asset_pm(getparam(name))) && !pm->level &&
 	    (PM_TYPE(pm->node.flags) == PM_SCALAR) &&
 	    (str = getsparam(name)) && *str == '/') {
 	pm->node.flags |= PM_NAMEDDIR;


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