File ksh93-array.dif of Package ksh

--- src/cmd/ksh93/sh/array.c
+++ src/cmd/ksh93/sh/array.c	2011-05-20 12:42:14.555927664 +0000
@@ -410,7 +410,7 @@ static Namfun_t *array_clone(Namval_t *n
 		mq = 0;
 		if(nq=nv_opensub(np))
 			mq = nv_search(name,ap->table,NV_ADD);
-		if(nq && (flags&NV_COMVAR) && nv_isvtree(nq))
+		if(nq && (((flags&NV_COMVAR) && nv_isvtree(nq)) || nv_isarray(nq)))
 		{
 			mq->nvalue.cp = 0;
 			if(!is_associative(ap))
@@ -458,6 +458,7 @@ static char *array_getval(Namval_t *np,
 {
 	register Namarr_t *aq,*ap = (Namarr_t*)disc;
 	register Namval_t *mp;
+	register char     *cp=0;
 	if((mp=array_find(np,ap,ARRAY_LOOKUP))!=np)
 	{
 		if(!mp && !is_associative(ap) && (aq=(Namarr_t*)ap->scope))
@@ -466,7 +467,12 @@ static char *array_getval(Namval_t *np,
 			if((mp=array_find(np,aq,ARRAY_LOOKUP))==np)
 				return(nv_getv(np,&aq->hdr));
 		}
-		return(mp?nv_getval(mp):0);
+		if(mp)
+		{
+			cp = nv_getval(mp);
+			nv_offattr(mp,NV_EXPORT);
+		}
+		return(cp);
 	}
 	return(nv_getv(np,&ap->hdr));
 }
@@ -667,7 +673,7 @@ static struct index_array *array_grow(Na
 		ap->header.hdr.dsize = sizeof(*ap) + i;
 		i = 0;
 		ap->header.fun = 0;
-		if(nv_isnull(np) && nv_isattr(np,NV_NOFREE))
+		if((nv_isnull(np)|| np->nvalue.cp==Empty) && nv_isattr(np,NV_NOFREE))
 		{
 			i = ARRAY_TREE;
 			nv_offattr(np,NV_NOFREE);
@@ -1236,7 +1242,7 @@ void *nv_associative(register Namval_t *
 		for(;ap->cur=ap->pos; ap->pos=ap->nextpos)
 		{
 			ap->nextpos = (Namval_t*)dtnext(ap->header.table,ap->pos);
-			if(ap->cur->nvalue.cp)
+			if(!nv_isnull(ap->cur))
 			{
 				if((ap->header.nelem&ARRAY_NOCHILD) && nv_isattr(ap->cur,NV_CHILD))
 					continue;
openSUSE Build Service is sponsored by