* [PATCH 1/4] more transparent dealing with tokens/position
@ 2011-04-12 11:01 Jan Pokorný
2011-04-12 11:19 ` [PATCH 2/4] " Jan Pokorný
0 siblings, 1 reply; 5+ messages in thread
From: Jan Pokorný @ 2011-04-12 11:01 UTC (permalink / raw)
To: sparse; +Cc: linux-sparse
Unify usage of `token_type'.
Signed-off-by: Jan Pokorny <pokorny_jan@seznam.cz>
---
expression.h | 2 +-
token.h | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/expression.h b/expression.h
index 9778de8..480079c 100644
--- a/expression.h
+++ b/expression.h
@@ -200,7 +200,7 @@ struct token *typename(struct token *, struct symbol **, int *);
static inline int lookup_type(struct token *token)
{
- if (token->pos.type == TOKEN_IDENT) {
+ if (token_type(token) == TOKEN_IDENT) {
struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF);
return sym && (sym->namespace & NS_TYPEDEF);
}
diff --git a/token.h b/token.h
index a7ec77e..a3c194d 100644
--- a/token.h
+++ b/token.h
@@ -205,12 +205,12 @@ extern struct token *preprocess(struct token *);
static inline int match_op(struct token *token, int op)
{
- return token->pos.type == TOKEN_SPECIAL && token->special == op;
+ return token_type(token) == TOKEN_SPECIAL && token->special == op;
}
static inline int match_ident(struct token *token, struct ident *id)
{
- return token->pos.type == TOKEN_IDENT && token->ident == id;
+ return token_type(token) == TOKEN_IDENT && token->ident == id;
}
#endif
--
1.7.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] more transparent dealing with tokens/position
2011-04-12 11:01 [PATCH 1/4] more transparent dealing with tokens/position Jan Pokorný
@ 2011-04-12 11:19 ` Jan Pokorný
2011-04-12 11:22 ` [PATCH 3/4] " Jan Pokorný
2011-04-12 11:25 ` [PATCH 2/4] " Jan Pokorný
0 siblings, 2 replies; 5+ messages in thread
From: Jan Pokorný @ 2011-04-12 11:19 UTC (permalink / raw)
To: sparse; +Cc: linux-sparse
Unify usage of `eof_token'.
Version with respective assertions added will be provided,
mainly for convenient testing. I used it to proceeded sparse itself
and linux-2.6.35.12 sources with no assertion violation encountered.
Signed-off-by: Jan Pokorny <pokorny_jan@seznam.cz>
---
pre-process.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/pre-process.c b/pre-process.c
index 603cc00..c0fc89d 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -794,7 +794,7 @@ out:
static int free_preprocessor_line(struct token *token)
{
- while (token_type(token) != TOKEN_EOF) {
+ while (!eof_token(token)) {
struct token *free = token;
token = token->next;
__free_token(free);
--
1.7.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] more transparent dealing with tokens/position
2011-04-12 11:19 ` [PATCH 2/4] " Jan Pokorný
@ 2011-04-12 11:22 ` Jan Pokorný
2011-04-12 11:23 ` [PATCH 4/4] " Jan Pokorný
2011-04-12 11:25 ` [PATCH 2/4] " Jan Pokorný
1 sibling, 1 reply; 5+ messages in thread
From: Jan Pokorný @ 2011-04-12 11:22 UTC (permalink / raw)
To: sparse; +Cc: linux-sparse
Treat `enum token_type' as enumeration type rather than int.
For instance, avoid (a bit magical) zero assignments.
I admit this is quite a wild change, especially wrt the move of
`struct position'. This was probably the easiest way to compile
sparse without additional dependecies mangling. Still, another
solution can be found.
Note that after applying patch 2/4 (i.e., if `eof_token' and
`eof_token_entry' are used consistently), TOKEN_EOF should no longer
be necessary (this patch also modifies `show_token' to accommodate this).
But it might be a good idea to keep it for backward compatibility (it's
usage/meaning stays untouched with this patch series), only add
a comment that it should not be used (for maintainability reasons).
Another solution for TOKEN_EOF then making it "deprecated" would be to
make `eof_token_entry' initialized with ".pos.type = TOKEN_EOF" to make
this correspondence explicit (so far, this has silently applied because
of implicit zero initialization of `eof_token_entry' global).
This would kept duality of how to test the single case, though,
and I consider the only and consistent way better.
Also, add `POSITION_NOT_FROM_TOKEN' to the `enum token_type' to avoid
magical zero assignments and add some explaining comments.
It is the best name I was able to come up with, so that it still
describes the meaning quite clearly. Another suggestions welcome.
Signed-off-by: Jan Pokorny <pokorny_jan@seznam.cz>
---
c2xml.c | 2 +-
expression.c | 2 +-
lib.h | 10 +---------
symbol.c | 2 +-
token.h | 19 ++++++++++++++++++-
tokenize.c | 8 ++++----
6 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/c2xml.c b/c2xml.c
index 37f29cf..2f76865 100644
--- a/c2xml.c
+++ b/c2xml.c
@@ -68,7 +68,7 @@ static xmlNodePtr new_sym_node(struct symbol *sym, const char *name, xmlNodePtr
newNumProp(node, "start-line", sym->pos.line);
newNumProp(node, "start-col", sym->pos.pos);
- if (sym->endpos.type) {
+ if (sym->endpos.type != POSITION_NOT_FROM_TOKEN) {
newNumProp(node, "end-line", sym->endpos.line);
newNumProp(node, "end-col", sym->endpos.pos);
if (sym->pos.stream != sym->endpos.stream)
diff --git a/expression.c b/expression.c
index 7e06e60..43a3606 100644
--- a/expression.c
+++ b/expression.c
@@ -224,7 +224,7 @@ static struct token *string_expression(struct token *token, struct expression *e
{
struct string *string = token->string;
struct token *next = token->next;
- int stringtype = token_type(token);
+ enum token_type stringtype = token_type(token);
convert_function(token);
diff --git a/lib.h b/lib.h
index 2cea252..6b17280 100644
--- a/lib.h
+++ b/lib.h
@@ -31,15 +31,7 @@ extern int gcc_major, gcc_minor, gcc_patchlevel;
extern unsigned int hexval(unsigned int c);
-struct position {
- unsigned int type:6,
- stream:14,
- newline:1,
- whitespace:1,
- pos:10;
- unsigned int line:31,
- noexpand:1;
-};
+struct position;
struct cmdline_include {
char *filename;
diff --git a/symbol.c b/symbol.c
index 96dfbfa..34d4f06 100644
--- a/symbol.c
+++ b/symbol.c
@@ -62,7 +62,7 @@ struct symbol *alloc_symbol(struct position pos, int type)
struct symbol *sym = __alloc_symbol(0);
sym->type = type;
sym->pos = pos;
- sym->endpos.type = 0;
+ sym->endpos.type = POSITION_NOT_FROM_TOKEN;
return sym;
}
diff --git a/token.h b/token.h
index a3c194d..057b40a 100644
--- a/token.h
+++ b/token.h
@@ -60,8 +60,15 @@ struct ident {
char name[]; /* Actual identifier */
};
+/*
+ * Tightly connected with "struct token", but used also outside them as a part
+ * of symbol etc. position, which is in turn borrowed from underlying tokens.
+ */
enum token_type {
- TOKEN_EOF,
+ /* Used outside tokens to mark a position not initialized from a token */
+ POSITION_NOT_FROM_TOKEN,
+ /* Token type (outside them, ~particular position was initialized from) */
+ TOKEN_EOF = POSITION_NOT_FROM_TOKEN, /* use "eof_token()" instead */
TOKEN_ERROR,
TOKEN_IDENT,
TOKEN_ZERO_IDENT,
@@ -85,6 +92,16 @@ enum token_type {
TOKEN_ELSE,
};
+struct position {
+ enum token_type type:6;
+ unsigned int stream:14,
+ newline:1,
+ whitespace:1,
+ pos:10;
+ unsigned int line:31,
+ noexpand:1;
+};
+
/* Combination tokens */
#define COMBINATION_STRINGS { \
"+=", "++", \
diff --git a/tokenize.c b/tokenize.c
index 272974b..6fa8714 100644
--- a/tokenize.c
+++ b/tokenize.c
@@ -48,7 +48,7 @@ const char *stream_name(int stream)
static struct position stream_pos(stream_t *stream)
{
struct position pos;
- pos.type = 0;
+ pos.type = POSITION_NOT_FROM_TOKEN;
pos.stream = stream->nr;
pos.newline = stream->newline;
pos.whitespace = stream->whitespace;
@@ -126,13 +126,13 @@ const char *show_token(const struct token *token)
if (!token)
return "<no token>";
+ if (eof_token(token))
+ return "end-of-input";
+
switch (token_type(token)) {
case TOKEN_ERROR:
return "syntax error";
- case TOKEN_EOF:
- return "end-of-input";
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] more transparent dealing with tokens/position
2011-04-12 11:22 ` [PATCH 3/4] " Jan Pokorný
@ 2011-04-12 11:23 ` Jan Pokorný
0 siblings, 0 replies; 5+ messages in thread
From: Jan Pokorný @ 2011-04-12 11:23 UTC (permalink / raw)
To: sparse; +Cc: linux-sparse
Unify usage of `token_type' and `eof_token' also with gdbhelpers.
When 3/4 is applied, no need to do explicit cast to `enum token_type'.
Tested to work as it used to*).
*) testing commands sequence:
$ gdb --args ./sparse compat/mmap-blob.c
(gdb) source gdbhelpers
(gdb) b lib.c:882
(gdb) r
(gdb) gdb_show_tokens token
Signed-off-by: Jan Pokorny <pokorny_jan@seznam.cz>
---
gdbhelpers | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/gdbhelpers b/gdbhelpers
index 8634786..9a3630d 100644
--- a/gdbhelpers
+++ b/gdbhelpers
@@ -259,7 +259,7 @@ end
define gdb_show_token
printf "%p: '%s', type = ", $arg0, show_token($arg0)
- output (enum token_type) ($arg0)->pos.type
+ output token_type($arg0)
printf "\n"
if (! $showing_token)
@@ -268,18 +268,18 @@ define gdb_show_token
set $token = $arg0
- if ($token->pos.type == TOKEN_IDENT)
+ if (token_type($token) == TOKEN_IDENT)
gdb_tabs
printf "ident = "
gdb_show_ident $token.ident
end
- if ($token->pos.type == TOKEN_MACRO_ARGUMENT)
+ if (token_type($token) == TOKEN_MACRO_ARGUMENT)
gdb_tabs
printf "argnum = %d\n", $token->argnum
end
- if ($token->pos.type == TOKEN_SPECIAL)
+ if (token_type($token) == TOKEN_SPECIAL)
gdb_tabs
printf "special = \"%s\"\n", show_special($token.special)
end
@@ -294,7 +294,7 @@ define gdb_show_tokens
set $t = $arg0
printf "{\n"
set $ntabs++
- while ($t != &eof_token_entry)
+ while (!eof_token($t))
gdb_tabs
printf "token = "
gdb_show_token($t)
--
1.7.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/4] more transparent dealing with tokens/position
2011-04-12 11:19 ` [PATCH 2/4] " Jan Pokorný
2011-04-12 11:22 ` [PATCH 3/4] " Jan Pokorný
@ 2011-04-12 11:25 ` Jan Pokorný
1 sibling, 0 replies; 5+ messages in thread
From: Jan Pokorný @ 2011-04-12 11:25 UTC (permalink / raw)
To: sparse; +Cc: linux-sparse
Unify usage of `eof_token', version with respective asserts,
mainly intended for convenient testing.
Signed-off-by: Jan Pokorny <pokorny_jan@seznam.cz>
---
pre-process.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/pre-process.c b/pre-process.c
index 603cc00..cee3d29 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -19,6 +19,7 @@
#include <fcntl.h>
#include <limits.h>
#include <time.h>
+#include <assert.h>
#include "lib.h"
#include "allocate.h"
@@ -794,11 +795,13 @@ out:
static int free_preprocessor_line(struct token *token)
{
- while (token_type(token) != TOKEN_EOF) {
+ while (!eof_token(token)) {
+ assert(token_type(token) != TOKEN_EOF);
struct token *free = token;
token = token->next;
__free_token(free);
};
+ assert(token_type(token) == TOKEN_EOF);
return 1;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-04-12 11:26 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-12 11:01 [PATCH 1/4] more transparent dealing with tokens/position Jan Pokorný
2011-04-12 11:19 ` [PATCH 2/4] " Jan Pokorný
2011-04-12 11:22 ` [PATCH 3/4] " Jan Pokorný
2011-04-12 11:23 ` [PATCH 4/4] " Jan Pokorný
2011-04-12 11:25 ` [PATCH 2/4] " Jan Pokorný
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).