Use union to discriminate pointer types from enum/int types.

This commit is contained in:
Skip Montanaro 2006-04-13 09:37:01 +00:00
parent 83687c98dc
commit b940671186
2 changed files with 9 additions and 8 deletions

View File

@ -19,18 +19,22 @@ typedef enum {false, true} bool;
typedef struct { typedef struct {
int size; int size;
void *elements[1]; union {
void *elements[1];
unsigned int enum_type[1];
} elt;
} asdl_seq; } asdl_seq;
asdl_seq *asdl_seq_new(int size, PyArena *arena); asdl_seq *asdl_seq_new(int size, PyArena *arena);
#define asdl_seq_GET(S, I) (S)->elements[(I)] #define asdl_seq_GET(S, I) (S)->elt.elements[(I)]
#define asdl_seq_GET_ENUM(S, I) (S)->elt.enum_type[(I)]
#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
#ifdef Py_DEBUG #ifdef Py_DEBUG
#define asdl_seq_SET(S, I, V) { \ #define asdl_seq_SET(S, I, V) { \
int _asdl_i = (I); \ int _asdl_i = (I); \
assert((S) && _asdl_i < (S)->size); \ assert((S) && _asdl_i < (S)->size); \
(S)->elements[_asdl_i] = (V); \ (S)->elt.elements[_asdl_i] = (V); \
} }
#else #else
#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) #define asdl_seq_SET(S, I, V) (S)->elements[I] = (V)

View File

@ -3066,10 +3066,8 @@ compiler_compare(struct compiler *c, expr_ty e)
for (i = 1; i < n; i++) { for (i = 1; i < n; i++) {
ADDOP(c, DUP_TOP); ADDOP(c, DUP_TOP);
ADDOP(c, ROT_THREE); ADDOP(c, ROT_THREE);
/* XXX We're casting a void* to cmpop_ty in the next stmt. */
ADDOP_I(c, COMPARE_OP, ADDOP_I(c, COMPARE_OP,
cmpop((cmpop_ty)( CMPCAST asdl_seq_GET( cmpop((cmpop_ty)asdl_seq_GET_ENUM(e->v.Compare.ops, i - 1)));
e->v.Compare.ops, i - 1))));
ADDOP_JREL(c, JUMP_IF_FALSE, cleanup); ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
NEXT_BLOCK(c); NEXT_BLOCK(c);
ADDOP(c, POP_TOP); ADDOP(c, POP_TOP);
@ -3080,8 +3078,7 @@ compiler_compare(struct compiler *c, expr_ty e)
VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1)); VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
ADDOP_I(c, COMPARE_OP, ADDOP_I(c, COMPARE_OP,
/* XXX We're casting a void* to cmpop_ty in the next stmt. */ /* XXX We're casting a void* to cmpop_ty in the next stmt. */
cmpop((cmpop_ty)( CMPCAST asdl_seq_GET(e->v.Compare.ops, cmpop((cmpop_ty)asdl_seq_GET_ENUM(e->v.Compare.ops, n - 1)));
n - 1))));
if (n > 1) { if (n > 1) {
basicblock *end = compiler_new_block(c); basicblock *end = compiler_new_block(c);
if (end == NULL) if (end == NULL)