summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@ipost.com>2020-12-03 22:30:04 -0800
committerBart Schaefer <schaefer@ipost.com>2021-04-10 14:12:29 -0700
commit128035c93c5bc149e9c3babd48c8c145609e29e0 (patch)
tree644f418c1edb35b7b0d124b9653117abf0919962
parentChoose a better bit-value for PM_DECLARED (diff)
downloadzsh-128035c93c5bc149e9c3babd48c8c145609e29e0.tar
zsh-128035c93c5bc149e9c3babd48c8c145609e29e0.tar.gz
zsh-128035c93c5bc149e9c3babd48c8c145609e29e0.tar.bz2
zsh-128035c93c5bc149e9c3babd48c8c145609e29e0.tar.lz
zsh-128035c93c5bc149e9c3babd48c8c145609e29e0.tar.xz
zsh-128035c93c5bc149e9c3babd48c8c145609e29e0.tar.zst
zsh-128035c93c5bc149e9c3babd48c8c145609e29e0.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;