[PATCH] dissect: introduce dissect_ctx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx>
---
 dissect.c      | 17 +++++++++++++++--
 dissect.h      |  2 ++
 test-dissect.c | 21 ++++++++-------------
 3 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/dissect.c b/dissect.c
index 60fccbd..54e11d2 100644
--- a/dissect.c
+++ b/dissect.c
@@ -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 *exp
 static 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;
diff --git a/dissect.h b/dissect.h
index 1f5b1d9..efe2c0b 100644
--- a/dissect.h
+++ b/dissect.h
@@ -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
diff --git a/test-dissect.c b/test-dissect.c
index e725eec..d93a2a0 100644
--- a/test-dissect.c
+++ b/test-dissect.c
@@ -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)
-- 
2.5.0





[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux