aboutsummaryrefslogtreecommitdiffstats
path: root/gawkapi.c
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-06 21:28:12 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-06 21:28:12 -0500
commit444afe9e4a9c70f0833f6a0a912651dd0d0e57aa (patch)
tree4d1ae93ab9e5a8bf950addf8bb59c3a6473880f3 /gawkapi.c
parentf38a8f801496ea91cef7a8507e2919f6586d0694 (diff)
downloadegawk-444afe9e4a9c70f0833f6a0a912651dd0d0e57aa.tar.gz
egawk-444afe9e4a9c70f0833f6a0a912651dd0d0e57aa.tar.bz2
egawk-444afe9e4a9c70f0833f6a0a912651dd0d0e57aa.zip
The API should call the astore hook after array assignment.
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;
}