Fix iterating over cmpop_ty lists.

This commit is contained in:
Martin v. Löwis 2006-02-26 20:51:25 +00:00
parent bd260da900
commit ce1d5d2527
2 changed files with 20 additions and 7 deletions

View File

@ -609,13 +609,21 @@ class ObjVisitor(PickleVisitor):
def set(self, field, value, depth): def set(self, field, value, depth):
if field.seq: if field.seq:
# XXX should really check for is_simple, but that requires a symbol table
if field.type.value == "cmpop": if field.type.value == "cmpop":
# XXX check that this cast is safe, i.e. works independent on whether # While the sequence elements are stored as void*,
# sizeof(cmpop_ty) != sizeof(void*) # ast2obj_cmpop expects an enum
cast = "(PyObject*(*)(void*))" self.emit("{", depth)
self.emit("int i, n = asdl_seq_LEN(%s);" % value, depth+1)
self.emit("value = PyList_New(n);", depth+1)
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_%s((%s_ty)asdl_seq_GET(%s, i)));" %
(field.type, field.type, value), depth+2, reflow=False)
self.emit("}", depth)
else: else:
cast = "" self.emit("value = ast2obj_list(%s, ast2obj_%s);" % (value, field.type), depth)
self.emit("value = ast2obj_list(%s, %sast2obj_%s);" % (value, cast, field.type), depth)
else: else:
ctype = get_c_type(field.type) ctype = get_c_type(field.type)
self.emit("value = ast2obj_%s(%s);" % (field.type, value), depth, reflow=False) self.emit("value = ast2obj_%s(%s);" % (field.type, value), depth, reflow=False)

View File

@ -2216,8 +2216,13 @@ ast2obj_expr(void* _o)
if (PyObject_SetAttrString(result, "left", value) == -1) if (PyObject_SetAttrString(result, "left", value) == -1)
goto failed; goto failed;
Py_DECREF(value); Py_DECREF(value);
value = ast2obj_list(o->v.Compare.ops, {
(PyObject*(*)(void*))ast2obj_cmpop); int i, n = asdl_seq_LEN(o->v.Compare.ops);
value = PyList_New(n);
if (!value) goto failed;
for(i = 0; i < n; 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)
goto failed; goto failed;