about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@ipost.com>2020-12-03 22:30:04 -0800
committerBart Schaefer <schaefer@ipost.com>2021-04-13 21:18:35 -0700
commit709af2bf3c7eba33c1425b2dcd2071a2c5bb1179 (patch)
tree5b6ad44859e5550cf006f581a12447295e7b9bc9
parentd0a25afe323abe0183c2a530c5324e7e93426b64 (diff)
downloadzsh-709af2bf3c7eba33c1425b2dcd2071a2c5bb1179.tar.gz
zsh-709af2bf3c7eba33c1425b2dcd2071a2c5bb1179.tar.xz
zsh-709af2bf3c7eba33c1425b2dcd2071a2c5bb1179.zip
Partial fix for handling of tied arrays.
As of this commit when a tied array is declared but neither the scalar
nor the array has an initializer, the array is initialized to empty.

The scalar struct param of a tied pair stores a direct pointer to the
internal array value of the array struct param, and upon assignment
modifies it without referring to the containing struct.  This means
that there's no opportunity to clear the PM_DECLAREDNULL bits on both
structs when the scalar is assigned.  Conversely, assigning to the
array does use the struct for the scalar.
-rw-r--r--Src/builtin.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 691734221..68ebead7e 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2890,6 +2890,8 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	 *
 	 * Don't attempt to set it yet, it's too early
 	 * to be exported properly.
+	 *
+	 * This creates the array with PM_DECLAREDNULL.
 	 */
 	asg2.name = asg->name;
 	asg2.flags = 0;
@@ -2933,6 +2935,10 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
 	    assignaparam(asg->name, zlinklist2array(asg->value.array, 1), flags);
 	} else if (oldval)
 	    assignsparam(asg0.name, oldval, 0);
+	else /*if (asg0.value.scalar)*/ {
+	    /* We have to undo what we did wrong with asg2 */
+	    apm->node.flags &= ~PM_DECLAREDNULL;
+	}
 	unqueue_signals();
 
 	return 0;