diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | awk.h | 1 | ||||
-rw-r--r-- | awkgram.c | 6 | ||||
-rw-r--r-- | awkgram.y | 6 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | symbol.c | 81 |
6 files changed, 96 insertions, 7 deletions
@@ -9,6 +9,13 @@ api_release_flattened_array): Adjust logic. * gawkapi.h: Adjust documentation. + Provide PROCINFO["identifiers"]. Undocumented for now. + + * awk.h (load_symbols): Add declaration. + * awkgram.y (variable): Adjust comment formatting. + * main.c (main): Call load_symbols(). + * symbol.c (load_symbols): New function. + 2012-09-13 Arnold D. Robbins <arnold@skeeve.com> * configure.ac: Determination of DYNAMIC adjusted. Hopefully is @@ -1670,6 +1670,7 @@ extern int reisstring(const char *text, size_t len, Regexp *re, const char *buf) extern int get_numbase(const char *str, bool use_locale); /* symbol.c */ +extern void load_symbols(); extern NODE *install_symbol(char *name, NODETYPE type); extern NODE *remove_symbol(NODE *r); extern void destroy_symbol(NODE *r); @@ -6956,9 +6956,9 @@ variable(int location, char *name, NODETYPE type) for (dv = deferred_variables; true; dv = dv->next) { if (dv == NULL) { - /* - * This is the only case in which we may not free the string. - */ + /* + * This is the only case in which we may not free the string. + */ return install_symbol(name, type); } if (strcmp(name, dv->name) == 0) { @@ -4396,9 +4396,9 @@ variable(int location, char *name, NODETYPE type) for (dv = deferred_variables; true; dv = dv->next) { if (dv == NULL) { - /* - * This is the only case in which we may not free the string. - */ + /* + * This is the only case in which we may not free the string. + */ return install_symbol(name, type); } if (strcmp(name, dv->name) == 0) { @@ -693,6 +693,8 @@ out: if (do_lint && code_block->nexti->opcode == Op_atexit) lintwarn(_("no program text at all!")); + load_symbols(); + if (do_profile) init_profiling_signals(); @@ -43,7 +43,6 @@ static void free_bcpool(INSTRUCTION *pl); static AWK_CONTEXT *curr_ctxt = NULL; static int ctxt_level; - /* * install_symbol: * Install a global name in the symbol table, even if it is already there. @@ -475,6 +474,86 @@ release_symbols(NODE *symlist, int keep_globals) symlist->rnode = NULL; } +/* load_symbols --- fill in symbols' information */ + +void +load_symbols() +{ + NODE *hp, *r; + NODE *tmp; + NODE *sym_array; + NODE **aptr; + long i; + NODE *user, *extension, *variable, *scalar,*array; + + if (PROCINFO_node == NULL) + return; + + tmp = make_string("identifiers", 11); + aptr = assoc_lookup(PROCINFO_node, tmp); + + getnode(sym_array); + init_array(sym_array); + + unref(*aptr); + *aptr = sym_array; + + sym_array->parent_array = PROCINFO_node; + sym_array->vname = estrdup("identifiers", 11); + make_aname(sym_array); + + user = make_string("user", 4); + extension = make_string("extension", 9); + scalar = make_string("scalar", 6); + variable = make_string("variable", 8); + array = make_string("array", 5); + + for (i = 0; i < HASHSIZE; i++) { + for (hp = variables[i]; hp != NULL; hp = hp->hnext) { + if (hp->type != Node_hashnode) + continue; + + r = hp->hvalue; + if ( r->type == Node_ext_func + || r->type == Node_func + || r->type == Node_var + || r->type == Node_var_array + || r->type == Node_var_new) { + tmp = make_string(r->vname, strlen(r->vname)); + aptr = assoc_lookup(sym_array, tmp); + unref(tmp); + unref(*aptr); + switch (r->type) { + case Node_ext_func: + *aptr = dupnode(extension); + break; + case Node_func: + *aptr = dupnode(user); + break; + case Node_var: + *aptr = dupnode(scalar); + break; + case Node_var_array: + *aptr = dupnode(array); + break; + case Node_var_new: + *aptr = dupnode(variable); + break; + default: + cant_happen(); + break; + } + } + } + } + + unref(user); + unref(extension); + unref(scalar); + unref(variable); + unref(array); +} + #define pool_size d.dl #define freei x.xi static INSTRUCTION *pool_list; |