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 /awkgram.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 'awkgram.c')
-rw-r--r-- | awkgram.c | 36 |
1 files changed, 18 insertions, 18 deletions
@@ -7052,6 +7052,20 @@ is_deferred_variable(const char *name) return false; } +/* variable_create --- create a new variable */ +NODE * +variable_create(char *name, NODETYPE type) +{ + struct deferred_variable *dv; + + for (dv = deferred_variables; dv != NULL; dv = dv->next) { + if (strcmp(name, dv->name) == 0) { + efree(name); + return (*dv->load_func)(); + } + } + return install_symbol(name, type); +} /* variable --- make sure NAME is in the symbol table */ @@ -7066,25 +7080,11 @@ variable(int location, char *name, NODETYPE type) r->vname); if (r == symbol_table) symtab_used = true; - } else { - /* not found */ - struct deferred_variable *dv; - - for (dv = deferred_variables; true; dv = dv->next) { - if (dv == NULL) { - /* - * This is the only case in which we may not free the string. - */ - return install_symbol(name, type); - } - if (strcmp(name, dv->name) == 0) { - r = (*dv->load_func)(); - break; - } - } + efree(name); + return r; } - efree(name); - return r; + /* not found */ + return variable_create(name, type); } /* process_deferred --- if the program uses SYMTAB, load deferred variables */ |