aboutsummaryrefslogtreecommitdiffstats
path: root/awkgram.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 /awkgram.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 'awkgram.c')
-rw-r--r--awkgram.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/awkgram.c b/awkgram.c
index adb31d9c..2257ee35 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -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 */