dissect: introduce dissect_ctx
PATCH 1/1 dissect: introduce dissect_ctx
Points to the current function or to the global variable in case of compound initializer.
Kill the ugly test-dissect.c:storage() and change print_usage() to report dissect_ctx->ident instead.
--- dissect.c | 17 +++++++++++++++-- dissect.h | 2 ++ test-dissect.c | 21 ++++++++------------- 3 files changed, 25 insertions(+), 15 deletions(-)
dissect.c +15 -2
@@ -51,6 +51,8 @@typedef unsigned usage_t ; +struct symbol *dissect_ctx; +static struct reporter *reporter;static struct symbol *return_type;
@@ -211,7 +213,7 @@ static void report_memdef(struct symbol *sym, struct symbol *mem)static void examine_sym_node (struct symbol *node,struct symbol *parent) { -struct symbol *base; +struct symbol *base, *dctx;struct ident *name;if (node->examined)
@@ -240,6 +242,9 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent)return ; base->evaluated =1 ; + dctx = dissect_ctx; + dissect_ctx =NULL ; +if (base->ident ||deanon (base, name, parent)) reporter->r_symdef (base);
@@ -248,6 +253,7 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent)DO_LIST (base->symbol_list, mem, examine_sym_node(mem, parent);report_memdef (parent, mem)); + dissect_ctx = dctx;default :return ; }
@@ -582,6 +588,7 @@ static struct symbol *do_initializer(struct symbol *type, struct expression *expstatic inline struct symbol *do_symbol (struct symbol *sym) {struct symbol *type =base_type (sym); +struct symbol *dctx = dissect_ctx; reporter->r_symdef (sym);
@@ -590,14 +597,20 @@ static inline struct symbol *do_symbol(struct symbol *sym)if (!sym->initializer)break ; reporter->r_symbol (U_W_VAL , &sym->pos, sym); +if (!dctx) + dissect_ctx = sym;do_initializer (type, sym->initializer); + dissect_ctx = dctx;break ;case SYM_FN : -do_sym_list (type->arguments); + dissect_ctx = sym; return_type =base_type (type); +do_sym_list (type->arguments);do_statement (U_VOID , sym->ctype.modifiers &MOD_INLINE ? type->inline_stmt : type->stmt); + dissect_ctx = dctx; + return_type =NULL ; }return type;
dissect.h +2 -0
@@ -25,6 +25,8 @@ struct reporter void (*r_member)(unsigned, struct position *, struct symbol *, struct symbol *); }; +extern struct symbol *dissect_ctx; +extern void dissect (struct symbol_list *,struct reporter *);#endif
test-dissect.c +8 -13
@@ -2,17 +2,6 @@static unsigned dotc_stream; -static inline char storage (struct symbol *sym) -{ -int t = sym->type; -unsigned m = sym->ctype.modifiers; - -if (m &MOD_INLINE || t ==SYM_STRUCT || t ==SYM_UNION /*|| t == SYM_ENUM*/ ) -return sym->pos.stream == dotc_stream ?'s' :'g' ; - -return (m &MOD_STATIC ) ?'s' : (m &MOD_NONLOCAL ) ?'g' :'l' ; -} -static inline const char *show_mode (unsigned mode) {static char str[3 ];
@@ -32,14 +21,20 @@ static inline const char *show_mode(unsigned mode)static void print_usage (struct position *pos,struct symbol *sym,unsigned mode) {static unsigned curr_stream =-1 ; +static struct ident null; +struct ident *ctx = &null;if (curr_stream != pos->stream) { curr_stream = pos->stream;printf ("\nFILE: %s\n\n" ,stream_name (curr_stream)); } -printf ("%4d:%-3d %c %-5.3s" , - pos->line, pos->pos,storage (sym),show_mode (mode)); +if (dissect_ctx) + ctx = dissect_ctx->ident; + +printf ("%4d:%-3d %-16.*s %-5.3s" , + pos->line, pos->pos, ctx->len, ctx->name,show_mode (mode)); + }static void r_symbol (unsigned mode,struct position *pos,struct symbol *sym)
Signature · 1 line
2.5.0
Quoted 5 lines · Oleg Nesterov
Points to the current function or to the global variable in case of compound initializer.
Kill the ugly test-dissect.c:storage() and change
print_usage()to reportdissect_ctx->identinstead.
Having the ful ident will be good, I think, but the cost is to have to maintain this context. I suppose it would be too painful to propgate this context via an additional argument to all involved functions?
-- Luc
Quoted 5 lines · Luc Van Oostenryck
Quoted 3 lines · Oleg Nesterov
Points to the current function or to the global variable in case of compound initializer.
Quoted 7 lines
Quoted 2 lines
Kill the ugly test-dissect.c:storage() and change
print_usage()to reportdissect_ctx->identinstead.Having the ful ident will be good, I think, but the cost is to have to maintain this context. I suppose it would be too painful to propgate this context via an additional argument to all involved functions?
Oh, I'd prefer to not do this. This needs to add the additional "ctx" arg to every do_.*() function in dissect.c, and for what? IMHO, this will just complicate the code for no reason.
I can unexport the global "struct symbol *dissect_ctx" introduced by this patch and pass it as the additional (new) argument to every to every callback, but I'd like to do this later, along with other "incompatible" changes for the new tool Alexey is working on.
Thanks,
Oleg.
Quoted 9 lines · Oleg Nesterov
Quoted 8 lines · Luc Van Oostenryck
Quoted 5 lines · Oleg Nesterov
Points to the current function or to the global variable in case of compound initializer.
Kill the ugly test-dissect.c:storage() and change
print_usage()to reportdissect_ctx->identinstead.
Quoted 8 lines
Quoted 4 lines
Having the ful ident will be good, I think, but the cost is to have to maintain this context. I suppose it would be too painful to propgate this context via an additional argument to all involved functions?
Oh, I'd prefer to not do this. This needs to add the additional "ctx" arg to every do_.*() function in
dissect.c, and for what? IMHO, this will just complicate the code for no reason.
Yes, I guessed so. No problem.
-- Luc