From 41483acb1969b24e336b11aaf3bfdc1dbdfe33a8 Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Thu, 8 Jan 2015 09:20:09 -0500 Subject: Revert changes to API deferred variable creation, since this should be done at lookup time. --- awkgram.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'awkgram.c') diff --git a/awkgram.c b/awkgram.c index 249fdcdf..adb31d9c 100644 --- a/awkgram.c +++ b/awkgram.c @@ -7052,22 +7052,6 @@ is_deferred_variable(const char *name) return false; } -/* variable_create --- create a new variable */ -NODE * -variable_create(char *name, NODETYPE type, bool *is_deferred) -{ - struct deferred_variable *dv; - - for (dv = deferred_variables; dv != NULL; dv = dv->next) { - if (strcmp(name, dv->name) == 0) { - efree(name); - *is_deferred = true; - return (*dv->load_func)(); - } - } - *is_deferred = false; - return install_symbol(name, type); -} /* variable --- make sure NAME is in the symbol table */ @@ -7075,7 +7059,6 @@ NODE * variable(int location, char *name, NODETYPE type) { NODE *r; - bool is_deferred; if ((r = lookup(name)) != NULL) { if (r->type == Node_func || r->type == Node_ext_func ) @@ -7083,11 +7066,25 @@ variable(int location, char *name, NODETYPE type) r->vname); if (r == symbol_table) symtab_used = true; - efree(name); - return r; + } 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; + } + } } - /* not found */ - return variable_create(name, type, & is_deferred); + efree(name); + return r; } /* process_deferred --- if the program uses SYMTAB, load deferred variables */ -- cgit v1.2.3