diff options
Diffstat (limited to 'awkgram.c')
-rw-r--r-- | awkgram.c | 39 |
1 files changed, 18 insertions, 21 deletions
@@ -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 */ |