about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-09-11 11:09:15 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-09-11 11:09:15 +0000
commitb262d310b218102aeb88ec233acf77fe4d82f7ad (patch)
tree8273d4d13a27198fee1b4853af8c7202b64cb459
parent7b927aeac7ed5be0b3de8476e9f0b8fb88199b3d (diff)
downloadzsh-b262d310b218102aeb88ec233acf77fe4d82f7ad.tar.gz
zsh-b262d310b218102aeb88ec233acf77fe4d82f7ad.tar.xz
zsh-b262d310b218102aeb88ec233acf77fe4d82f7ad.zip
22686: unset array if assigning numeric parameter
-rw-r--r--ChangeLog5
-rw-r--r--Src/params.c73
-rw-r--r--Test/C01arith.ztst6
3 files changed, 43 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog
index 30fa6e7a0..fdbe5e16e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-11  Peter Stephenson  <pws@csr.com>
+
+	* 22686: Src/params.c: unset array if assigning numeric
+	parameter to it.
+
 2006-09-10  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
 	* 22685: Src/builtin.c: printf "%d" \'X should handle multibyte
diff --git a/Src/params.c b/Src/params.c
index 2a4a7a745..e60c8c740 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2495,46 +2495,9 @@ sethparam(char *s, char **val)
     return v->pm;
 }
 
-/**/
-mod_export Param
-setiparam(char *s, zlong val)
-{
-    struct value vbuf;
-    Value v;
-    char *t = s, *ss;
-    Param pm;
-    mnumber mnval;
-
-    if (!isident(s)) {
-	zerr("not an identifier: %s", s);
-	errflag = 1;
-	return NULL;
-    }
-    queue_signals();
-    if (!(v = getvalue(&vbuf, &s, 1))) {
-	if ((ss = strchr(s, '[')))
-	    *ss = '\0';
-	if (!(pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER)))
-	    pm = (Param) paramtab->getnode(paramtab, t);
-	DPUTS(!pm, "BUG: parameter not created");
-	if (ss) {
-	    *ss = '[';
-	} else {
-	    pm->base = outputradix;
-	}
-	v = getvalue(&vbuf, &t, 1);
-	DPUTS(!v, "BUG: value not found for new parameter");
-    }
-    mnval.type = MN_INTEGER;
-    mnval.u.l = val;
-    setnumvalue(v, mnval);
-    unqueue_signals();
-    return v->pm;
-}
 
 /*
- * Like setiparam(), but can take an mnumber which can be integer or
- * floating.
+ * Set a generic shell number, floating point or integer.
  */
 
 /**/
@@ -2543,7 +2506,7 @@ setnparam(char *s, mnumber val)
 {
     struct value vbuf;
     Value v;
-    char *t = s, *ss = NULL;
+    char *t = s, *ss;
     Param pm;
 
     if (!isident(s)) {
@@ -2552,8 +2515,23 @@ setnparam(char *s, mnumber val)
 	return NULL;
     }
     queue_signals();
-    if (!(v = getvalue(&vbuf, &s, 1))) {
-	if ((ss = strchr(s, '[')))
+    ss = strchr(s, '[');
+    v = getvalue(&vbuf, &s, 1);
+    if (v && (v->pm->node.flags & (PM_ARRAY|PM_HASHED)) &&
+	!(v->pm->node.flags & (PM_SPECIAL|PM_TIED)) &&
+	/*
+	 * not sure what KSHARRAYS has got to do with this...
+	 * copied this from assignsparam().
+	 */
+	unset(KSHARRAYS) && !ss) {
+	unsetparam_pm(v->pm, 0, 1);
+	s = t;
+	v = NULL;
+    }
+    if (!v) {
+	/* s has been updated by getvalue, so check again */
+	ss = strchr(s, '[');
+	if (ss)
 	    *ss = '\0';
 	pm = createparam(t, ss ? PM_ARRAY :
 			 (val.type & MN_INTEGER) ? PM_INTEGER : PM_FFLOAT);
@@ -2573,6 +2551,19 @@ setnparam(char *s, mnumber val)
     return v->pm;
 }
 
+/* Simplified interface to setnparam */
+
+/**/
+mod_export Param
+setiparam(char *s, zlong val)
+{
+    mnumber mnval;
+    mnval.type = MN_INTEGER;
+    mnval.u.l = val;
+    return setnparam(s, mnval);
+}
+
+
 /* Unset a parameter */
 
 /**/
diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst
index 9bab48244..9867b5d9a 100644
--- a/Test/C01arith.ztst
+++ b/Test/C01arith.ztst
@@ -97,6 +97,12 @@
 0:setting array elements in math context
 >array 1 2
 
+  xarr=()
+  (( xarr = 3 ))
+  print ${(t)xarr} $xarr
+0:converting type from array
+>integer 3
+
   print $(( 13 = 42 ))
 1:bad lvalue
 ?(eval):1: lvalue required