[Python-checkins] r42581 - in python/trunk: Parser/asdl_c.py Python/Python-ast.c
martin.v.loewis
python-checkins at python.org
Sun Feb 26 21:51:28 CET 2006
Author: martin.v.loewis
Date: Sun Feb 26 21:51:25 2006
New Revision: 42581
Modified:
python/trunk/Parser/asdl_c.py
python/trunk/Python/Python-ast.c
Log:
Fix iterating over cmpop_ty lists.
Modified: python/trunk/Parser/asdl_c.py
==============================================================================
--- python/trunk/Parser/asdl_c.py (original)
+++ python/trunk/Parser/asdl_c.py Sun Feb 26 21:51:25 2006
@@ -609,13 +609,21 @@
def set(self, field, value, depth):
if field.seq:
+ # XXX should really check for is_simple, but that requires a symbol table
if field.type.value == "cmpop":
- # XXX check that this cast is safe, i.e. works independent on whether
- # sizeof(cmpop_ty) != sizeof(void*)
- cast = "(PyObject*(*)(void*))"
+ # While the sequence elements are stored as void*,
+ # ast2obj_cmpop expects an enum
+ 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:
- cast = ""
- self.emit("value = ast2obj_list(%s, %sast2obj_%s);" % (value, cast, field.type), depth)
+ self.emit("value = ast2obj_list(%s, ast2obj_%s);" % (value, field.type), depth)
else:
ctype = get_c_type(field.type)
self.emit("value = ast2obj_%s(%s);" % (field.type, value), depth, reflow=False)
Modified: python/trunk/Python/Python-ast.c
==============================================================================
--- python/trunk/Python/Python-ast.c (original)
+++ python/trunk/Python/Python-ast.c Sun Feb 26 21:51:25 2006
@@ -2216,8 +2216,13 @@
if (PyObject_SetAttrString(result, "left", value) == -1)
goto failed;
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 (PyObject_SetAttrString(result, "ops", value) == -1)
goto failed;
More information about the Python-checkins
mailing list