aboutsummaryrefslogtreecommitdiffstats
path: root/gawkapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'gawkapi.c')
-rw-r--r--gawkapi.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gawkapi.c b/gawkapi.c
index e8879022..371a375c 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -605,10 +605,15 @@ api_sym_update(awk_ext_id_t id,
list = array_node->alist(array_node, & akind);
for (i = 0; i < nel; i++) {
NODE **aptr;
+ NODE *elem;
aptr = assoc_lookup(node, list[2*i]);
unref(*aptr);
+ elem = *aptr = dupnode(list[2*i+1]);
+ if (elem->type == Node_var_array)
+ elem->parent_array = node;
+ if (node->astore != NULL)
+ (*node->astore)(node, list[2*i]);
unref(list[2*i]); /* alist duped it */
- *aptr = dupnode(list[2*i+1]);
}
efree(list);
assoc_clear(array_node);
@@ -820,7 +825,6 @@ api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
tmp = awk_value_to_node(index);
aptr = assoc_lookup(array, tmp);
- unref(tmp);
unref(*aptr);
elem = *aptr = awk_value_to_node(value);
if (elem->type == Node_var_array) {
@@ -829,6 +833,9 @@ api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
index->str_value.len);
make_aname(elem);
}
+ if (array->astore != NULL)
+ (*array->astore)(array, tmp);
+ unref(tmp);
return awk_true;
}