Fix iterating over cmpop_ty lists.
This commit is contained in:
parent
bd260da900
commit
ce1d5d2527
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue