]> granicus.if.org Git - python/commitdiff
Introduce asdl_int_seq, to hold cmpop_ty.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 13 Apr 2006 12:29:43 +0000 (12:29 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 13 Apr 2006 12:29:43 +0000 (12:29 +0000)
Include/Python-ast.h
Include/asdl.h
Parser/asdl_c.py
Python/Python-ast.c
Python/asdl.c
Python/ast.c
Python/compile.c

index 4b7731ae65b8cbbc388a4e0e6030339907978223..3e2103097b515e96855d542f3aac0905d67bfa39 100644 (file)
@@ -240,7 +240,7 @@ struct _expr {
                 
                 struct {
                         expr_ty left;
-                        asdl_seq *ops;
+                        asdl_int_seq *ops;
                         asdl_seq *comparators;
                 } Compare;
                 
@@ -409,7 +409,7 @@ expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno, int
 expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int
                      col_offset, PyArena *arena);
 expr_ty Yield(expr_ty value, int lineno, int col_offset, PyArena *arena);
-expr_ty Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int
+expr_ty Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int
                 lineno, int col_offset, PyArena *arena);
 expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty
              starargs, expr_ty kwargs, int lineno, int col_offset, PyArena
index d709d42c76d452c8ca53718f1e183353e2937235..84e837e752ae9dca2d3b23e1df0836b17c53aa27 100644 (file)
@@ -22,7 +22,13 @@ typedef struct {
     void *elements[1];
 } asdl_seq;
 
+typedef struct {
+    int size;
+    int elements[1];
+} asdl_int_seq;
+
 asdl_seq *asdl_seq_new(int size, PyArena *arena);
+asdl_int_seq *asdl_int_seq_new(int size, PyArena *arena);
 
 #define asdl_seq_GET(S, I) (S)->elements[(I)]
 #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
index 0639789457b07e533af79885a5d913464bec9704..6a8d981cd146986912385558790baaf25eef1002 100755 (executable)
@@ -188,7 +188,10 @@ class StructVisitor(EmitVisitor):
         ctype = get_c_type(field.type)
         name = field.name
         if field.seq:
-            self.emit("asdl_seq *%(name)s;" % locals(), depth)
+            if field.type.value in ('cmpop',):
+                self.emit("asdl_int_seq *%(name)s;" % locals(), depth)
+            else:
+                self.emit("asdl_seq *%(name)s;" % locals(), depth)
         else:
             self.emit("%(ctype)s %(name)s;" % locals(), depth)
 
@@ -234,7 +237,10 @@ class PrototypeVisitor(EmitVisitor):
                 name = f.name
             # XXX should extend get_c_type() to handle this
             if f.seq:
-                ctype = "asdl_seq *"
+                if f.type.value in ('cmpop',):
+                    ctype = "asdl_int_seq *"
+                else:
+                    ctype = "asdl_seq *"
             else:
                 ctype = get_c_type(f.type)
             args.append((ctype, name, f.opt or f.seq))
@@ -681,7 +687,7 @@ class ObjVisitor(PickleVisitor):
                 self.emit("if (!value) goto failed;", depth+1)
                 self.emit("for(i = 0; i < n; i++)", depth+1)
                 # This cannot fail, so no need for error handling
-                self.emit("PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)(int)asdl_seq_GET(%s, i)));" % value,
+                self.emit("PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(%s, i)));" % value,
                           depth+2, reflow=False)
                 self.emit("}", depth)
             else:
index af9deedc4fc9076c402831c3f3ccaff822501168..7a0f52825c56f1484e15dda1cc61d6ad64013bb0 100644 (file)
@@ -1503,8 +1503,8 @@ Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
 }
 
 expr_ty
-Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno, int
-        col_offset, PyArena *arena)
+Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
+        int col_offset, PyArena *arena)
 {
         expr_ty p;
         if (!left) {
@@ -2503,7 +2503,7 @@ ast2obj_expr(void* _o)
                         value = PyList_New(n);
                         if (!value) goto failed;
                         for(i = 0; i < n; i++)
-                                PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)(int)asdl_seq_GET(o->v.Compare.ops, i)));
+                                PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
                 }
                 if (!value) goto failed;
                 if (PyObject_SetAttrString(result, "ops", value) == -1)
index 225df6e7612c22b3522eb44a687fedd7d1e1d3db..416b293e6dbb5e9422d626c52cbef900f385b9e6 100644 (file)
@@ -8,7 +8,24 @@ asdl_seq_new(int size, PyArena *arena)
        size_t n = sizeof(asdl_seq) +
                        (size ? (sizeof(void *) * (size - 1)) : 0);
 
-    seq = (asdl_seq *)PyArena_Malloc(arena, n);
+       seq = (asdl_seq *)PyArena_Malloc(arena, n);
+       if (!seq) {
+               PyErr_NoMemory();
+               return NULL;
+       }
+       memset(seq, 0, n);
+       seq->size = size;
+       return seq;
+}
+
+asdl_int_seq *
+asdl_int_seq_new(int size, PyArena *arena)
+{
+       asdl_seq *seq = NULL;
+       size_t n = sizeof(asdl_seq) +
+                       (size ? (sizeof(int) * (size - 1)) : 0);
+
+       seq = (asdl_seq *)PyArena_Malloc(arena, n);
        if (!seq) {
                PyErr_NoMemory();
                return NULL;
index e8250425352b3eccda44d3cf15eb04e5336991d8..0b3b485465c516acedc09dec94a51b1a11e8598b 100644 (file)
@@ -1600,8 +1600,9 @@ ast_for_expr(struct compiling *c, const node *n)
             }
             else {
                 expr_ty expression;
-                asdl_seq *ops, *cmps;
-                ops = asdl_seq_new(NCH(n) / 2, c->c_arena);
+                asdl_int_seq *ops;
+               asdl_seq *cmps;
+                ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
                 if (!ops)
                     return NULL;
                 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
@@ -1609,7 +1610,6 @@ ast_for_expr(struct compiling *c, const node *n)
                     return NULL;
                 }
                 for (i = 1; i < NCH(n); i += 2) {
-                    /* XXX cmpop_ty is just an enum */
                     cmpop_ty newoperator;
 
                     newoperator = ast_for_comp_op(CHILD(n, i));
@@ -1622,7 +1622,7 @@ ast_for_expr(struct compiling *c, const node *n)
                         return NULL;
                    }
                         
-                    asdl_seq_SET(ops, i / 2, (void *)(Py_uintptr_t)newoperator);
+                    asdl_seq_SET(ops, i / 2, newoperator);
                     asdl_seq_SET(cmps, i / 2, expression);
                 }
                 expression = ast_for_expr(c, CHILD(n, 0));
index 1bbe73a07968bec8f8cfd7d9e3734bbceb9ae119..8b6f2f1c08e7742f8da704141c3223f282c7dbff 100644 (file)
@@ -3058,17 +3058,11 @@ compiler_compare(struct compiler *c, expr_ty e)
                VISIT(c, expr, 
                         (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
        }
-#ifdef __cplusplus
-#define CMPCAST (intptr_t)
-#else
-#define CMPCAST 
-#endif
        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(
+                       cmpop((cmpop_ty)(asdl_seq_GET(
                                                   e->v.Compare.ops, i - 1))));
                ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
                NEXT_BLOCK(c);
@@ -3079,9 +3073,7 @@ compiler_compare(struct compiler *c, expr_ty e)
        }
        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(e->v.Compare.ops, n - 1))));
        if (n > 1) {
                basicblock *end = compiler_new_block(c);
                if (end == NULL)