[Python-checkins] r45354 - in python/trunk: Include/asdl.h Python/compile.c

skip.montanaro python-checkins at python.org
Thu Apr 13 11:37:02 CEST 2006


Author: skip.montanaro
Date: Thu Apr 13 11:37:01 2006
New Revision: 45354

Modified:
   python/trunk/Include/asdl.h
   python/trunk/Python/compile.c
Log:
Use union to discriminate pointer types from enum/int types.



Modified: python/trunk/Include/asdl.h
==============================================================================
--- python/trunk/Include/asdl.h	(original)
+++ python/trunk/Include/asdl.h	Thu Apr 13 11:37:01 2006
@@ -19,18 +19,22 @@
 
 typedef struct {
     int size;
-    void *elements[1];
+    union {
+        void *elements[1];
+	unsigned int enum_type[1];
+    } elt;
 } asdl_seq;
 
 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)
 #ifdef Py_DEBUG
 #define asdl_seq_SET(S, I, V) { \
         int _asdl_i = (I); \
         assert((S) && _asdl_i < (S)->size); \
-        (S)->elements[_asdl_i] = (V); \
+        (S)->elt.elements[_asdl_i] = (V); \
 }
 #else
 #define asdl_seq_SET(S, I, V) (S)->elements[I] = (V)

Modified: python/trunk/Python/compile.c
==============================================================================
--- python/trunk/Python/compile.c	(original)
+++ python/trunk/Python/compile.c	Thu Apr 13 11:37:01 2006
@@ -3066,10 +3066,8 @@
 	for (i = 1; i < n; i++) {
 		ADDOP(c, DUP_TOP);
 		ADDOP(c, ROT_THREE);
-		/* XXX We're casting a void* to cmpop_ty in the next stmt. */
 		ADDOP_I(c, COMPARE_OP,
-			cmpop((cmpop_ty)( CMPCAST asdl_seq_GET(
-                                                  e->v.Compare.ops, i - 1))));
+			cmpop((cmpop_ty)asdl_seq_GET_ENUM(e->v.Compare.ops, i - 1)));
 		ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
 		NEXT_BLOCK(c);
 		ADDOP(c, POP_TOP);
@@ -3080,8 +3078,7 @@
 	VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
 	ADDOP_I(c, COMPARE_OP,
 		/* XXX We're casting a void* to cmpop_ty in the next stmt. */
-	       cmpop((cmpop_ty)( CMPCAST asdl_seq_GET(e->v.Compare.ops, 
-                                                       n - 1))));
+	       cmpop((cmpop_ty)asdl_seq_GET_ENUM(e->v.Compare.ops, n - 1)));
 	if (n > 1) {
 		basicblock *end = compiler_new_block(c);
 		if (end == NULL)


More information about the Python-checkins mailing list