aboutsummaryrefslogtreecommitdiffstats
path: root/awkgram.c
diff options
context:
space:
mode:
Diffstat (limited to 'awkgram.c')
-rw-r--r--awkgram.c39
1 files changed, 18 insertions, 21 deletions
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 */