diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2015-01-06 14:20:19 -0500 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2015-01-06 14:20:19 -0500 |
commit | 9121c3059288f36e004108e02ed4d826b84604e7 (patch) | |
tree | 43448e2604b114c073e32e1155385f9536d12c90 /gawkapi.c | |
parent | cb5838c3c261f9a775fae45adfa70e1514e8bfe0 (diff) | |
download | egawk-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.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -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 */ |