diff options
Diffstat (limited to 'awkgram.y')
-rw-r--r-- | awkgram.y | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -120,6 +120,7 @@ static int lasttok = 0; static bool eof_warned = false; /* GLOBAL: want warning for each file */ static int break_allowed; /* kludge for break */ static int continue_allowed; /* kludge for continue */ +static bool extensions_used = false; /* program uses extensions */ #define END_FILE -1000 #define END_SRC -2000 @@ -272,6 +273,7 @@ source library : FILENAME { + extensions_used = true; if (load_library($1) < 0) YYABORT; efree($1->lextok); @@ -2344,6 +2346,8 @@ do_add_srcfile(enum srctype stype, char *src, char *path, SRCFILE *thisfile) s->prev = thisfile->prev; thisfile->prev->next = s; thisfile->prev = s; + if (stype == SRC_EXTLIB) + extensions_used = true; return s; } @@ -4472,6 +4476,7 @@ static bool is_deferred_variable(const char *name) { struct deferred_variable *dv; + for (dv = deferred_variables; dv != NULL; dv = dv->next) if (strcmp(name, dv->name) == 0) return true; @@ -4513,18 +4518,17 @@ variable(int location, char *name, NODETYPE type) return r; } -/* process_deferred --- if the program uses SYMTAB, load deferred variables */ +/* process_deferred --- if the program uses SYMTAB or extensions, load deferred variables */ static void process_deferred() { struct deferred_variable *dv; - if (! symtab_used) - return; - - for (dv = deferred_variables; dv != NULL; dv = dv->next) { - (void) dv->load_func(); + if (symtab_used || extensions_used) { + for (dv = deferred_variables; dv != NULL; dv = dv->next) { + (void) dv->load_func(); + } } } |