Commit 42e4f612 authored by Martin v. Löwis's avatar Martin v. Löwis

Introduce asdl_int_seq, to hold cmpop_ty.

parent 5701c9c1
...@@ -240,7 +240,7 @@ struct _expr { ...@@ -240,7 +240,7 @@ struct _expr {
struct { struct {
expr_ty left; expr_ty left;
asdl_seq *ops; asdl_int_seq *ops;
asdl_seq *comparators; asdl_seq *comparators;
} Compare; } Compare;
...@@ -409,7 +409,7 @@ expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno, int ...@@ -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 expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int
col_offset, PyArena *arena); col_offset, PyArena *arena);
expr_ty Yield(expr_ty value, 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); lineno, int col_offset, PyArena *arena);
expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty
starargs, expr_ty kwargs, int lineno, int col_offset, PyArena starargs, expr_ty kwargs, int lineno, int col_offset, PyArena
......
...@@ -22,7 +22,13 @@ typedef struct { ...@@ -22,7 +22,13 @@ typedef struct {
void *elements[1]; void *elements[1];
} asdl_seq; } asdl_seq;
typedef struct {
int size;
int elements[1];
} asdl_int_seq;
asdl_seq *asdl_seq_new(int size, PyArena *arena); 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_GET(S, I) (S)->elements[(I)]
#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) #define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
......
...@@ -188,6 +188,9 @@ class StructVisitor(EmitVisitor): ...@@ -188,6 +188,9 @@ class StructVisitor(EmitVisitor):
ctype = get_c_type(field.type) ctype = get_c_type(field.type)
name = field.name name = field.name
if field.seq: if field.seq:
if field.type.value in ('cmpop',):
self.emit("asdl_int_seq *%(name)s;" % locals(), depth)
else:
self.emit("asdl_seq *%(name)s;" % locals(), depth) self.emit("asdl_seq *%(name)s;" % locals(), depth)
else: else:
self.emit("%(ctype)s %(name)s;" % locals(), depth) self.emit("%(ctype)s %(name)s;" % locals(), depth)
...@@ -234,6 +237,9 @@ class PrototypeVisitor(EmitVisitor): ...@@ -234,6 +237,9 @@ class PrototypeVisitor(EmitVisitor):
name = f.name name = f.name
# XXX should extend get_c_type() to handle this # XXX should extend get_c_type() to handle this
if f.seq: if f.seq:
if f.type.value in ('cmpop',):
ctype = "asdl_int_seq *"
else:
ctype = "asdl_seq *" ctype = "asdl_seq *"
else: else:
ctype = get_c_type(f.type) ctype = get_c_type(f.type)
...@@ -681,7 +687,7 @@ class ObjVisitor(PickleVisitor): ...@@ -681,7 +687,7 @@ class ObjVisitor(PickleVisitor):
self.emit("if (!value) goto failed;", depth+1) self.emit("if (!value) goto failed;", depth+1)
self.emit("for(i = 0; i < n; i++)", depth+1) self.emit("for(i = 0; i < n; i++)", depth+1)
# This cannot fail, so no need for error handling # 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) depth+2, reflow=False)
self.emit("}", depth) self.emit("}", depth)
else: else:
......
...@@ -1503,8 +1503,8 @@ Yield(expr_ty value, int lineno, int col_offset, PyArena *arena) ...@@ -1503,8 +1503,8 @@ Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
} }
expr_ty expr_ty
Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno, int Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
col_offset, PyArena *arena) int col_offset, PyArena *arena)
{ {
expr_ty p; expr_ty p;
if (!left) { if (!left) {
...@@ -2503,7 +2503,7 @@ ast2obj_expr(void* _o) ...@@ -2503,7 +2503,7 @@ ast2obj_expr(void* _o)
value = PyList_New(n); value = PyList_New(n);
if (!value) goto failed; if (!value) goto failed;
for(i = 0; i < n; i++) 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 (!value) goto failed;
if (PyObject_SetAttrString(result, "ops", value) == -1) if (PyObject_SetAttrString(result, "ops", value) == -1)
......
...@@ -17,3 +17,20 @@ asdl_seq_new(int size, PyArena *arena) ...@@ -17,3 +17,20 @@ asdl_seq_new(int size, PyArena *arena)
seq->size = size; seq->size = size;
return seq; 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;
}
memset(seq, 0, n);
seq->size = size;
return seq;
}
...@@ -1600,8 +1600,9 @@ ast_for_expr(struct compiling *c, const node *n) ...@@ -1600,8 +1600,9 @@ ast_for_expr(struct compiling *c, const node *n)
} }
else { else {
expr_ty expression; expr_ty expression;
asdl_seq *ops, *cmps; asdl_int_seq *ops;
ops = asdl_seq_new(NCH(n) / 2, c->c_arena); asdl_seq *cmps;
ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
if (!ops) if (!ops)
return NULL; return NULL;
cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
...@@ -1609,7 +1610,6 @@ ast_for_expr(struct compiling *c, const node *n) ...@@ -1609,7 +1610,6 @@ ast_for_expr(struct compiling *c, const node *n)
return NULL; return NULL;
} }
for (i = 1; i < NCH(n); i += 2) { for (i = 1; i < NCH(n); i += 2) {
/* XXX cmpop_ty is just an enum */
cmpop_ty newoperator; cmpop_ty newoperator;
newoperator = ast_for_comp_op(CHILD(n, i)); newoperator = ast_for_comp_op(CHILD(n, i));
...@@ -1622,7 +1622,7 @@ ast_for_expr(struct compiling *c, const node *n) ...@@ -1622,7 +1622,7 @@ ast_for_expr(struct compiling *c, const node *n)
return NULL; 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); asdl_seq_SET(cmps, i / 2, expression);
} }
expression = ast_for_expr(c, CHILD(n, 0)); expression = ast_for_expr(c, CHILD(n, 0));
......
...@@ -3058,17 +3058,11 @@ compiler_compare(struct compiler *c, expr_ty e) ...@@ -3058,17 +3058,11 @@ compiler_compare(struct compiler *c, expr_ty e)
VISIT(c, expr, VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); (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++) { 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(
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);
...@@ -3079,9 +3073,7 @@ compiler_compare(struct compiler *c, expr_ty e) ...@@ -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)); 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. */ cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
cmpop((cmpop_ty)( CMPCAST asdl_seq_GET(e->v.Compare.ops,
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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment