diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2015-01-06 21:28:12 -0500 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2015-01-06 21:28:12 -0500 |
commit | 444afe9e4a9c70f0833f6a0a912651dd0d0e57aa (patch) | |
tree | 4d1ae93ab9e5a8bf950addf8bb59c3a6473880f3 /gawkapi.c | |
parent | f38a8f801496ea91cef7a8507e2919f6586d0694 (diff) | |
download | egawk-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.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -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; } |