diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2005-10-05 12:17:18 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2005-10-05 12:17:18 +0000 |
commit | 3c5ca3b4f998e49a6c3cd167d944aeef38d7006b (patch) | |
tree | 62ea9d35b489b17a1f623c4fe2b6b2e925c82ac4 /src | |
parent | cd7d18072bf16d7abb44798b1ad0922af2a807d8 (diff) | |
download | cflow-3c5ca3b4f998e49a6c3cd167d944aeef38d7006b.tar.gz cflow-3c5ca3b4f998e49a6c3cd167d944aeef38d7006b.tar.bz2 |
(install): Initialize sym->flag
(temp_processor): Use s->flag
(delete_parms,move_parms): New functions
Diffstat (limited to 'src')
-rw-r--r-- | src/symbol.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/symbol.c b/src/symbol.c index 97045fb..e8930d0 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -58,7 +58,12 @@ install(char *name) memset(sym, 0, sizeof(*sym)); sym->type = SymUndefined; sym->name = name; - sym->temp = canonical_filename && strcmp(filename, canonical_filename); + + if (canonical_filename && strcmp(filename, canonical_filename)) + sym->flag = symbol_temp; + else + sym->flag = symbol_none; + if (! ((symbol_table || (symbol_table = hash_initialize (0, 0, hash_symbol_hasher, @@ -113,7 +118,7 @@ temp_processor(void *data, void *proc_data) { Symbol *s = data; - if (s->temp) + if (s->flag == symbol_temp) delete_symbol(s); return true; } @@ -222,6 +227,48 @@ collect_symbols(Symbol ***return_sym, int (*sel)(Symbol *p)) } +/* Special handling for function parameters */ + +static bool +delete_parm_processor(void *data, void *proc_data) +{ + Symbol *s = data; + int *level = proc_data; + if (s->type == SymIdentifier && s->storage == AutoStorage + && s->flag == symbol_parm && s->level > *level) + delete_symbol(s); + return true; +} + +/* Delete all parameters with parameter nesting level greater than LEVEL */ +void +delete_parms(int level) +{ + hash_do_for_each (symbol_table, delete_parm_processor, &level); +} + +static bool +move_parm_processor(void *data, void *proc_data) +{ + Symbol *s = data; + int *level = proc_data; + if (s->type == SymIdentifier && s->storage == AutoStorage + && s->flag == symbol_parm) { + s->level = *(int*)proc_data; + s->flag = symbol_none; + } + return true; +} + +/* Redeclare all saved parameters as automatic variables with the + given nesting level */ +void +move_parms(int level) +{ + hash_do_for_each (symbol_table, move_parm_processor, &level); +} + + typedef struct bucket Bucket; struct bucket { Bucket *next; /* Next bucket */ |