aboutsummaryrefslogtreecommitdiffstats
path: root/gawkapi.c
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-06 14:20:19 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-06 14:20:19 -0500
commit9121c3059288f36e004108e02ed4d826b84604e7 (patch)
tree43448e2604b114c073e32e1155385f9536d12c90 /gawkapi.c
parentcb5838c3c261f9a775fae45adfa70e1514e8bfe0 (diff)
downloadegawk-9121c3059288f36e004108e02ed4d826b84604e7.tar.gz
egawk-9121c3059288f36e004108e02ed4d826b84604e7.tar.bz2
egawk-9121c3059288f36e004108e02ed4d826b84604e7.zip
Fix bug so that extensions can create deferred arrays PROCINFO and ENVIRON properly.
Diffstat (limited to 'gawkapi.c')
-rw-r--r--gawkapi.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/gawkapi.c b/gawkapi.c
index a693621e..5630185c 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -579,10 +579,34 @@ api_sym_update(awk_ext_id_t id,
if (node == NULL) {
/* new value to be installed */
if (value->val_type == AWK_ARRAY) {
+ unsigned long nel;
+
array_node = awk_value_to_node(value);
- node = install_symbol(estrdup((char *) name, strlen(name)),
- Node_var_array);
+ /*
+ * use variable_create instead of install_symbol in
+ * case this is a deferred variable such as PROCINFO
+ * or ENVIRON
+ */
+ node = variable_create(estrdup((char *) name, strlen(name)), Node_var_array);
array_node->vname = node->vname;
+ if ((nel = assoc_length(node)) > 0) {
+ /* merge the 2 arrays */
+ NODE **list;
+ NODE akind;
+ unsigned long i;
+
+ akind.flags = (AINDEX|AVALUE);
+ list = node->alist(node, & akind);
+ for (i = 0; i < nel; i++) {
+ NODE **aptr;
+ aptr = assoc_lookup(array_node, list[2*i]);
+ unref(*aptr);
+ unref(list[2*i]); /* alist duped it */
+ *aptr = dupnode(list[2*i+1]);
+ }
+ efree(list);
+ assoc_clear(node);
+ }
*node = *array_node;
freenode(array_node);
value->array_cookie = node; /* pass new cookie back to extension */